【发布时间】:2019-05-25 06:33:52
【问题描述】:
我必须调用一些需要传递令牌的 api,并且需要刷新此令牌,主要问题是 - 如何以及在服务器中存储令牌的位置? 互联网中的一些解决方案告诉做某事像那样(代码可能不起作用,但想法很明显):
let myToken = { ... }
class MyService {
myFunc() {
makeHttpCall(myToken).catch(async err => {
if (err.httpCode == 401) {
let netToken = await refreshToken()
myToken = netToken;
return myFunc();
}
})
}
}
module.exports = MyService
他们告诉 nodejs 是单线程应用程序 - 所以调用之间的同步没有任何问题。我同意,
但是如果令牌已过时并且有 2 个后续调用 makeHttpCall 函数怎么办?是的,他们将一一失败
401 假设这些电话有延迟,所以订单可能是这样的:
First invocation
|
\|/
makeHttpCall Second invocation
| |
\|/ \|/
401 makeHttpCall
| |
\|/ \|/
refresh (unexpected delay here) 401
| |
| \|/
| refresh
\|/ |
writeNewToken |
| |
\|/ |
makeHttpCall |
| |
\|/ \|/
401 writeNewToken
(because token refreshed twice)
所以想法是 - 第二个 makeHttpCall 在从第二次调用收到新令牌后立即发出请求。
如何同步?如何刷新令牌并确保它没有被覆盖?
请注意,该问题与任何用户会话或 oauth 令牌无关。带有会话或签署 oauth 的解决方案不是答案
【问题讨论】:
-
一旦一个令牌被刷新,旧的就失效了。恕我直言,什么都不需要做。
-
如果有的话,就是前端做错了。
标签: javascript node.js token