Laravel Passport token過期后判斷refresh_token是否過期


需求:前后端分離狀態下,登錄失效(token過期)后,前端需要知道下一步是跳轉到登錄頁面還是使用refresh_token刷新token。

這就需要后端根據是否可以刷新token(refresh_token是否過期)返回不同的標識,以供前端進行下一步操作。

具體做法如下:

1、新建RefreshToken中間件,每次登陸成功后查詢是否保存了token和id的對應關系(登錄失效后無法通過token獲取對應id)

<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
use Illuminate\Support\Facades\DB;
class RefreshToken
{

    /**
     * @param $request
     * @param Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $token=$request->header('authorization');
        $has=DB::table('oauth_refresh_tokens_ids')->where('access_token',$token)->value('access_token_id');
        if(!$has){
            DB::table('oauth_refresh_tokens_ids')->insert(['access_token'=>$token,'access_token_id'=>Auth::user()->token()->id]);
        }
        return $next($request);
    }
}
View Code

2、kerne.php文件內為RefreshToken中間件分配一個key

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,       
        'refresh'=>\App\Http\Middleware\RefreshToken::class,//刷新token
    ];
View Code

3、在路由中使用RefreshToken中間件

4、重寫Authenticate中間件登錄失效后的跳轉方法redirectTo

protected function redirectTo($request)
    {

        $token=$_SERVER['HTTP_AUTHORIZATION'];
        $accessTokenId=DB::table('oauth_refresh_tokens_ids')->where('access_token',$token)->value('access_token_id');
        $RefreshTokensExpiresAt=DB::table('oauth_refresh_tokens')->where('access_token_id',$accessTokenId)->value('expires_at');
        if(strtotime($RefreshTokensExpiresAt)>strtotime(now())){
            //可刷新token
            return route('login',['code'=>402]);
        }else{
            return route('login',['code'=>401]);
        }
    }
View Code

5、新建路由

Route::get('login/{code}', function ($code) {
    return response()->json(['code'=>$code,'msg'=>'login timeout.']);
})->name('login');
View Code

實現:

1、登錄超時后refresh_token未過期時返回

{
    "code": "402",
    "msg": "login timeout."
}

2、登錄超時后refresh_token過期時返回

 

{
    "code": "401",
    "msg": "login timeout."
}

說明:雖然數據表中存了token和refresh_token的創建時間和失效時間,但是框架驗證的時候並沒有從數據表中取值,而是直接通過token計算出來,不得不說安全性是真的高。所以通過修改token過期時間來進行登錄狀態續期的辦法不可行,必須對token進行刷新。

Enjoy it !

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM