leadout / jwt
为 Laravel 简单的 JWT 认证。
v2.0.0
2024-04-04 12:19 UTC
Requires
- php: ^8.2
- firebase/php-jwt: ^6.0
- illuminate/auth: ^11.0
- illuminate/cache: ^11.0
- illuminate/http: ^11.0
- illuminate/support: ^11.0
- nesbot/carbon: ^2.0
Requires (Dev)
- laravel/pint: ^1.13
- phpunit/phpunit: ^10.4
README
一个轻量级的 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_key
和 private_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'
];
}
}