【问题标题】:OAuth: Should the client secret be required in the resource request?OAuth:资源请求中是否需要客户端密码?
【发布时间】:2019-08-18 00:29:59
【问题描述】:

据我了解:客户端密码在 OAuth1 中很重要,但在 OAuth2 中不再那么重要了。

但 Google 和 Twitter 等公司似乎需要客户端密码才能获得访问令牌。

从授权服务器的角度来看(例如 Google、Twitter、Github...):在这些情况下,哪些情况下推荐/(必需)客户端密钥?

  • 从授权码中获取访问令牌。
  • 使用刷新令牌获取新的访问令牌。
  • 通过访问令牌获取资源。

仅要求它通过授权码获取访问令牌就足够了,还是应该在有人使用访问令牌获取资源时也提交?


TLDR: 在我的情况下:请求“通过授权码获取访问令牌”和请求“通过以下方式获取新的访问令牌和刷新令牌”需要客户端密钥刷新令牌”。当客户端尝试通过访问令牌获取资源时,我是否还应该要求提供客户端秘密(要求它)?

【问题讨论】:

  • 在 OAuth2 中不再相关。 RFC6749
  • 客户端密码的问题在于您无法真正将其隐藏在 SPA 或移动应用程序中。你可以在这里阅读更多相关信息:oauth.com/oauth2-servers/client-registration/client-id-secret
  • 那是从 2012 年开始的,并没有说明它不是必需的。它实际上取决于授权类型。隐式登录流程不需要密码。混合登录流程需要密码。
  • @Alpha 如果您的问题与此有关,也许您应该改写您的问题,我在您的问题中看不到任何地方。您已经说过所有 Oauth2 都不需要秘密。

标签: oauth oauth-2.0 access-token refresh-token


【解决方案1】:

不,当客户端尝试通过访问令牌获取资源时,您不应该询问客户端密码。访问令牌应该足够了,但您需要对其进行验证。

【讨论】:

  • 这回答了我的问题。但我不明白为什么不需要客户端机密来通过访问令牌获取资源。如果有人窃取了访问令牌,则要求提供客户机密可以确保拥有访问令牌的人确实是客户。
  • 如果您在每个请求中都发送客户端密码,那么有人可以更轻松地窃取您的客户端密码。如果黑客获得了您两天前的访问令牌,则它不再有效,但客户端密码不会过期。
【解决方案2】:

当客户端尝试通过访问令牌获取资源时,您询问是否应该询问客户端机密。

###答案

您的问题的答案是,因为访问令牌代表授权结果本身,旨在通过应用程序授权服务器、和资源服务器,而客户端密码应该是只有应用程序授权服务器知道的密码。

我还可以告诉您,客户端密码相当于拥有用户名和密码,因此您不应将其暴露给资源服务器

使用客户端密码对请求进行身份验证,以便将临时授权码交换为访问令牌降低了攻击者截获授权码并自行使用授权码的风险。

访问令牌本身是一个短暂的令牌,因此所有可嗅探的 HTTP 访问都是使用一个将过期的令牌进行的。 Google 在其 OAuth 2 API 上使用 5 分钟到期。

此外,在授权代码授予流程中,用户永远不会看到访问令牌,降低了令牌泄露给其他人的风险

~

###深入

让我们看看oauth 2 draft

3.2.1.客户端认证

在向令牌端点发出请求时,机密客户端或其他客户端发出的客户端凭据必须按照第 2.3 节中所述向授权服务器进行身份验证。客户端身份验证用于:

  • 强制刷新令牌和授权码的绑定 到 他们被发给的客户。客户端身份验证至关重要 当授权码被传输到重定向时 不安全通道上的端点,或者当重定向 URI 具有 尚未完全注册。
  • 通过禁用客户端或 更改其凭据,从而防止攻击者滥用 被盗的刷新令牌。更改单组客户端 凭证比撤销一整套凭证要快得多 刷新令牌。
  • 实施身份验证管理最佳实践,其中 需要定期的凭证轮换。整套旋转 刷新令牌可能具有挑战性,而单个 设置客户端凭据要容易得多。

客户端在向令牌端点发送请求时可以使用“client_id”请求参数来标识自己。

在对令牌端点的“authorization_code”“grant_type”请求中,未经身份验证的客户端必须发送其“client_id”,以防止自己无意中接受用于具有不同“client_id”的客户端的代码。

这可以保护客户端免于替换身份验证代码。 (它不会为受保护的资源提供额外的安全性。)

第 2.3 节是对上一节的补充:

2.3.客户端认证

如果客户端类型是机密的,客户端和授权服务器建立适合授权服务器安全要求的客户端认证方法。 授权服务器可以接受满足其安全要求的任何形式的客户端身份验证。

机密客户端通常被颁发(或建立)一组用于向授权服务器进行身份验证的客户端凭据(例如密码、公钥/私钥对)。

授权服务器可以与公共客户端建立客户端身份验证方法。但是,授权服务器不得依赖公共客户端身份验证来识别客户端。

