浅谈利用Laravel的JWT实现token登录

2023-07-13PHP语言

一、Token和JWT

1、什么是Token

token 通过一次登录验证,得到一个鉴权字符串,以后带着这个鉴权字符串进行后续操作,这样就可以解决每次请求都要带账号密码的问题,而且也不需要反复使用账号和密码,安全方便。

2、什么是JWT

JWT 全称 JSON Web Tokens ,是一种规范化的 token。可以理解为对 token 这一技术提出一套规范。

二、准备

1、安装JWT

我们采用composer安装,首先我们进入项目目录下面执行composer命令(不懂composer的可以学习composer安装方法)。

composer require tymon/jwt-auth

2、新建jwt.confg文件

使用以下命名在项目的config文件中新建jwt.confg 文件。

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

3、生成密匙

php artisan jwt:secret

三、用户模型

利用Laravel框架开发用户模型代码,需要在用户模型里面使用implements实现对应的接口类。然后实现接口类中的方法,因为interface类的特性,我们在子类中必须实现它的方法。代码如下:

<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
  use HasApiTokens, HasFactory, Notifiable;
  protected fillable = [
    'name',
 'email',
 'password'
  ];
  public function getJWTIdentifier()
  {
    return $this->getKey();
  }
  public function getJWTCustomClaims()::array
  {
    return [];
  }
}

四、授权配置

打开配置文件 config/auth.php,执行下面操作。

1)把guards的key改为api,默认验签为api

2)把driver改为jwt

3)provider可以自己取名,我这里取名users因为是user表为用户表,方便维护

4)文件往下的providers中定义我们刚刚guards中命名的provider的字段

5)在providers中的driver中本次取用的是模型eloquent验证,这个根据自身需要

6)model为我们用户的模型命名空间

'guards'=>[
  'api'=>[
    'driver'=>'jwt',
 'provider'=>'users'
  ]
],
'providers'=>[
  'users'=>[
    'driver'=>'eloquent',
 'model'=>app\Models\User::class
  ]
],

五、登录

新建一个AuthController控制器并创建login方法。

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
class AuthController extends Controller
{
  public function login(): JsonResponse
  {
    $credentials = request(['email', 'password']);
    if (! $token = auth()->guard('api')->attempt($credentials)) {
      return response()->json(['error' => 'Unauthorized'], 401);
    }
    return response()->json([
      'access_token' => $token,
      'token_type' => 'bearer',
      'expires_in' => auth()->factory()->getTTL() * 60
    ]);
  }
}

token保存到数据库中,用户下次请求带上token,服务器验证数据库中的token实现用户登录。

版权声明:本文为老张的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.webppp.com/view/laravel_jwt_token.html