OAuth2用户; 如何在多个异步api调用期间解决过期的AccessToken问题,同时进行?

Dev*_*nny 5 multithreading asynchronous spring-security access-token oauth-2.0

我在我的应用程序中使用Spring Security Oauth2作为安全层.一切顺利,直到同时出现异步调用.

有人可以告诉我如何处理下一个案例:
1.客户端有一个已经过期的accessToken.
2.客户端对我的api进行两次并发的异步api调用(例如:Thread1,Thread2).
3. Thread1在Thread2之前收到错误:"accessToken expired".
4.通过使用refreshToken,Thread1接收一个新的accessToken = qqqqq.
5.在Thread1使用新的accessToken = qqqqq对服务器进行新调用之前,Thread2收到错误:"accessToken expired".
6.通过使用refreshToken,Thread2接收一个新的accessToken = wwwww并删除accessToken = qqqqq.
7.这里,Thread1使用accessToken = qqqqq调用服务器,该服务器不活动.
8.从理论上讲,很可能通过相互无效来循环两个线程.

我将不胜感激,谢谢.

Zim*_*oot 7

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

public class AccessToken {
  private int currentVersion;
  private String accessToken;

  private static AccessToken currentToken;

  public static synchronized AccessToken refresh(AccessToken token) {
    if(token.currentVersion == currentToken.currentVersion) {
      AccessToken newToken = // refresh token
      newToken.currentVersion = currentToken.currentVersion + 1;
      currentToken = newToken;
    }
    return currentToken;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您对客户端没有任何控制权和/或宁愿修复此服务器端,那么有几个选项:

  1. 允许客户端为每个线程使用一个访问令牌,而不是要求它们跨线程共享一个全局访问令牌.
  2. 禁止每隔5秒更新一次访问令牌.这种方式即使客户端进入刷新循环,他们仍然应该能够取得一些进展.
  3. 如果提供了正确的当前令牌,则公开一种只刷新令牌的方法,以便客户端可以有条件地更新其访问令牌(如果客户端忘记旧访问,您仍需要公开当前方法以绝对刷新令牌令牌).