本文介绍jwt token在laravel中的安装使用,解决token验证的问题
一、查看laravel版本选定适合自己框架的jwt版本,不同版本之间会有意想不到的惊喜(坑)
根据自己 laravel
版本不同使用jwt-auth
版本建议如下:
Laravel version | jwt-auth version |
---|---|
4.* |
0.3.* 0.4.* |
5.* && <5.5 |
0.5.* |
5.* |
1.0.*
|
以上只是参考,本人在laravel5.4也成功使用了1.0.0-rc.3版本下面详细描述下具体的安装以及使用
通过composer安装的两种方式
1>composer require tymon/jwt-auth 1.0.0-rc.3(本人使用的版本)直接在项目目录下执行该命令等待安装即可
2>打开composer.json在require中添加如下,然后执行composer update即可,但是这样会把composer.json中其他的扩展也一并更新了
"require": {
"tymon/jwt-auth": "1.0.0-rc.3"
},
将jwt加载到项目中之后进行一下配置首先
执行命令:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"该命令的含义是发布jwt的配置文件,文件位置存储在config下该文件中存储了一系列的jwt的配置例如生存时间,token刷新时间等等创建之后执行命令
php artisan jwt:secret,该命令为创建jwt secret
秘钥在,env文件中可以看到
然后在服务容器中创建jwt的服务提供者打开config/app.php在‘providers‘数组中添加
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,或者该版本指定的添加服务提供者之后在该文件下aliases中添加门面
‘JWTAuth‘ => Tymon\JWTAuth\Facades\JWTAuth::class,
‘JWTFactory‘ => Tymon\JWTAuth\Facades\JWTFactory::class,
添加门面之后在控制器中使用时可以直接 use JWTAuth;
要想使得我们每次的接口都经受token的验证可以借助中间件,要使用中间件需要在app\Http\Kernel.php文件中的
$routeMiddleware数组中添加如下:
// jwttoken 中间件
‘jwt.auth‘ => \Tymon\JWTAuth\Http\Middleware\Authenticate::class,(该中间件则按照token规则验证)
‘jwt.refresh‘ => \Tymon\JWTAuth\Http\Middleware\RefreshToken::class,(该中间件表示请求一次token就失效了)
添加好以上配置之后我们着手控制器和模型
在模型中
use Tymon\JWTAuth\Contracts\JWTSubject;class User extends Authenticatable implements JWTSubject并且添加以下方法
public function getJWTIdentifier() { return $this->getKey();}public function getJWTCustomClaims() { return [];}然后需要更改下我们的auth.php配置文件因为在路由时要指定何种验证方式
‘guards‘ => [ ... ‘api‘ => [ ‘driver‘ => ‘jwt‘, ‘provider‘ => ‘users‘, ],],更改之后路由中要这样才能生效
Route::middleware(‘jwt.auth‘)->get(‘users‘, function () { return auth(‘api‘)->user();});这样路由就能经过指定的中间件jwt.auth过滤,然后经auth(‘api)这里指定了验证方式就是对应刚刚讲到的auth.php中的配置项如果你想让token的验证信息更加温暖,那么你可以捕获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‘]); }}每一error都能自定义你自己的提示语下面是获取token的方法在控制器中使用use JWTAuth;读取到用户信息将用户信息作为参数例如
$data={‘mobile‘:12345667,‘password:2342342}
$token = JWTAuth::fromUser($data);
这样就能拿到token
如果我们想解析token可以使用
JWTAuth::user()
该方法可以将验证通过的用户信息全部提取出来
原文地址:https://www.cnblogs.com/mzli/p/10637214.html