首页 > 解决方案 > OAuth2:防止合法资源服务器滥用访问令牌

问题描述

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

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

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

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

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

为简单起见,我们采用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 泄漏到另一个?

标签: oauth-2.0

解决方案


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

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

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

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

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

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

最后,你声称,

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

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


推荐阅读