2 回答

TA貢獻1827條經(jīng)驗 獲得超9個贊
當您創(chuàng)建令牌和刷新令牌時,兩者都應具有一個到期日期,例如:
return new Token()
{
ClientId = clientId,
EmployeeId = userId,
Value = GenerateRefreshToken(),
CreatedDate = DateTime.UtcNow,
ExpirationDate = <you decide>
};
在每個請求上,您都應該通過比較日期來檢查令牌是否過期。如果已過期,則可以使用保持用戶身份驗證。最終,您甚至無法使刷新令牌過期,因為它必須由您的應用程序安全地存儲。
刷新令牌和短期令牌背后的想法是,如果令牌被泄露,黑客只需要說10分鐘,他就需要refresh_token來生成一個新令牌。

TA貢獻1813條經(jīng)驗 獲得超2個贊
最佳實踐要求刷新令牌只能使用一次,并且每次使用新令牌時都應該發(fā)行一個。再次嘗試使用舊的令牌應視為被盜令牌-該用戶的所有未使用令牌均應失效,并且任何新的訪問嘗試均需要完整登錄。
當兩個會話共享一個公共的刷新令牌時(例如,當在瀏覽器中打開兩個選項卡并且該令牌存儲在僅HTTP的cookie中時),就會發(fā)生競爭狀態(tài)。當出現(xiàn)兩個會話使用相同的刷新令牌同時嘗試刷新的情況時,服務器的第一個會話將獲得有效的新令牌,但是第二個會話發(fā)現(xiàn)其令牌現(xiàn)在無效并被注銷。
如OP所述,可以使用諸如忙碌標志之類的機制在前端解決此問題,以便必須先完成第一次刷新,然后才能進行第二次刷新。
在后端,您可以使用一種機制,允許刷新令牌在完全失效或刪除之前的很短時間內(nèi)(僅幾秒鐘)被重用。
添加回答
舉報