《PHP-token和refreshToken實現身份認證》

token和refreshToken實現身份認證:https://blog.csdn.net/Paulangsky/article/details/95048410

一.問題
App 安裝後,第一次啓動時需要登錄(在某些頁面提示需要登錄或者直接啓動在登錄界面)。而只要登錄成功後,就不需要每次啓動時再次登錄。不過,當你的 App 長期未啓動,再次啓動時,就需要登錄。這個是怎麼實現的?App 又是怎麼保持登錄狀態的?

二.實現思路
客戶端在登錄的時候帶上設備的設備號、appId,並將其作爲參數傳遞到服務端。服務端收到參數後,使用特定的算法(例如:AES加密算法)生成Token和refreshToken,返回給客戶端,並且保存到redis緩存數據庫中。服務端redis緩存數據庫中的Token和refreshToken設置超時時長,refreshToken超時時長大於Token超時時長,超時自動清除。客戶端後面每次發起網絡請求時服務端都要統一攔截,先取出redis緩存數據庫中該用戶對應的Token,和客戶端傳遞的Token進行比較,如果有而且匹配則放行,如果超時沒有了,客戶端則帶上refreshToken調用Token刷新接口重新刷新Token和refreshToken,刷新失敗則進行登錄認證過程。

1、客戶端使用用戶名跟密碼請求登錄,並帶上設備序列號、appId;

2、服務端收到請求,去驗證用戶名與密碼;

3、驗證成功後,服務端會簽發一個Token和一個refreshToken;

4、客戶端收到Token和refreshToken以後必須把它們存儲起來,比如放在Cookie裏或者Local Storage裏;

5、客戶端每次向服務端請求數據的時候需要帶着服務端簽發的Token;

6、服務端收到請求,就去驗證請求裏面帶着的Token,如果驗證成功,就向客戶端返回請求的數據;

7、客戶端向服務端請求數據的時候如果Token超時,就帶上refreshToken,重新調用Token刷新接口,獲取新的Token和refreshToken;

8、服務端收到刷新Token請求,就去驗證請求裏面帶着的refreshToken,如果驗證成功,就向客戶端返回新的Token和refreshToken,客戶端用新的Token請求數據;

9、如果刷新Token失敗,則重新發起登錄流程。

在這裏插入圖片描述
三.遇到的坑
1.同一用戶併發刷新Token
由於客戶端一般都是多個接口併發請求數據,當Token超時後,服務端要求客戶端刷新Token,這時候客戶端會多個請求併發刷新Token。當第一個接口刷新Token成功後,服務端的Token和refreshToken都發生了改變,導致後面的刷新請求驗證refreshToken不通過,從而刷新失敗。

解決方法:

1.客戶端控制同時只有一個接口刷新Token;

2.服務端在刷新Token的時候,只產生新的Token,refreshToken值不變,只做延時;

3.服務端產生新的Token和refreshToken,但同時保存上一個老的refreshToken,新的refreshToken和老的refreshToken在設定時間內都生效。

2.服務端已經產生了新的Token後,但併發過來的請求還在用老的Token請求數據
解決方法:

1.服務端一律返回需要刷新,讓客戶端調用刷新接口。

四.附件
https://download.csdn.net/download/paulangsky/11295578

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章