我正在为我的移动应用程序使用OAuth2授权机制来访问我的资源服务器 . 我已经定义了具有其秘密的客户端,名称 mobile_client
并使用授权代码授予来获取刷新令牌 . 我还有一个用户 user@app.pl
在两部手机上使用我的应用程序 . 我注意到令牌窃取的问题 .
场景如下所示:
+---------------+
(Phone 1)----------- Refresh Token1----------->| Authorization |
(Phone 1)<--- Access Token1+Refresh Token2-----| Server |
+---------------+
+----------+
(Phone 1)---- Access Token1 ---->| Resource |
(Phone 1)-- Protected Resource --| Server |
+----------+
+---------------+
(Phone 2)---------- Refresh Token2 ----------->| Authorization |
(Phone 2)<--- Access Token2+Refresh Token3-----| Server |
+---------------+
+----------+
(Phone 1)---- Access Token1 --->| Resource |
(Phone 1)<- 401 TOKEN EXPIRED! | Server |
+----------+
它看起来像电话1上的 user@app.pl
,而电话2从我的授权服务器收到相同的刷新令牌,用于具有相同应用和用户名的呼叫 . 这最终导致第二次呼叫刷新了电话1上的访问令牌 .
这是授权服务器的正确行为吗?
我使用Spring Security Oauth2 2.3.3.RELEASE和Spring Security 5.1.0.RELEASE
Edit
正如我在Google oauth2规范中看到的那样,它们为每个用户提供了更多的刷新令牌,因此应该在Spring中以某种方式配置它 .
目前每个客户端的每个用户帐户限制为50个刷新令牌 . 如果达到限制,则创建新的刷新令牌会自动使最旧的刷新令牌无效而不会发出警告 .
1 回答
假设您使用从相同授权代码创建的刷新令牌创建访问令牌,我会说这是预期的情况,因为在刷新访问令牌时撤销旧访问令牌可确保安全性 .
您是否尝试过使用来自2种不同授权码的访问令牌?