客户端不得在每个请求中使用一种以上的身份验证方法。

最后是关于访问令牌的第 1.4 节:

1.4。访问令牌

访问令牌是用于访问受保护资源的凭据。 访问令牌是一个字符串,表示颁发给客户端的授权。该字符串通常对客户端是不透明的。令牌代表特定的访问范围和持续时间,由资源所有者授予,并由资源服务器和授权服务器强制执行。

令牌可以表示用于检索授权信息的标识符,或者以可验证的方式自包含授权信息(即由一些数据和签名组成的令牌字符串)。为了让客户端使用令牌,可能需要额外的身份验证凭据,这些凭据超出了本规范的范围。

访问令牌提供了一个抽象层,用资源服务器可以理解的单个令牌替换不同的授权结构(例如用户名和密码)。这种抽象使得颁发访问令牌比用于获取它们的授权授予更严格,并且消除了资源服务器对了解各种身份验证方法的需要。

根据资源服务器的安全要求,访问令牌可以具有不同的格式、结构和使用方法(例如加密属性)。访问令牌属性和用于访问受保护资源的方法超出了本规范的范围,由配套规范定义。

【讨论】:

    【解决方案3】:

    OAuth2,使用客户端机密机制作为授权客户端的一种方式,以及 请求访问令牌的软件。您可能会将其视为向身份验证服务器证明客户端应用程序有权代表用户发出请求的秘密密码。 (server sided)

    所以客户端密码在某种程度上是客户端密码。为了让服务器使用客户端,它还必须发送其随附的密码,以证明它可以访问该客户端。例如:请求访问令牌的服务器端应用程序必须知道客户端密码才能获得令牌。这可以防止未经授权的恶意应用程序使用令牌获得有效的访问令牌。

    由于客户端机密的敏感性,客户端机密不会用于其他类型的流。例如,您不会在 JavaScript 或桌面应用程序中使用它们,它们都可以被反编译、检查、查看源代码、调试等。服务器在大多数情况下应该是安全可靠的,因此客户端密钥比不那么容易受到攻击它在桌面应用程序等上。

    授权码流服务器端。

    • 从授权码中获取访问令牌。
    • 使用刷新令牌获取新的访问令牌。

    我的想法是,如果您使用网络浏览器登录用户,这是客户端应用程序,我们可以相信登录是执行此操作的用户。

    如果它是一种服务器端语言,并且通信是在应用程序服务器而不是用户计算机上进行的,那么它的服务器端需要发送一个客户端密码,以验证该服务器实际上是具有访问此客户端且呼叫未被劫持。

    仍然需要客户端密钥并与 Oauth2 一起使用,它仅取决于您使用的授权类型以及其服务器端或客户端应用程序。

    来自评论

    我不明白为什么不需要客户端机密来通过访问令牌获取资源

    这实际上是一个单独的问题,也是一个很好的问题,但我会在这里解决它。

    一旦应用程序拥有访问令牌,就不会再次对其进行验证。 (除了确保它可能来自正确的权限)。资源假设如果访问令牌仍然有效,那么我仍然可以使用它,因此无需再次验证它们。这就是为什么访问令牌是短暂的,它们通常只有效一小时。行业标准认为,如果您的访问令牌被盗,黑客可以在非常有限的时间内访问它,因此几乎不会造成损害。

    【讨论】:

      【解决方案4】:

      首先,您的问题的所有答案都隐藏在RFC-6749 The OAuth 2.0 Authorization Framework中。

      您的问题:

      在哪些情况下推荐/(必需)客户端密码? 从授权码中获取访问令牌。

      请参考section 4.1.3。它告诉如果客户端是公开的而不是机密的,则不需要客户端机密。同样在section 2.1. Client Types 中,机密客户端类型被描述为:

      能够维护其凭据机密性的客户端(例如,客户端在安全服务器上实施,对客户端凭据的访问受到限制),或能够使用其他方式保护客户端身份验证。

      简而言之,Google、Twitter 或其他大公司的所有客户都是保密的。因此,在获取访问令牌时必须使用客户端 ID 和客户端密码。

      第二个问题:

      使用刷新令牌获取新的访问令牌。

      与第一个问题的答案相同。如果客户端是机密的,则需要客户端机密。

      第三个问题:

      通过访问令牌获取资源。

      不需要客户端密码,因为资源服务器使用了访问令牌。但是,授权服务器使用客户端密码对客户端进行身份验证。如果客户端拥有访问令牌,则意味着它已经过身份验证。请参考section 7. Accessing Protected Resources

      总而言之,如果您拥有访问令牌,则无需客户端密码即可访问资源。但是,如果您是机密客户端,则必须将客户端 ID 和客户端密码传递给授权服务器(Google、Twitter 等)以获取访问令牌。

      【讨论】:

        猜你喜欢
        • 2016-03-22
        • 2023-01-12
        • 2017-06-02
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 2017-11-28
        相关资源
        最近更新 更多