【问题标题】:OAuth2: Prevent abuse of access tokens by legitimate resource serverOAuth2:防止合法资源服务器滥用访问令牌
【发布时间】:2018-09-06 12:14:19
【问题描述】:

考虑多服务设置,其中单个授权服务器 (AS) 管理对多个资源服务器 (RS) 的访问,在此示例中为 RS1 和 RS2。

如果我们对两个 RS 都有一个访问令牌,并且我们向 RS1 发送一个访问令牌,那么 RS1 将能够使用此访问令牌向 RS2 进行调用。这是我希望避免的安全威胁,尤其是在并非每个资源服务器都值得信赖的环境中。

rfc6819 提到了这个威胁和解决方案:

多服务环境中的授权服务器可以考虑 向不同的资源服务器发布具有不同内容的令牌 并在令牌中明确指出目标服务器 令牌旨在发送。

但是,我是 OAuth2 的新手,并且很难理解如何实现这一点。我知道 OAuth2 中有 scopeaudience 概念,但我没有看到不同的授权流程如何为不同的资源服务器颁发不同的访问令牌。

为简单起见,我们采用Resource Owner Password Credentials Grant

客户端执行登录以获取刷新令牌和访问令牌

GET /token
 ?grant_type=password
 &username=user
 &password=pass
 &scope=rs1 rs2

AS 回应:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"bearer",
  "expires_in":3600,
  "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
}

这里的 access_token 参数是必需的,如 RFC 所述。但它应该是什么访问令牌?一个用于 RS1 还是一个用于 RS2?如何获取其他需要的访问令牌?我应该使用刷新令牌吗?

也许 RFC 没有考虑这个用例。是否有任何最佳或常见做法来防止将访问令牌从一个 RS 泄漏到另一个 RS?

【问题讨论】:

    标签: oauth-2.0


    【解决方案1】:

    从 OAUth 规范的角度来看,您必须使用 scope 来定义访问令牌的目标受众。这定义如下(reference),

    授权和令牌端点允许客户端指定 使用“范围”请求参数的访问请求的范围。在 反过来,授权服务器使用“范围”响应参数来 通知客户端颁发的访问令牌的范围。

    当您在授权请求中(或在令牌请求中定义,具体取决于所使用的流程)时。完成此操作后,授权服务器必须发出具有请求范围的访问令牌。

    现在,当您从资源服务器(或客户端,取决于场景)验证访问令牌时,您必须验证范围值。为此,您有两种选择。

    首先是使用rfc7662定义的token introspection端点。在自省端点中,您可以获取访问令牌的范围值。

    第二个选项带有自包含访问令牌。当授权服务器发出 JWT 结构化访问令牌时,它们被标识为自包含访问令牌。 JWT 可以在其声明中包含scope 值,以便在资源服务器收到令牌时,它可以检查此值。

    最后,你声称,

    如果我们对两个 RS 都有一个访问令牌,并且我们向 RS1 发送一个访问令牌,那么 RS1 将能够使用此访问令牌向 RS2 进行调用

    当您遵循正确的验证步骤时,绝不会发生这种情况。

    【讨论】:

    • 谢谢。请问:我是否应该按范围执行授权请求,以获取不同的访问令牌?在这种情况下,我必须管理不同的刷新令牌(每个范围一个令牌)并且用户必须同意每个范围?或者是否可以对所有范围执行一次授权请求并为所有范围获取刷新令牌,然后在不同的令牌请求中使用此刷新令牌来获取不同的访问令牌?
    • @Timo 不要混淆刷新令牌的使用。刷新令牌用于更新访问令牌。如果您的客户端需要消耗两个资源(R1 和 R2),那么您可以获得两个访问令牌。为此,您可能需要发送两个授权请求。但另一方面,您也可能会获得一个可用于 R1 和 R2 的访问令牌。在这种情况下,您必须信任 R1 和 R2 不会滥用访问令牌。这一切都取决于你的
    • @Time 如果我的评论有点混乱,刷新令牌与访问令牌一起发出。当您更新访问令牌时,您将获得一个与原始授权请求中携带的范围相同的访问令牌。我不建议使用刷新令牌来更改访问令牌的范围值。而是考虑获取多个访问令牌或使用具有多个范围的访问令牌。希望这很清楚?
    • 嗨。我明白了 :) 谢谢你的帮助 :)
    猜你喜欢
    • 2020-12-29
    • 2023-02-22
    • 2016-02-03
    • 2019-05-27
    • 1970-01-01
    • 2022-08-21
    • 2020-12-10
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多