【laravel】基于jwt实现用户认证

安装及基础配置

使用 composer 安装

# 建议使用1.0以上版本 composer require tymon/jwt-auth 1.*@rc

进行一些配置

有些文档会说要添加 Tymon\JWTAuth\Providers\LaravelServiceProvider::class ,这只在 Laravel 5.4 及如下版本是必要的,更新的 Laravel 版本无需添加。php

还有一些文档说要添加 Tymon\JWTAuth\Providers\JWTAuthServiceProvider 这是好久之前的 JWT 版本的(大概0.5.3 之前的版本)。laravel

发布配置文件

# 这条命令会在 config 下增长一个 jwt.php 的配置文件 php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

生成加密密钥

# 这条命令会在 .env 文件下生成一个加密密钥,如:JWT_SECRET=foobar php artisan jwt:secret

更新你的模型

若是你使用默认的 User 表来生成 token,你须要在该模型下增长一段代码git

<?php namespace App; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements JWTSubject    # 这里别忘了加
{ use Notifiable; // Rest omitted for brevity

    /** * 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 []; } }

注册两个 Facade

这两个 Facade 并非必须的,可是使用它们会给你的代码编写带来一点便利。github

config/app.phpweb

'aliases' => [ ...
        // 添加如下两行
        'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth',
        'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory', ],

若是你不使用这两个 Facade,你可使用辅助函数 auth()json

auth() 是一个辅助函数,返回一个guard,暂时能够当作 Auth Facade。api

能够参考这篇文章——Laravel 辅助函数 auth 与 JWT 扩展详解安全

// 若是你不用 Facade,你能够这么写
auth('api')->refresh(); // 用 JWTAuth Facade
JWTAuth::parseToken()->refresh();

两个 Facede 经常使用可以使用方法,能够看文章后面的附录。session

 修改 auth.php

config/auth.phpapp

'guards' => [ 'web' => [ 'driver' => 'session',
        'provider' => 'users', ],

    'api' => [ 'driver' => 'jwt',      // 原来是 token 改为jwt
        'provider' => 'users', ], ],

注册一些路由

注意:在 Laravel 下,route/api.php 中的路由默认都有前缀 api

Route::group([ 'prefix' => 'auth' ], function ($router) { Route::post('login', 'AuthController@login'); Route::post('logout', 'AuthController@logout'); Route::post('refresh', 'AuthController@refresh'); Route::post('me', 'AuthController@me'); });

建立 token 控制器

php artisan make:controller AuthController

AuthController

值得注意的是 Laravel 这要用 auth('api') ,至于为何,我另外一篇关于 JWT 扩展详解的文章里有讲

<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; class AuthController extends Controller { /** * Create a new AuthController instance. * 要求附带email和password(数据来源users表) * * @return void */
    public function __construct() { // 这里额外注意了:官方文档样例中只除外了『login』 // 这样的结果是,token 只能在有效期之内进行刷新,过时没法刷新 // 若是把 refresh 也放进去,token 即便过时但仍在刷新期之内也可刷新 // 不过刷新一次做废
        $this->middleware('auth:api', ['except' => ['login']]); // 另外关于上面的中间件,官方文档写的是『auth:api』 // 可是我推荐用 『jwt.auth』,效果是同样的,可是有更加丰富的报错信息返回
 } /** * Get a JWT via given credentials. * * @return \Illuminate\Http\JsonResponse */
    public function login() { $credentials = request(['email', 'password']); if (! $token = auth('api')->attempt($credentials)) { return response()->json(['error' => 'Unauthorized'], 401); } return $this->respondWithToken($token); } /** * Get the authenticated User. * * @return \Illuminate\Http\JsonResponse */
    public function me() { return response()->json(auth('api')->user()); } /** * Log the user out (Invalidate the token). * * @return \Illuminate\Http\JsonResponse */
    public function logout() { auth('api')->logout(); return response()->json(['message' => 'Successfully logged out']); } /** * Refresh a token. * 刷新token,若是开启黑名单,之前的token便会失效。 * 值得注意的是用上面的getToken再获取一次Token并不算作刷新,两次得到的Token是并行的,即两个均可用。 * @return \Illuminate\Http\JsonResponse */
    public function refresh() { return $this->respondWithToken(auth('api')->refresh()); } /** * Get the token array structure. * * @param string $token * * @return \Illuminate\Http\JsonResponse */
    protected function respondWithToken($token) { return response()->json([ 'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth('api')->factory()->getTTL() * 60 ]); } }

 使用 token

有两种使用方法:

  • 加到 url 中:?token=你的token
  • 加到 header 中,建议用这种,由于在 https 状况下更安全:Authorization:Bearer 你的token

添加中间件保护的就须要使用 token进行访问

可使用的中间件有 auth、auth:api、jwt.auth、jwt.refresh、jwt.check、jwt.renew

关于这些中间件之间有什么差异,能够看另外一篇文章:Laravel 辅助函数 auth 与 JWT 扩展详解

参考文档

相关文章
相关标签/搜索