JWT 实现 Laravel 认证(前后端分离项目必备)

通过 composer 安装 jwt

composer require tymon/jwt-auth

添加服务提供商(Laravel 5.4或更低版本)

将服务提供者添加到配置文件中的 providers 阵列中 config/app.php,如下所示:

config/app.php

'providers' => [  
    ...  
    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
]

发布配置

运行以下命令以发布程序包配置文件:

php artisan vendor:publish –provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

现在,您应该拥有一个 config/jwt.php 文件,该文件可让您配置此软件包的基础。

生成 JWT 密钥

php artisan jwt:secret

这将使用以下方式更新您的 .env 文件 JWT_SECRET=foobar
这是将用于对令牌进行签名的密钥。具体如何发生将取决于您选择使用的算法。

更新 User 模型

首先,您需要 Tymon\JWTAuth\Contracts\JWTSubject 在 User 模型上实现,这要求您实现 getJWTIdentifier() 和方法 getJWTCustomClaims()

app/Models/User.php

<?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;

    .
    .
    .

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

注意:一定要有 implements JWTSubject(第 9 行),不要忽略了。

配置授权

注意:仅在使用 Laravel 5.2 及更高版本时,此方法才有效。
config/auth.php 文件内部,您需要进行一些更改,以配置 Laravel 使用 jwt 防护来增强您的应用程序身份验证。

config/auth.php

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

.
.
.

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

添加一些基本的身份验证路由

让我们添加一些路由,routes/api.php 如下所示:

routes/api.php

Route::group([ 'namespace' => 'Api' ], function($router) {
    $router->post('login', 'AuthController@store');
    $router->match([ 'patch', 'put' ], 'refresh', 'AuthController@update');
    $router->delete('logout', 'AuthController@destroy');
    $router->any('me', 'UserController@show');
});

创建 AuthController

我们可以通过手动或运行 artisan 命令来创建:

php artisan make:controller Api\\AuthController

app/Http/Controllers/Api/AuthController.php

<?php

namespace App\Http\Controllers\Api;

use App\Http\Requests\AuthRequest;
use App\Presenters\AuthPresenter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    protected $auth;

    public function __construct(AuthPresenter $authPresenter)
    {
        $this->auth = authPresenter;

        $this->middleware('auth:api', [
            'only' => [ 'update' ]
        ]);
    }

    public function store(AuthRequest $request)
    {
        $credentials = $request->validated();

        if ( ! $token = Auth::attempt($credentials) ) {
            return response()->json([
                'error' => '很抱歉,您的邮箱和密码不匹配。'
            ]);
        }

        return $this->auth->respondWithToken($token);
    }

    public function update()
    {
        $newToken = auth()->refresh();

        return $this->auth->respondWithToken($newToken);
    }

    public function destroy()
    {
        Auth::logout();

        return [];
    }
}

创建 AuthPresenter

app 目录下新建 Presenters 文件夹,接着在 Presenters 文件夹下新建 AuthPresenter.php 文件。

app/Presenters/AuthPresenter.php

<?php

namespace App\Presenters;

class AuthPresenter
{
    public function respondWithToken($token)
    {
        return response()->json([
            'token' => $token,
            'token_type' => 'Bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}

创建 AuthRequest

我们可以通过手动或运行 artisan 命令来创建:

php artisan make:request AuthRequest

app/Http/Requests/UserRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AuthRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => 'required|email',
            'password' => 'required'
        ];
    }
}

注意:return false 一定要改成 return true(第 16 行)。

创建 UserController

我们可以通过手动或运行 artisan 命令来创建:

php artisan make:controller Api\\UserController

app/Http/Controllers/Api/UserController.php

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function show()
    {
        $user = $this->authUser();

        return $user;
    }
}

更新 Controller

app/Http/Controllers/Controller.php

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Auth;
use Tymon\JWTAuth\Exceptions\UserNotDefinedException;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function authUser()
    {
        try {
            $user = Auth::userOrFail();
        } catch (UserNotDefinedException $e) {
            return response()->json([
                'error' => $e->getMessage()
            ]);
        }

        return $user;
    }
}

好了,下面进入测试环节。

测试环节

第一步:打开 postman
JWT 实现 Laravel 认证(前后端项目必备)

第二步:点击 左上角 的
JWT 实现 Laravel 认证(前后端项目必备)

第三步:输入信息尝试登录

  • 输入正确的数据
    JWT 实现 Laravel 认证(前后端项目必备)
    我们可以看到已经获取到了 token 参数

    {
      "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvd3d3LmFjZXdhbmdwYWkuY29tXC9hcGlcL2xvZ2luIiwiaWF0IjoxNjEyODQ4MTY1LCJleHAiOjE2MTI4NTE3NjUsIm5iZiI6MTYxMjg0ODE2NSwianRpIjoiZDdueFFPQkNNMzRsaU03eiIsInN1YiI6NywicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.xWUgBdyhi5QCVgUQQe9pE-1pRLC64WPwKGRH8bjtcuU", // token 参数
      "token_type": "Bearer", // token 类型
      "expires_in": 3600 // 有效时间(s)
    }
  • 输入错误的数据
    JWT 实现 Laravel 认证(前后端项目必备)
    我们可以看到没有获取到 token 参数

    {
      "error": "很抱歉,您的邮箱和密码不匹配"
    }

第四步:复制 token 获取已经授权的用户信息

  • 填写正确的 token 参数
    JWT 实现 Laravel 认证(前后端项目必备)
    我们可以看到用户信息已经被显示出来了
    {
      "id": 7,
      "name": "Tony",
      "email": "75692074@qq.com",
      "email_verified_at": null,
      "created_at": "2021-02-07T05:07:16.000000Z",
      "updated_at": "2021-02-07T05:07:16.000000Z"
    }
  • 填写错误的 token 参数
    JWT 实现 Laravel 认证(前后端项目必备)
    我们可以看到程序抛错了
    {
      "error": "An error occurred"
    }

好了,教程就到这里了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2天前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

反手先点个赞

3个月前 评论
Alexander- (楼主) 3个月前

先赞后看

2个月前 评论
Alexander- (楼主) 2个月前

码住 :+1:

2个月前 评论

php artisan vendor:publish –provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

应该是 --provider

2天前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!