leadout/jwt

为 Laravel 简单的 JWT 认证。

v2.0.0 2024-04-04 12:19 UTC

This package is auto-updated.

Last update: 2024-09-04 13:06:09 UTC


README

run-tests workflow

一个轻量级的 JWT 守卫,适用于 Laravel。

安装

通过 composer 安装此包

composer require leadout/jwt

该包将自动注册身份验证守卫。

配置

配置此包仅通过 Laravel 原生 auth.php 配置文件中的守卫配置进行。

以下示例显示了可以传递给守卫的所有配置

<?php

return [
    // ...
    
    'guards' => [
        'my-guard' => [
            'driver' => 'jwt',
            'provider' => 'users',
            'key' => 'secret-key',
            'public_key' => 'path_to_public_key_file',
            'private_key' => 'path_to_private_key_file',
            'ttl' => 60,
            'claims' => [
                'key' => 'value'
            ]
        ]
    ]
    
    // ...
];

provider 应在身份验证配置文件中的 providers 数组中定义。

key 用于编码和解码令牌,应保密。

如果既不使用单个 key 进行编码和解码,则 public_keyprivate_key 应指向用于编码和解码令牌的公钥和私钥。

ttl 值是令牌的生命周期(分钟)。此字段可以省略。如果省略,则默认令牌生命周期设置为 60 分钟。

应添加到所有通过守卫签发的令牌中的附加声明应添加到 claims 配置中。此配置键可以省略。

用法

由于守卫完全通过 Laravel 的原生 auth 配置进行配置,因此建议仅通过 auth 管理器实例化它

$guard = auth()->guard('my-guard');

尝试认证用户

如果提供用户凭据,则可以认证用户。如果无法使用凭据认证用户,则返回 null

$token = auth()->guard('my-guard')->attempt(['email' => 'john@example.com', 'password' => 'hidden']]);

attempt 方法模仿了原生 SessionGuard 通过触发相同的事件来尝试认证用户的方式

  • 在开始尝试认证时触发 Illuminate\Auth\Events\Attempting
  • 如果尝试失败,则触发 Illuminate\Auth\Events\Failed
  • 如果尝试成功,则触发 Illuminate\Auth\Events\Validated

签发令牌

$token = auth()->guard('my-guard')->issue(User::first());

当签发令牌时,应将其返回给用户。然后,用户应将令牌作为带有如下内容的 Authorization 标头中的承载令牌传递给应用程序

Authorization: Bearer ey...

在请求中刷新令牌

$token = auth()->guard('my-guard')->refresh();

刷新的令牌将包含原始令牌的所有声明和新的生命周期。

在请求中使令牌无效

auth()->guard('my-guard')->invalidate();

当令牌被使无效时,所有使用相同令牌的后续请求都会失败。

从用户添加声明

除了通过守卫配置添加自定义声明外,还可以从用户本身添加声明到令牌。

只需将 getClaims() 方法添加到用户模型中,并返回一个声明数组即可

<?php

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    public function getClaims() : array
    {
        return [
            'key' => 'value'
        ];
    }
}