Laravel 5.5 使用 Jwt-Auth 实现 API多 用户、多字段认证、刷新令牌(二)

需求

本篇文章继Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证、刷新令牌(一)继续讲解分享 Jwt-Auth实现多表,多字段认证
本次博客会分4步完成,具体可点击查看详情,

  1. Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证、刷新令牌(一)。
  2. Laravel–CORS 扩展包完美解决前后端分离应用跨域请求
  3. vue+axios 拦截器实现统一token
  4. Laravel 5.5 使用 Jwt-Auth 实现 API多 用户、多字段认证、刷新令牌(二)

配置

在上一篇 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' => '退出成功']);
    }
}

结下了就是测试阶段,测试结果大家去试试吧,本人就去测试了,因为本人现在项目中正在使用这套逻辑,如果有什么不对的地方,还希望大佬看到了,多多指出,谢谢您的观看

你可能感兴趣的:(laravel)