OAuth2:防止合法资源服务器滥用访问令牌

时间:2018-09-04 13:23:29

标签: oauth-2.0

考虑到多服务设置,其中一个授权服务器(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",
}

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

也许RFC不考虑这种用例。是否有任何最佳或通用做法,如何防止访问令牌从一个RS泄漏到另一个RS?

1 个答案:

答案 0 :(得分:1)

从OAUth规范的角度来看,您必须使用scope来定义访问令牌的预期受众。定义为跟随(reference

  

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

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

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

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

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

最后,您声称

  

如果我们两个RS都具有一个访问令牌,并且向RS1发送访问令牌,则RS1将能够使用此访问令牌向RS2进行呼叫

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