flask vue token過期的解決方案

2021-10-07 14:37:34 字數 2726 閱讀 8388

現在的專案使用了vue + flask的框架,後端flask用token來做驗證,但是會面臨乙個token過期的問題,設定過長的token過期時間或者設定乙個refresh token的時間來處理都不能滿足我這個專案的需求,我們希望的是在token即將過期的時候前端發起乙個重新整理token的請求,後端簽發乙個新的token。

後端:在首次簽發token的時候,給出token的死亡時間點以及需要重新整理的重新整理時間點,我這裡使用的是時間戳,**如下:

# 登入驗證

if not request.form:

return responseutil.response(issuccess=false, message=messageenum.missing_form.value)

form = request.form.to_dict()

username = form.get('user')

password = form.get('password')

# 服務端與客戶端時間偏差驗證

check_time = int(form.get('checktime'))

server_time = int(time.time())

if check_time > (server_time + server_client_time) or check_time < (server_time - server_client_time):

return responseutil.response(issuccess=false, message="伺服器與客戶端時間偏差超過3分鐘,請調整後再嘗試登陸!")

if not username:

return responseutil.response(issuccess=false, message=messageenum.missing_username.value)

if not password:

return responseutil.response(issuccess=false, message=messageenum.missing_password.value)

user_item = getuserapi.get(form)

if not user_item:

return responseutil.response(issuccess=false, message=messageenum.account_wrong.value)

# 簽發token

access_token = create_access_token(identity=user_item.role_id)

died_time = int(time.time()) + expire_time

refresh_time = int(time.time()) + expire_time - allow_refresh_time

data =

return responseutil.response(issuccess=true, data=data, message=messageenum.login_success.value)

前端

大概思路是在獲取token的時候將token、重新整理時間、死亡時間儲存在本地,然後用請求***在每次發起請求的時候對比一下當前時間戳與儲存的重新整理/死亡時間戳,對於重新整理時間 < 當前時間 < 死亡時間則發起重新整理token的請求,對於當前時間 > 死亡時間的跳轉到登入介面重新登入。**如下:

// 儲存登入的相關資訊

// user login

_login(, formdatas) else

resolve(res)

}).catch(error => )

})}

// 請求***

$axios.interceptors.request.use(

config => )

let token = store.getters.token

// 獲取死亡時間與重新整理時間

const diedtime = store.getters.diedtime

const refreshtime = store.getters.refreshtime

if (token) )

} else if (tmp >= diedtime) })}

config.headers.authorization = token // 請求頭部新增token

}return config

},error =>

)

# 獲取新token的後端**

class gettokenapi(resource):

@jwt_required

def get(self):

current_user = get_jwt_identity()

new_token = create_access_token(identity=current_user)

died_time = int(time.time()) + expire_time

refresh_time = int(time.time()) + expire_time - allow_refresh_time

data =

return responseutil.response(issuccess=true, data=data)

《轉》redis key過期事件實現過期提醒

redis自2.8.0之後版本提供 keyspace notifications 功能,允許客戶訂閱pub sub頻道,以便以某種方式接收影響redis資料集的事件。可能收到的事件的例子如下 所有影響給定鍵的命令。所有接收lpush操作的金鑰。所有金鑰在資料庫中過期0。因為 redis 目前的訂閱與...

jsp設定網頁過期與不過期

是如何設定頁面過期的,比如下面的 response.setheader pragma no cache response.setheader cache control no cache response.setdataheader expires 0 其中屬性cache control 告訴瀏覽器...

redid過期策略 redis高階 過期刪除策略

講到redis的過期刪除策略,就不得不說一下redis是如何判斷鍵是否過期,讓我們首先來了解下redis內部結構是如何儲存鍵與過期時間之間的關係 過期字典 在redisclient裡redisdb結構中儲存著乙個expires字典 key value 專門用來儲存過期時間,如下所示 typedef ...