前端實現token重新整理

2021-10-07 10:09:41 字數 2895 閱讀 8554

應用場景:在乙個管理系統中,當使用者登入進來後,我們期望使用者在操作時,不會因為token過期而被迫登出。但token是有時效的,這時候我們就需要乙個重新整理token的操作來保障使用者的登入狀態;而當使用者長時間未操作,則可以被登出。

登入,從後台獲取到token(鑑權令牌),refresh_token(重新整理token的令牌),expire_time(token的時效)。將這三個以及登入的時間點(logintime)儲存下來,以備使用。

使用者操作中,向後台傳送請求,每次請求時,將當前請求時間(currenttime)與logintime和expire_time對比,

即(currenttime-logintime)得到的時間段即將接近或超出expire_time時,使用refresh_token去重新獲取token。

注:此處需要知道的是,refresh_token與token一樣,都是有時效的。但refresh_token的時效必定長於token,這樣token即便過期了,也不會影響refresh_token。因此只要使用者在refresh_token的有效期內向後台傳送請求,token就可以一直得到重新整理。

而使用者長時間未操作,refresh_token也過期了,這時候就可以被正常登出。

使用refresh_token去重新獲取token的操作實際上就是再次進行了一次登入操作,只不過這次的引數並非賬密,而是refresh_token,

並且這個操作使用者是不知情的。每次登入獲取到的鑑權資訊都會覆蓋上一次儲存的鑑權資訊,這樣就會確保token和refresh_token一直都是最新的。

大體流程就是以上三個步驟迴圈。

// 請求***

service.interceptors.request.use(

(config: any) =>

// 登入,不校驗token

if (config.url.indexof('/login') > -1) else `

// 掛起請求

resolve(config)

} else if (res === 'pending') , 500)

} else `

clearinterval(interval)

}// 掛起請求

resolve(config)}})

refreshfun()

})return retry}},

error =>

)// 返回***

service.interceptors.response.use(

response =>

return promise.resolve(response.data)

}response.data.msg && message.error(response.data.msg)

return promise.reject(response.data.msg)

},error =>

error.response.data.msg && message.error(error.response.data.msg)

return promise.reject(error)

})export default service as axiosinstance

refreshtoken.ts

import store from '@/store'

export async function refreshtoken() = json.parse(localstorage.getitem('user_info'))

const splittime = expires_in - (currenttime - logintime) / 1000

if (splittime < 60)

const refreshtokenstatus = localstorage.getitem('refreshtokenstatus')

// 確保同一時間段內只執行一次

if (!refreshtokenstatus) )

// 請求成功,清除狀態值

localstorage.removeitem('refreshtokenstatus')

return 'success'

} else

} else

}}

登入成功,在登入介面的返回***裡記錄登入時間

登出時清除以上所有儲存的鑑權資訊

多介面併發請求,且此時token已經過期。只需要在第乙個介面裡去請求重新整理token,後面的介面先掛起,等到拿到最新的token後,更新請求頭,傳送請求。

做法:定義乙個狀態值,用來確保相近的時間段內不會重複請求重新整理token

長時間未操作,refresh_token過期,使用者登出

這是個人總結一種方式,且已經應用在實際的專案中,暫時未出現問題。其實重新整理token的方式是多種多樣的,例如另一種方式是直接在主頁面寫個定時器,定時重新整理token,這樣較為簡便,但卻不適用於本專案。因此我們需要基於實際情況選擇合適的方式 。

OAuth2 0與前端無感知token重新整理實現

如果通過oauth訪問成功,網盤就可以從qq中獲取乙個名為access token的令牌。通過該token,便可訪問qq中使用者允許訪問的資訊。oauth最主要的優點在於它是一種被廣泛認可的認證機制,並且已經實現了標準化。其中resource owner password credential模式就...

請求時token過期自動重新整理token

1.在開發過程中,我們都會接觸到token,token的作用是什麼呢?主要的作用就是為了安全,使用者登陸時,伺服器會隨機生成乙個有時效性的token,使用者的每一次請求都需要攜帶上token,證明其請求的合法性,伺服器會驗證token,只有通過驗證才會返回請求結果。3.下面進入主題,我們請求用的是a...

請求時token過期自動重新整理token

1.在開發過程中,我們都會接觸到token,token的作用是什麼呢?主要的作用就是為了安全,使用者登陸時,伺服器會隨機生成乙個有時效性的token,使用者的每一次請求都需要攜帶上token,證明其請求的合法性,伺服器會驗證token,只有通過驗證才會返回請求結果。3.下面進入主題,我們請求用的是a...