【问题标题】:In OAuth 2 why is there need for an Access Token when there is the Authorization Code?在 OAuth 2 中,当有授权码时,为什么需要访问令牌?
【发布时间】:2020-06-17 17:17:13
【问题描述】:

在 OAuth 2 中,客户端应用交换访问令牌的授权代码。使用访问令牌,应用程序可以进行 API 调用。但是,我真的不明白为什么 OAuth 2 有这一步。这似乎是一个额外的步骤。

我能想到的一个原因是授权码是通过客户端的重定向调用给出的,所以它有可能被泄露,因此它是短暂的;而访问令牌是服务器到服务器的。

确实如此,但还有应用程序发送的秘密 API 密钥。那为什么授权码不能一样呢?

假设没有访问令牌,只有授权码。那么即使有人获得了授权码,如果 OAuth 服务器也检查了密钥和授权码,他们将无法做任何事情。

它应该允许 OAuth 服务器:

  1. 确保请求是由正确的应用发出的(经过身份验证)
  2. 确定授予了哪些类型的权限(授权)

【问题讨论】:

    标签: api oauth oauth-2.0 cryptography authorization


    【解决方案1】:

    在 JavaScript 客户端或在浏览器中运行的 Web 应用程序的情况下,需要能够直接获取 access_token(隐式授权类型)。因为,根据可用于保存客户端密码的选项,这些客户端并不安全。需要客户端 ID 和密钥来交换 access_token 的授权代码。

    这两种授权类型的存在是为了在实施身份验证时提供各种级别的安全性。

    如果 API 服务的资源非常敏感,那么您最多需要安全性,这是由授权代码流提供的。在此授权类型中,您在授予对资源的访问权限之前验证客户端(服务器端 API 或移动客户端)和资源所有者(用户)。 access_token 甚至不会暴露给浏览器/用户(因为被盗的令牌可以访问资源),因此提供了高度的安全性。此流程很复杂,涉及到授权服务器的更多往返行程,但提供了更高的安全性。

    如果您不需要资源上的那种安全性,您可以使用浏览器/用户可以访问令牌的隐式授权类型。此流程很简单,只需访问授权服务器一次。它不会验证客户端。无需在浏览器中保存客户端密码。

    希望这是有道理的。如果您有任何问题,请告诉我。

    谢谢你, 索玛。

    【讨论】:

    • 但是为什么基于服务器的流程需要授权码和访问令牌,我知道这是为了安全,但为什么只有“授权码”+“密钥”是不够
    • 我了解仅在客户端应用程序中您无法安全存储“密钥”。但是“访问令牌”也没有存储在正常的身份验证流程中。所以我想知道你为什么提到它。
    • 另外,请远离关于敏感数据与非敏感数据的最佳身份验证流程的讨论。我纯粹是在询问 Oauth 2 流程。
    • 可能是我的解释有点不对劲,抱歉。让我试试这个解释。密钥是每个客户端的,不能有像 access_token 这样的有效负载。使用 access_token 您可以拥有有效负载,这在您希望将与授权相关的额外信息与令牌一起传递的情况下可能会有所帮助。
    • 再次阅读规范后,看起来确实不需要“交换步骤”。由于规范没有讨论令牌验证是如何完成的以及所使用的令牌类型,可能是 JWT 用作 access_token 并且令牌验证在本地完成,而不是为每个请求访问身份验证服务器。同样,此评论没有解释为什么要执行额外的步骤。谢谢。
    猜你喜欢
    • 2011-02-22
    • 2019-06-06
    • 2021-11-03
    • 2013-02-19
    • 2015-02-24
    • 2018-09-30
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多