本篇文章继Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证、刷新令牌(一)
继续讲解分享 Jwt-Auth实现多表,多字段认证
本次博客会分4步完成,具体可点击查看详情,
在上一篇 Jwt-Auth文章中,我们使用Users表作为认证表,这次我们在之前的基础上使用admins表最为后台的字段认证表
1.配置 Auth guard
在 config/auth.php 文件中,你需要将 guards/driver 更新为 jwt:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
'admin' => [
'driver' => 'jwt',
'provider' => 'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
2.新增Admin模型
php artisan make:model Models/Admin
如果需要使用 jwt-auth 作为用户认证,我们需要Admin模型,并配置模型,效果如下:
getKey();
}
/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
}
/**
* 配置Jwt-Auth验证表格的主键(默认ID)
*/
public function getAuthIdentifierName()
{
return 'id';
}
}
3.自定义认证中间件
实现效果:提供账号密码前来登录。如果登录成功,那么我会给前端颁发一个 access _token ,设置在 header 中以请求需要用户认证的路由。
1.判断Token是否存在,如果不存在直接返回401;token不存在
2.判断Token是否可用,check方法会根据guard值去查询指定的数据表,主键为你在模型中设置的值
3.Token 可用,根据你自己设置的Token可用时间,这只Token刷新时间,本人:设置Token 60分钟内可用,如果在最后10分钟内,你有操作,主动刷新Token,并在响应值中携带,返回给前端,方便前端更换
执行如下命令以新建一个中间件:
php artisan make:middleware AdminRefreshToken
中间件app\Http\Middleware\AdminRefreshToken.php代码如下:
getToken();
if(!$authToken){
return response(['code'=>401,'msg'=>'Token not provided'],401);
}
// 检测用户的登录状态,如果正常则通过
if (Auth::guard('admin')->check()) {
$admin_id = Auth::guard('admin')->payload()['sub'];
$time = Auth::guard('admin')->payload()['exp'];
//刷新Token
if(($time - time()) < 10*60 && ($time - time()) > 0){
$token = Auth::guard('admin')->refresh();
if($token){
$request->headers->set('Authorization', 'Bearer '.$token);
}else{
return response(['code'=>401,'msg'=>'The token has been blacklisted'],401);
}
// 在响应头中返回新的 token
$respone = $next($request);
if(isset($token) && $token){
$respone->headers->set('Authorization', 'Bearer '.$token);
}
return $respone;
}
//token通过验证 执行下一补操作
return $next($request);
}
return response(['code'=>401,'msg'=>'The token has been blacklisted'],401);
}
}
然后我们注册一下中间件,文件位置app\Http\Kernel.php
在路由处会使用
protected $routeMiddleware = [
'admin_refresh' => \App\Http\Middleware\AdminRefreshToken::class,
]
4.路由写法
我们在 routes/api.php 路由文件中新增几条路由来测试一下了:
Route::group(function($router) {
$router->post('login', 'AuthController@login');
$router->post('logout', 'AuthController@logout');
});
Route::middleware('admin_refresh')->group(function($router) {
$router->get('profile','AdminController@profile');
});
5.执行如下命令以新建一个控制器:
php artisan make:controller AuthController
打开此控制器,写入如下内容
[
'required',
'exists:users',
],
'password' => 'required|string|min:6|max:20',
];
// 验证参数,如果验证失败,则会抛出 ValidationException 的异常
$params = $this->validate($request, $rules);
// 使用 Auth 登录用户,如果登录成功,则返回 200 的 code 和 token,如果登录失败则返回
return ($token = Auth::guard('admin')->attempt($params))
? response(['token' => 'bearer ' . $token], 200)
: response(['error' => '账号或密码错误'], 400);
}
/**
* 处理用户登出逻辑
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
{
Auth::guard('admin')->logout();
return response(['message' => '退出成功']);
}
}
结下了就是测试阶段,测试结果大家去试试吧,本人就去测试了,因为本人现在项目中正在使用这套逻辑,如果有什么不对的地方,还希望大佬看到了,多多指出,谢谢您的观看