token有點問題

晨恆父發表於2020-11-25

存在問題


token認證,生成的token過一段時間就會失效,使用者需要重新登入獲取token。使用者經常使用客戶端,使用過程中由於token到期客戶端跳轉到登入介面要求登入,這樣體驗極差。
為了解決token過期了活躍使用者要在登陸頁面重新登入的問題,我們需要token重新整理。
在介紹雙token重新整理怎麼實現之前,我們需要了解一個問題:什麼時候要使用者跳轉到重新登入頁面。token過期了就需要使用者跳轉到登入頁面重新登入?顯然不是的,如果是不活躍使用者token過期了,確實需要跳轉到登入頁面。但活躍使用者,就算token過期了,也不應該跳轉登入頁面。那什麼是活躍使用者呢?

  • 名詞解釋
  1. access_token有效時長et
  2. 活躍使用者時長為at,即使用者再一次正常操作客戶端後的at時間內都是活躍的
    若access_token有效時長為et,活躍使用者時長為at,那麼 a t ≥ e t a_t \geq e_t atet,且使用者每次正常操作客戶端後使用者活躍時間應重新整理

重新整理


第一次用賬號密碼登入伺服器後會返回兩個token:access_token和refresh_token,時效長短不一樣。前端的access_token時效過期之後,傳送時效長的refresh_token重新獲取一個短時效的token,如果都過期則需要重新登入。
refresh_token 就是用來重新整理access_token的token。活躍使用者的access_token過期了,用refresh_token獲取新的access_token即可

實現過程


  1. 使用jwt生成access_token 失效引數exp設定為 15min
  2. 使用jwt生成refresh_token 失效引數exp設定為 30 min
  3. redis 中儲存一個old_refresh_token 值為refresh_token 與 access_token 以防併發時refresh_token 與 access_token重複重新整理
  4. refresh_token 重新整理access_token時先查詢是否存在old_refresh_token。如果存在則直接使用其中的refresh_toekn、access_token;如果不存在則重新整理refresh_token 與 access_token 並儲存old_fresh_token 為新的 refresh_token與access_token

相關文章