Laravel 5.7 和 JSON Web 令牌(tymon/jwt-auth) - 使用者認證

ycs77_Lucas發表於2019-02-17

安裝 jwt-auth

增加到 composer.json:

"require": {
    ...

    "tymon/jwt-auth": "1.0.0-rc.3"
}

執行更新 Composer 命令:

composer update

基本配置

生成金鑰:

php artisan jwt:secret

釋出配置檔案:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

增加到中介軟體

開啟 app/Http/Kernel.php 並在 $routeMiddleware 增加以下中介軟體:

'jwt.auth' => \Tymon\JWTAuth\Http\Middleware\Authenticate::class,
'jwt.refresh' => \Tymon\JWTAuth\Http\Middleware\RefreshToken::class,

更新使用者模型

開啟 User.php 併為模型實現 JWTSubject

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject

並在模型中新增2個方法:

更多:Jwt-auth 官方指南 - 更新使用者模型

/**
  * Get the identifier that will be stored in the subject claim of the JWT.
  *
  * @return mixed
  */
public function getJWTIdentifier()
{
    return $this->getKey();
}

/**
  * Return a key value array, containing any custom claims to be added to the JWT.
  *
  * @return array
  */
public function getJWTCustomClaims()
{
    return [];
}

設定 auth.php

開啟 config/auth.php 並將 apidriver 更改為 jwt (預設為 token):

'guards' => [
    ...
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

登入方法

在您的使用者認證控制器 (當前示例為 APILoginController) 中新增此方法:

public function login() {
    $credentials = request(['email', 'password']);

    if (!$token = auth('api')->attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
    }

    return response()->json([
        'token' => $token,
        'expires' => auth('api')->factory()->getTTL() * 60,
    ]);
}

增加路由

開啟 routes/api.php 增加登入路由:

Route::post('login', 'APILoginController@login');

增加中介軟體 jwt.auth 以保護路由:

Route::middleware('jwt.auth')->get('users', function () {
    return auth('api')->user();
});

然後將 Authorization: Bearer {token} 新增到標頭請求中。

捕獲異常

如果你想捕獲異常,可在 app/Exceptions/Handler.php 中,render 方法中捕獲錯誤:

use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;

...

if ($exception instanceof UnauthorizedHttpException) {
    $preException = $exception->getPrevious();

    if ($preException instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) {
        return response()->json(['error' => 'TOKEN_EXPIRED']);
    } else if ($preException instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException) {
        return response()->json(['error' => 'TOKEN_INVALID']);
    } else if ($preException instanceof \Tymon\JWTAuth\Exceptions\TokenBlacklistedException) {
        return response()->json(['error' => 'TOKEN_BLACKLISTED']);
   }

    if ($exception->getMessage() === 'Token not provided') {
        return response()->json(['error' => 'Token not provided']);
    }
}

以上。

原文出自:Laravel 5.7 and JSON Web Tokens (tymon/jwt-auth) — authentication
更多:Jwt-auth 官方指南

本作品採用《CC 協議》,轉載必須註明作者和本文連結
即使是一顆小星星,也會閃耀著光芒~~

相關文章