最近將統一身份認證授權中心發布上線,沒曾想一個星期后出了問題:突然所有用戶陸續全部下線,需要重新登錄業務系統。
趕緊檢查相關日志,發現居然是RefreshToken失效了,排查代碼結果是Redis中的RefreshToken全部到期清除。。。
我就奇了怪了,明明將 RefreshTokenExpiration 設置為 Sliding ,只要用戶持續訪問系統,登錄授權就會一直續期啊。

為什么Sliding模式下,RefreshToken的生命周期還是在7天后就過期了?我又是翻官方文檔又是翻源碼,一點一點的了解到了真相:
1、RefreshToken生命周期有2種模式,Absolute固定周期和Sliding滑動周期,前者到指定時間就會過期,后者則每次刷新Token時會延期
2、注意,這里有個容易忽視的點:The lifetime will not exceed AbsoluteRefreshTokenLifetime,即RefreshToken生命周期不會超過Absolute的生命周期!
3、而之前由於一些原因,我給Absolute和Sliding都設置為7天,這意味着7天后RefreshToken必將過期,滑動周期不會生效!
4、所以在發布上線的7天后,所有RefreshToken過期失效,刷新Token的請求都校驗不通過。。。
解決方法,根據官方文檔,將Absolute的生命周期設置為0,第2點規則就不會生效:

分析ids4的源碼邏輯確實如此,本地也驗證通過:

日志級別調到DEBUG,可以看到詳細記錄,當AbsoluteRefreshTokenLifetime>0時,會將周期重置為604800s即7天(注意是從RefreshToken創建日期開始算起):