在使用laravel時候 摒棄了自帶的Auth和passport。主要原因是項目前後端分離,後端寫api接口,另外email不做登錄選項,password和用戶信息存儲分開存。在使用JWT過程中遇到很多的坑。
坑1 不能用JWTAuth靜態調用
直接
public function xxx (JWTAuth $jwt){
$jwt->xxx;
}
這裏的JWTAuth是
use Tymon\JWTAuth\JWTAuth;
感興趣的可以看看 JWT.php 和JWTAuth.php這兩個文件
坑2 token過期自動刷新
token有兩個有效期,在config/jwt.php下面
'ttl' => env('JWT_TTL', 60),
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
這假設用戶登錄,半個月內登錄有效,那麼這裏的半個月是refresh_ttl,ttl是什麼呢?ttl是單個簽發的token有效期。
你半個月內可以有n個token,畢竟1個小時就過期,這時候過期不是真正過期,可以進行簽發新token。
看了很多文檔,大體上就寫了個refresh token的接口
其實JWT在處理時候,如果token過期,你沒有進行try catch處理,這裏會報錯的。而且前端沒有獲取到新token需要存儲。
public function tokenValidator(&$request,$jwt){
#檢測request中header頭是否帶了token
if(is_null($token = \request() ->header('authorization'))){
$this->response(400,'Authorization Failed,未攜帶Authorization');
}
#提取token中用戶數據
try{
$user = $jwt->parseToken()->toUser()->toArray();
if(! $user){
$this->response(200,'用戶不存在','');
}
}catch (TokenExpiredException $exception){
#異常處理 token過有效期,進行刷新
try{
$token = $jwt->refresh();
$access_token = 'Bearer'.$token;
$request->headers->set('Authorization',$access_token);
}catch(JWTException $exception){
#refresh 也過期,重新登錄
$this->response(400,'Authorization過期,重新登錄');
}
}
}
token如果過期,通過TokenExpiredException 可以catch到異常然後進行刷新token,刷新token又不能這時候response給前端,因爲你用戶登錄有效期沒過,這個接口得繼續往下走,那麼在request header頭裏加上這個token,後面接口使用時候就是新token,但是後面接口在返回時候又要帶上新token給前端,讓前端進行存儲。
總覺得自己寫的代碼號low