Multithreading Oauth2;如何解决在并发进行多个异步api调用期间过期的AccessToken问题?

Multithreading Oauth2;如何解决在并发进行多个异步api调用期间过期的AccessToken问题?,multithreading,asynchronous,spring-security,oauth-2.0,access-token,Multithreading,Asynchronous,Spring Security,Oauth 2.0,Access Token,我在应用程序中使用SpringSecurityOAuth2作为安全层。在并发异步调用出现之前,一切都运行良好 有人能告诉我如何处理下一个案子吗: 1.客户端的accessToken已过期。 2.客户端对我的api进行两次并发异步api调用(例如:Thread1、Thread2) 3.Thread1在Thread2之前收到一个错误:“accessToken已过期” 4.通过使用refreshToken,Thread1接收一个新的accessToken=QQQQ 5.Thread2在Thread1使

我在应用程序中使用SpringSecurityOAuth2作为安全层。在并发异步调用出现之前,一切都运行良好

有人能告诉我如何处理下一个案子吗:
1.客户端的accessToken已过期。
2.客户端对我的api进行两次并发异步api调用(例如:Thread1、Thread2)
3.Thread1在Thread2之前收到一个错误:“accessToken已过期”
4.通过使用refreshToken,Thread1接收一个新的accessToken=QQQQ
5.Thread2在Thread1使用新的accessToken=qqq对服务器进行新调用之前收到一个错误:“accessToken已过期”
6.通过使用refreshToken,Thread2接收新的accessToken=wwwww并删除accessToken=QQQ
7.这里,Thread1使用accessToken=QQQQ调用服务器,该服务器处于非活动状态
8.从理论上讲,通过使两个线程相互失效来循环两个线程是完全可能的。


谢谢你的帮助

如果您已经控制了客户端,则可以将版本号附加到访问令牌-如果线程尝试使用旧版本号刷新访问令牌,则返回当前(最近刷新的)访问令牌

公共类AccessToken{
私有版本;
私有字符串访问令牌;
私有静态AccessToken currentToken;
公共静态同步AccessToken刷新(AccessToken令牌){
if(token.currentVersion==currentToken.currentVersion){
AccessToken newToken=//刷新令牌
newToken.currentVersion=currentToken.currentVersion+1;
currentToken=newToken;
}
返回当前令牌;
}
}
如果您无法控制客户端和/或希望修复此服务器端,则有以下几个选项:

  • 允许客户端对每个线程使用一个访问令牌,而不是要求客户端在线程之间共享一个全局访问令牌
  • 禁止每(比如)5秒刷新访问令牌一次以上。这样,即使客户端运行到刷新循环中,它们也应该能够取得一些进展
  • 公开仅在提供正确的当前令牌时才会刷新令牌的方法,以便客户端可以有条件地更新其访问令牌(如果客户端忘记旧的访问令牌,您仍然需要公开当前方法以绝对刷新令牌)

  • 非常感谢你。我可以控制客户端,所以我将使用“accessToken”版本。再次感谢。我的Java已经生锈了,但在示例代码中仍然存在竞争条件,对吗?两个线程可能会看到令牌是当前版本,然后尝试进行刷新,其中一个线程会不确定地覆盖另一个线程。您是否有服务器端第二点的代码示例?