我正在使用https://github.com/p2/OAuth2通过OAuth2连接到我的应用程序的后端,它运行得相当好。
我遇到的问题是,当访问令牌过期时,多个请求同时发生,其中一些请求会失败。
可以从应用程序的不同部分触发并行请求。例如,当启动应用程序时,当前位置将发送到服务器,并下载事件列表。
要确保在第一个令牌仍在运行时不会发出第二个刷新令牌请求,最好的方法是什么?
我正在使用https://github.com/p2/OAuth2通过OAuth2连接到我的应用程序的后端,它运行得相当好。
我遇到的问题是,当访问令牌过期时,多个请求同时发生,其中一些请求会失败。
可以从应用程序的不同部分触发并行请求。例如,当启动应用程序时,当前位置将发送到服务器,并下载事件列表。
要确保在第一个令牌仍在运行时不会发出第二个刷新令牌请求,最好的方法是什么?
3条答案
按热度按时间rbl8hiat1#
查找令牌生存期并设置缓冲区,例如1-2分钟,如果令牌需要刷新,则在令牌刷新时保存所有请求之后,执行所有保存请求您可以使用DispatchQueue和DispatchWorkItem执行此操作
示例代码如下。
gkl3eglg2#
您应该将失败请求排队401.由于您没有提供用于刷新令牌的代码,我向您解释了应该如何做,并让您自己实现它:
-如果有一个请求已经执行,但未命中服务器,除非队列为空,该怎么办?
好吧,这是非常罕见的情况,但它可能会发生(已经发生了我).如果你实现它正确像我说的,不要搞砸whit的东西,如正在重试标志,它将只是刷新两次!不是真的想要,但它的罚款,它会像一个魅力.
-如果我们不想在这种罕见情况下刷新两次或更多次,该怎么办?
虽然它完全符合OAuth 2规则,但你可以这样做来防止错误:- 一旦你得到401错误(或任何你标记为auth错误),立即删除访问令牌。-任何进一步的请求将注意到没有访问令牌请求,他们可以自动和直接发送到requestQueue。-所以没有更多的请求竞争条件在所有。
-最后有任何备注吗?
如果刷新逻辑失败,请不要忘记清除队列。您也可以保留它们,并在用户再次登录时重试,但您必须将新登录用户的身份与填充队列的前一个用户的身份进行核对。
希望能有所帮助
smdncfj33#
我们使用串行队列和信号量修复了类似的问题
这里,每当调用getToken时,我们将其添加到串行队列中,并使用信号量确保一次只发送一个调用。