1. 程式人生 > >Laravel基於類庫Firebase/php-jwt 的JWT加密實現

Laravel基於類庫Firebase/php-jwt 的JWT加密實現

  1. 安裝類庫

     composer require firebase/php-jwt

  2.登入介面。

引入類庫(use Firebase\JWT\JWT; )->查詢資料庫使用者名稱、密碼正確->生成Token並返回

public function login(Request $request)
    {
        $user_name = $request->get('username','');
        $password = $request->get('password','');
        $user = Users::where(['username' => $user_name,'password' => $password])->first();
        if(!$user)
        {
            return response()->json('使用者名稱或密碼錯誤!');
        }
        unset($user['password']);
        //登入成功token
        $token = $this->getJWTToken($user);
        cache('user-'.$user['id'],$user);
        return response()->json(['token' => $token]);
    }

    public function getJWTToken($value)
    {
        $time = time();
        $payload = [
            'iat' => $time,
            'nbf' => $time,
            'exp' => $time+7200,
            'data' => [
                'id' => $value['id'],
                'username' => $value['user_name']
            ]
        ];
        $key =  env('JWT_SECRET');
        $alg = 'HS256';
        $token = JWT::encode($payload,$key,$alg);
        return $token;
    }

配置路由:

Route::post('/login', 'Auth\LoginCon[email protected]');

結果如下:

3.建立驗證token是否合法的中介軟體 php artisan make:middleware AuthToken

檔案程式碼如下:

    public function handle($request, Closure $next)
    {
        $alg =
        [
                "typ" => "JWT", //宣告型別為jwt
                "alg" => "HS256" //宣告簽名演算法為SHA256
        ];
        $jwt = $request->header('token');
        $key = env('JWT_SECRET');
        try{
            JWT::decode($jwt,$key,$alg);
        }
        catch (\Exception $e)
        {
            return response()->json('token無效:'.$e);
        }
        return $next($request);
    }

在kernel.php檔案中$routeMiddleware加入中介軟體

4.建立測試介面

路由配置:

Route::get('/user', '[email protected]')->middleware('auth.token');

用登入介面生成的token,寫入/user介面的header位置進行測試

如果token不正確,結果如下:具體的返回錯誤可以檢視類庫中的JWT.php中decode方法中返回錯誤,然後自己改寫。