前端如何實現token的無感刷新

大家都知道,用戶初次打開客戶端時,只是一介平民,毫無身份特權可言。
當用戶將正確的賬號以及密碼,呈遞給服務端進行檢驗,待檢驗成功之後,服務器端便會親手打造一個名爲Token的令牌,並給予客戶端。
客戶端自此便擁有了身份,也擁有了符合身份的資源請求權限……
但,Token是有時間限制的!關於時間的設置不宜過長,這樣不夠安全。更不宜過短,這樣會讓用戶頻繁登陸,遭受吐槽!
那有沒有什麼比較好的解決方案?有,通過無感刷新token!即token在更新時用戶無感知,從而避免用戶的頻繁登陸。

關於無感刷新網上一般有三種解決方案:
  • 方案一:後端返回過期時間,前端判斷token過期時間,去調用刷新token接口
    缺點:需要後端額外提供一個Token過期時間的字段;使用了本地時間判斷,若本地時間被篡改,特別是本地時間比服務器時間慢時,攔截會失敗。
  • 方案二:寫個定時器,定時刷新Token接口
    缺點:浪費資源,消耗性能,不建議採用。
  • 方案三:在響應攔截器中攔截,判斷Token 返回過期後,調用刷新token接口
以上三種解決方案都是建立在前端調用後端刷新Token接口的基本之上的。雖然可以解決Token的時間設置問題,但是無形中又增加了前端代碼的冗餘量。比如:請求時需要增加中間變量防止多次刷新token;同時發起兩個或者兩個以上的請求時,需要藉助Promise安排Token刷新接口的調用順序。

其實Token也是需要設計的,只要設計的合理,也可大大減少後續的煩惱:
後端在創建Token時,可以將時間設置爲Token生成時間,請求過期時間,刷新token過期時間,以及總體過期時間(根據項目需求而定)。四個時間的關係:

請求時間是否在總體過期時間內,如果不在則告知前端Token異常,並讓用戶重新登陸。如果在則判斷請求時間是否過期。
請求時間一旦過期,查看時間是否在刷新token的允許時間內,如果在則重新生成token並響應給前端,前端更新Token。如果不在則告知前端Token異常,並讓用戶重新登陸。

後端實現:略
前端大體實現:

import axios from 'axios';

axios.interceptors.response.use(response => {
        // token異常
        if (response.data.code === 409) {
            removeToken();// 刪除token
            router.push('/login');
            return Promise.reject("token異常");

        } else if (response.data.code === 410) {// 服務端Token更新
            const {token} = res.data
            setToken(token);// 重置token
        }
        return response && response.data
    }
)

以上是個人對開發中使用Token的一點總結,如有敘述不當之處請指正,我將及時改正並感謝!

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