安裝 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個方法:
/**
* 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
並將 api
的 driver
更改為 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 協議》,轉載必須註明作者和本文連結