vue的token刷新处理
前言
以token處理登錄的web系統(tǒng),一般會有兩個token:access-token和refresh-token。
node.js中,一般用jsonwebtoken這個模塊。
access-token,是用戶輸入登錄的賬號密碼,后臺去db驗證然后頒發(fā)的,它一般記錄在瀏覽器的cookie中,并在瀏覽器關(guān)閉時自動刪除,頁面訪問或ajax訪問會自動通過cookie傳回到后臺,后臺直接內(nèi)存中校驗,不用訪問db,所以效率高;為了在access-token泄漏后及時止損,一般access-token會設置一個有效期,如1-8小時。
access-token設置了有效期后,過期了怎么辦?為了及時止損,有效期不能設置太長,過期是一定會遇到的,比如工作狂,如果有效期設置的是8小時,他開著瀏覽器工作12小時,費力斷斷續(xù)續(xù)花了1個小時(電話多,喝咖啡尿多)打了張訂單,提交時token過期了。再比如某些大屏幕展示的頁面,可能連續(xù)幾天幾月的開著。遇到過期怎么辦?
刷新access-token過程,如何讓用戶沒感覺?思路是:發(fā)現(xiàn)access-token,自動用refresh-token去刷新,然后再自動跳到原來頁面或者自動調(diào)用一次原來的ajax。
token身份驗證機制
客戶端登錄請求成功后,服務器將用戶信息(如用戶id)使用特殊算法加密后作為驗證的標志發(fā)送給用戶(即token),當用戶下次發(fā)起請求時,會將這個token捎帶過來,服務器再將這個token通過解密后進行驗證,通過的話,則向客戶端返回請求的數(shù)據(jù);反之,則請求失敗。
token優(yōu)點
它是無狀態(tài)的,且服務器不用像傳統(tǒng)的身份認證(session)那樣需要保存會話信息,減輕了服務器的壓力。
vue的token刷新處理
在對token身份驗證機制進行一次簡單介紹后,進入正文…
一般為了安全性,token都會設置一個過期時間,在過期之后就無法請求相關(guān)接口了,這時應該怎么辦呢,是直接退出登錄嗎?
在目前公司的項目里,為了更好的用戶體驗,我們選擇手動刷新token。登錄請求成功后,會返回一個token和token過期時間,在每次請求api時,前端可以先判斷一下token是否即將過期或已過期,如果是,則請求刷新token的接口,成功替換原來的token之后才可以重新發(fā)起請求。
下面,我們直接看代碼,這是在vue的請求攔截器里進行的相關(guān)操作:
這里需要注意幾點:
1、當token即將過期或者已過期時,原則上,我們只需要有一個接口去觸發(fā)刷新token的請求即可,這里的isRefreshing 變量,就起到這樣一個監(jiān)控的作用,它相當于一把鎖,當刷新token的操作被觸發(fā)后,其他的觸發(fā)操作就被排斥在外了。
2、刷新token的接口,用到了一個另外的token(refresh_token),這也是出于安全性考慮的,并且它也有過期時間,不過這個過期時間一般都比普通token的過期時間要長,所以在上面代碼中,會發(fā)現(xiàn),我在請求攔截中優(yōu)先判斷了refresh_token是否過期,如果過期則直接退出登錄,不再進行下一步的操作。
/*判斷刷新token請求的refresh_token是否過期*/ if (util.isRefreshTokenExpired() && config.url.indexOf('admin/auth/current') === -1) {alert('刷新token過期,請重新登錄')/*清除本地保存的auth*/localStorage.removeItem('auth')window.location.href = '#/login'return }3、在觸發(fā)了刷新token的操作后,我們還需要先將其他的請求掛起,在獲取新的token之后再重新發(fā)起這些請求。
/*把請求(token)=>{....}都push到一個數(shù)組中*/ let retry = new Promise((resolve, reject) => {/*(token) => {...}這個函數(shù)就是回調(diào)函數(shù)*/subscribeTokenRefresh((token) => {config.headers.Authorization = 'Bearer ' + token/*將請求掛起*/resolve(config)}) }) return retry在刷新token請求的成功回調(diào)里執(zhí)行下面代碼,重新發(fā)起請求。
/*執(zhí)行數(shù)組里的函數(shù),重新發(fā)起被掛起的請求*/onRrefreshed(res.data.data.token)4、因為有人在評論里問util文件,應該是想知道具體怎么判斷token過期的,其實在獲得token時,是有返回一個token過期時間 ,你可以先將它先保存起來,然后在需要時,拿出來與本地時間比較即可
/*判斷token是否過期*/ function isTokenExpired() {/*從localStorage中取出token過期時間*/let expiredTime = new Date(JSON.parse(localStorage.auth).expired_at).getTime() / 1000/*獲取本地時間*/let nowTime = new Date().getTime() / 1000/*獲取校驗時間差*/let diffTime = JSON.parse(sessionStorage.diffTime)/*校驗本地時間*/nowTime -= diffTime/*如果 < 10分鐘,則說明即將過期*/return (expiredTime - nowTime) < 10*60 }總結(jié)
以上是生活随笔為你收集整理的vue的token刷新处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stylus之关键字参数(Keyword
- 下一篇: 使用validate.js实现表单数据验