laravel 使用jwt一些坑,token過期?刷新返回前端?問題多多!

在使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章