OAuth 2.0 - 授权代码流程 - 安全问题

问题描述 投票:0回答:1

我对 OAuth 2 标准中的授权代码流程有一些担忧。

客户端密钥仅用于授权 API 客户端对用户资源的访问,还是也用于对访问令牌进行签名?因为如果它用于签署访问令牌,则意味着如果 我的一个 API 消费者(客户端)在前端公开了他们的客户端密钥,这是否意味着有人可以代表其他用户来签署访问令牌,最终能够访问 那些用户资源?

我的第一个猜测是 client_secret 仅用于授权,并且访问令牌是使用另一个客户端 jwt_secret 进行签名的,该客户端 jwt_secret 被存储并且永远不会离开 oauth 后端,这是正确的吗?

我担心API使用者会泄露client_secret、授权码或其他敏感数据,甚至可能怀有恶意地利用用户授权删除其资源。

oauth-2.0 oauth authorization client token
1个回答
0
投票

阅读 RFC 6749 可能会澄清您对 OAuth 2.0 的困惑。尽管如此,让我们解决您的担忧。

客户端密钥仅用于授权 API 客户端对用户资源的访问,还是也用于签署访问令牌?

两者都不是,客户端使用客户端密码授权服务器(AS)进行自身身份验证。请记住获得授权代码授予以下必须发生

客户端通过向授权服务器 (AS) 发出授权请求来启动 OAuth 2.0 流程。
  1. 如果获得用户授权,AS 会重定向到客户端,并在 URL 查询参数中附加授权码。
  2. 客户端通过向 AS 发出令牌请求来交换
  3. 访问令牌的授权代码。
  4. 步骤 3
中,客户端需要使用客户端密钥向 AS 验证自身身份。这确保了即使未经授权的实体拦截了授权代码(例如,来自 Nginx 日志),它也无法在没有客户端密钥的情况下将其交换为访问令牌。

因此,如果客户端泄露了自己的客户端密钥,它只会损害自己,而不是 AS。如果我们假设恶意,恶意客户端将简单地使用授予它的访问令牌,就不需要任何形式的黑客攻击!

我的第一个猜测是 client_secret 仅用于授权,并且访问令牌是使用另一个客户端 jwt_secret 进行签名的,该客户端 jwt_secret 被存储并且永远不会离开 oauth 后端,这是正确的吗?

AS 授予客户端的访问令牌既不必是 JWT,也不必进行签名。 OAuth 2.0 框架没有指定令牌格式。 OAuth 2.0 实现(例如

Google

Github)使用不透明字符串作为访问令牌(即随机字符序列)。但是,在使用 JWT 时,必须对访问令牌进行签名。它使用 AS 的密钥进行签名。客户端和资源服务器都无法访问这些。然而,资源服务器可以使用AS的公钥来验证令牌。 AS 的JSON Web Key 集对所有人公开。这意味着虽然从技术上讲令牌可以由任何人颁发,但只有由授权服务器 (AS) 私钥颁发和签名的令牌才被视为有效。任何人都可以使用 AS 的公钥验证这些令牌的有效性。 我担心API消费者会泄露client_secret、授权码或其他敏感数据,甚至可能怀有恶意地利用用户授权删除其资源。

如果您授予恶意客户端对您的资源的删除访问权限,那么它可以很好地删除它们(而不必泄漏任何内容)。这就是为什么您应该只向您信任的客户授予访问权限。

© www.soinside.com 2019 - 2024. All rights reserved.