laravel 项目中JWT的实际应用(一)

马克飞 4月前 208

对于token认证,公司之前的项目中都是在一个前置行为中对token进行一个简单的缓存+数据库查询验证,这次公司项目改用laravel框架,我决定使用JWT来做token这块的生成及验证,下面记录下我的实际应用过程.

参考网站:

https://jwt-auth.readthedocs.io/en/docs/laravel-installation/

token原理

  • 认证流程
  1. 客户端发送认证信息(一般就是用户名/密码), 向服务器发送请求

  2. 服务器验证客户端的认证信息, 验证成功之后, 服务器向客户端返回一个 加密的token(一般情况下就是一个字符串)

  3. 客户端存储(cookie, session, app 中都可以存储)这个 token, 在之后每次向服务器发送请求时, 都携带上这个 token

  4. 服务器验证这个 token 的合法性, 只要验证通过, 服务器就认为该请求是一个合法的请求

JWT概述

token 只是一种思路, 一种解决用户授权问题的思考方式, 基于这种思路, 针对不同的场景可以有很多种的实现. 而在众多的实现中, JWT(JSON Web Token) 的实现最为流行.

JWT 这个标准提供了一系列如何创建具体 token 的方法, 这些缘故方法和规范可以让我们创建 token 的过程变得更加合理和效率.

比如, 传统的做法中, 服务器会保存生成的token, 当客户端发送来token时, 与服务器的进行比对, 但是 jwt 的不需要在服务器保存任何 token, 而是使用一套加密/解密算法 和 一个密钥 来对用户发来的token进行解密, 解密成功后就可以得到这个用户的信息.

这样的做法同时也增加了多服务器时的扩展性, 在传统的 token 验证中, 一旦用户发来 token, 那么必须要先找到存储这个 token 的服务器是哪台服务器, 然后由那一台服务器进行验证用户身份. 而 jwt 的存在, 只要每一台服务器都知道解密密钥, 那么每一台服务器都可以拥有验证用户身份的能力.

这样一来, 服务器就不再保存任何用户授权的信息了, 也就解决了 session 曾出现的问题.

JWT安装

项目根目录执行:

composer require tymon/jwt-auth

配置

  • 添加服务

在config/app.php文件的providers里面添加 'Tymon\JWTAuth\Providers\LaravelServiceProvider::class'

'providers' => [
  ...

  /*
   * Package Service Providers...
   */
  Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

  ...
]
  • 发布配置文件
# 这条命令会在 config 下增加一个 jwt.php 的配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
  • 生成加密密钥
# 这条命令会在 .env 文件下生成一个加密密钥,如:JWT_SECRET=foobar
php artisan jwt:secret
  • 更新用户模型

这里如果你是用的laravel默认的User,就只需要修改User模型如下;如果你是用的自定义的用户模型,除了要添加如下用户模型,你还需要去改下config/auth.php里面的providers.

config/auth.php

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class, // 这里修改你自己用户模型的位置
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
],

Models/User.php

<?php

namespace App\Models;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;

class User extends Authenticatable implements JWTSubject // 别忘了这里
{
    use Notifiable;

    // 自定义数据行创建时间和修改时间名称,不需要维护时设null
    // const CREATED_AT = null;
    // const UPDATED_AT = 'update';
    // 定义是否默认维护时间
    // public $timestamps = true;

    protected $dateFormat = 'U'; // 指定插入和取出的时间格式为到秒的时间戳
    protected $hidden = ['password']; // 定义隐藏字段
    protected $fillable = [ // 定义字段白名单,允许操作表中的哪些字段
        'nickname'
    ];
    // protected $guarded = []; // 定义字段黑名单,不允许操作表中的哪些字段
    // 格式化输出时间
    // protected function serializeDate(\DateTimeInterface $date)
    // {
    //     return $date->format('Y-m-d H:i');
    // }

    public function setPassword($password)
    {
        $this->password = Hash::make($password);
    }

    public function validatePassword($password)
    {
        return Hash::check($password, $this->attributes['password']);
    }

        // 主要需要添加下面两个方法
    /**
     * 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 并不是必须的,但是使用它们会给你的代码编写带来一点便利。我下面用的都是这两个facade

在config/app的aliases里添加如下两行

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

如果不用这两个Facade,你可以使用辅助函数auth()

auth () 是一个辅助函数,返回一个 guard,暂时可以看成 Auth Facade。

两个Facade方法和对应auth()方法用法,会在后面详情展开

  • 修改auth.php

上面我们已经有改过自定义用户模型,这里改下guards为jwt方式

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

        'api' => [
            'driver' => 'jwt', // 原来是 token 改成jwt
            'provider' => 'users',
            'hash' => false,
            ],
],
最新回复 (0)
    • 都市菜鸟网
      2
        立即登录 立即注册 
返回