Laravel 5.7 安装 Json Web Tokens (tymon/jwt-auth)
发布时间 2019年3月30日 • 2 分钟 读完 • 236 字Laravel-5.7-安装-Json-Web-Tokens-tymon-jwt-auth
本文介绍 Laravel 5.7 框架集成 jwt 操作指南,在官方的 {% link wiki https://github.com/tymondesigns/jwt-auth/wiki/Installation[external] [wiki] %} 中也有介绍,是使用的0.5.*版本,本文使用的jwt-auth是1.0.0-rc.3版本,切记使用此扩展包的版本不同,集成也会稍有不同,否则你会得到意想不到的问题,根据自己 laravel版本不同使用jwt-auth版本建议如下:
| Laravel version | jwt-auth version |
|---|---|
4.* | 0.3.* 0.4.* |
5.* && <5.5 | 0.5.* |
5.* | 1.0.* |
将扩展包添加到composer.json,添加如下代码
“require”: {
...
“tymon/jwt-auth”: “1.0.0-rc.3”
}然后通过命令更新Composer命令如下
composer update创建jwt secret秘钥
php artisan jwt:secrettip:会在
.env末尾行追加一行配置记录JWT_SECRET=xxxxxx
发布 jwt 配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"tip:会在项目的
config目录中新增一个jwt.php的配置文件
打开config/app.php并在aliases数组中添加以下行
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,打开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个方法,添加如下代码
public function getJWTIdentifier() {
return $this->getKey();
}
public function getJWTCustomClaims() {
return [];
}打开config/auth.php并将 guards 中键为api的驱动(driver)改为jwt(默认为:token)代码如下:
'guards' => [
...
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],通过artisan创建AuthController控制器
php artisan make:controller AuthController在控制器中AuthController添加如下登录获取Token的代码,
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', 'AuthController@login');添加一行测试数据email:test@test.com、password:secret,PostMan 测试截图如下:

添加jwt.auth中间件,保护你的路由,事例代码如下:
Route::middleware('jwt.auth')->get('users', function () {
return auth('api')->user();
});添加Authorization: Bearer {token}到请求(header)头,PostMan 测试截图如下:

打开文件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']);
}
}End :)