2 回答

TA貢獻1798條經(jīng)驗 獲得超3個贊
剛才研究了一下源碼得到如下答案
最簡單的辦法就是使用jwt自帶的jwt.refresh路由中間件(在這之前應(yīng)該使用jwt.auth驗證了token的合法性).源代碼如下
public function handle($request, \Closure $next)
{
$response = $next($request);
try {
$newToken = $this->auth->setRequest($request)->parseToken()->refresh();
} catch (TokenExpiredException $e) {
return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
} catch (JWTException $e) {
return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
}
// send the refreshed token back to the client
$response->headers->set('Authorization', 'Bearer '.$newToken);
return $response;
}
步驟為:
parseToken()把前端傳過來的在http header中的token解析出來
refresh()函數(shù)負責(zé)依據(jù)現(xiàn)在的token生成一個新的token并把現(xiàn)在的token放到黑名單
最后將newToken寫到返回給客戶端的header中
最后我在研究源碼的時候還發(fā)現(xiàn)如果我們需要每個請求都要刷新token的話那么就用jwt.refresh這一個中間件就好,不再需要jwt.auth這個中間件了。因為產(chǎn)生新的token的時候會解析出原來token中的payload的信息,比如sub。因此也會對原始的token進行驗證。

TA貢獻1806條經(jīng)驗 獲得超5個贊
JWT 認證應(yīng)該帶上時間戳(或者其他可以表明請求獨立性的東西),每次發(fā)送請求的時候都計算一次 token,后端會拿到包含時間戳的參數(shù)列表和 token,然后根據(jù)它們也計算一個 token,如果兩邊一致,則 token 驗證通過。
因此 token 本身就是要每次都重新計算一次的,你在前端存儲 token 是沒有太大價值的,當(dāng)然可以用于記錄日志,但這并沒有太多意義。
- 2 回答
- 0 關(guān)注
- 2689 瀏覽
添加回答
舉報