当前位置: 首页 > 知识库问答 >
问题:

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

冯庆
2023-03-14

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

我将感谢任何帮助,谢谢。

共有1个答案

缪晋
2023-03-14

如果您控制了客户机,那么您可以将一个版本号附加到访问令牌上--如果线程试图使用旧版本号刷新访问令牌,则返回当前(最近刷新的)访问令牌。

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

如果您对客户端没有任何控制权,并且/或者希望在服务器端修复此问题,那么有以下几个选项:

  1. 允许客户端每个线程使用一个访问令牌,而不是要求客户端跨线程共享一个全局访问令牌。
  2. 禁止每隔5秒刷新访问令牌一次以上。这样,即使客户端运行到刷新循环中,它们也应该能够取得一些进展。
  3. 公开一个方法,该方法只有在提供了正确的当前令牌时才会刷新令牌,以便客户端可以有条件地更新其访问令牌(如果客户端忘记了旧的访问令牌,您仍然需要公开当前方法以绝对刷新令牌)。
 类似资料:
  • 问题内容: 在他对以下问题的回答中:Windows的Golang行为不稳定?建议用户@distributed锁定/同步并发goroutine上对共享变量的访问。 我怎样才能做到这一点? 有关此问题的更多信息: 我获得了同时在多个goroutines 上运行的代码(带有闭包的返回函数): 看起来IO功能很费时间,结果我得到了这种输出: 它可以很好地递增,但是当它被打印时,我可以看到print + i

  • 我正在使用Python(IPython 我有一个3000个唯一ID的数组,可以从API中提取数据,一次只能使用一个ID调用API。 我希望以某种方式同时拨打3组1000个电话,以加快速度。 最好的方法是什么? 提前感谢任何帮助!

  • 有一个列表正在被两个线程同时排序和迭代。不出所料,它导致。不清楚的是错误的时间。 输出:(出现几次) 为什么当第一个线程完成时,另一个线程的迭代失败? 当两个线程分别完成排序并获得迭代器时,底层迭代器将不会改变。为什么在此阶段会导致异常?

  • (联系人和日历有不同的代币) 同步脚本: $AccesStoken是一个序列化字符串,如下所示: 我做错了什么? 有趣的是,对于联系人来说,同步一直都很好(访问令牌的属性与日历同步中的属性相同)

  • 我需要进行异步调用,并使用其中存在的一些值对同一服务进行多次调用。将这些调用的响应与第一个调用结合起来,然后返回。 例如,当我第一次调用时,我会在JSON下面看到一个ID列表。现在,我必须使用这些ID对一个服务进行多次调用,并列出它们的响应列表,然后通过在同一个JSON中添加它们将其发送到下游。 我试过使用zipWhen和 但是结果列表总是以空或空的形式出现。我们如何才能做到这一点?我是不是漏了什