gpt4 book ai didi

multithreading - Oauth2;如何解决同时进行的多个异步 api 调用期间 AccessToken 过期的问题?

转载 作者:行者123 更新时间:2023-12-03 12:43:52 24 4
gpt4 key购买 nike

我在我的应用程序中使用 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. 理论上,很有可能通过使彼此无效来循环两个线程。

我将不胜感激任何帮助,谢谢。

最佳答案

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

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;
}
}

如果您对客户端没有任何控制权和/或希望修复此服务器端,则有几个选项:
  • 允许客户端每个线程使用一个访问 token ,而不是要求它们跨线程共享一个全局访问 token 。
  • 禁止每 5 秒刷新一次以上访问 token 。这样,即使客户端遇到刷新循环,他们仍然应该能够取得一些进展。
  • 公开一个方法,如果提供了正确的当前 token ,则该方法只会刷新 token ,以便客​​户端可以有条件地更新其访问 token (您仍然需要公开当前方法以绝对刷新 token ,以防客户端忘记旧访问 token )。
  • 关于multithreading - Oauth2;如何解决同时进行的多个异步 api 调用期间 AccessToken 过期的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30506983/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com