現在的專案使用了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 ...