clystnet/laravel-jwt

基于 jwt-auth 包的重新颁发令牌用途的 jwt 包。这是 unisharp/laravel-jwt 包的分支。

0.4.4 2024-06-04 10:14 UTC

This package is auto-updated.

Last update: 2024-09-04 10:48:24 UTC


README

这是一个 UniSharp/laravel-jwt 包的分支

方法

如果你在项目中选择了 Tymon JWTAuth 作为 jwt 解决方案,当你尝试刷新令牌时,该包将使你交换的令牌进入黑名单(假设你的黑名单功能已启用)。所以当你的客户端面临并发使用情况时,你的请求可能会因为该请求是在你的应用程序重新更新由服务器返回的 jwt 令牌之前发送而被拒绝。此包在短时间内缓存刷新的 jwt 令牌,以确保你的客户端即使在并发情况下携带旧令牌时也能得到正确的响应。

安装

  • 通过 Composer
composer require clystnet/laravel-jwt
  • 添加服务提供者
PHPOpenSourceSaver\JWTAuth\Providers\LaravelServiceProvider::class,
Clystnet\JWT\JWTServiceProvider::class,

在 Lumen 中,请使用 PHPOpenSourceSaver\JWTAuth\Providers\LumenServiceProvider::class,

接下来,在 app.php 配置文件中,在别名数组下,你可能想添加 JWTAuth 门面。

'JWTAuth' => 'PHPOpenSourceSaver\JWTAuth\Facades\JWTAuth',
'JWTFactory' => 'PHPOpenSourceSaver\JWTAuth\Facades\JWTFactory'

最后,你将想要使用以下命令发布配置

php artisan vendor:publish --provider="PHPOpenSourceSaver\JWTAuth\Providers\JWTAuthServiceProvider"
php artisan vendor:publish --provider="Clystnet\JWT\JWTServiceProvider"

别忘了在配置文件中设置一个密钥!

$ php artisan jwt:secret

这将生成一个新随机密钥,它将用于签名你的令牌。

现在你完成了!

用法

打开你的 config/auth.php 配置文件,在任何一个你的守卫下的驱动程序下,只需添加 jwt-auth 作为你的驱动程序即可。确保你也设置了用于与数据库通信的守卫的 provider

设置守卫驱动程序

// config/auth.php
'guards' => [
    'api' => [
        'driver' => 'jwt-auth',
        'provider' => 'users'
    ],
    
    // ...
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model'  => App\User::class,
    ],
],

中间件使用

保护路由的中间件

Route::get('api/content', ['middleware' => 'laravel.jwt', 'uses' => 'ContentController@content']);

保护控制器的中间件

<?php

namespace App\Http\Controllers;

class ContentController extends Controller
{
    public function __construct() 
    {
        $this->middleware('laravel.jwt');
    }
}

此中间件将自动刷新已过期的 jwt 令牌。新的刷新 jwt 令牌将被带到响应头:Ahthorization。客户端需要用新的令牌替换你的过期 jwt 令牌。

注意:上面的示例假设你已经根据上面“设置守卫驱动程序”部分中的说明,在你的 config/auth.php 文件中设置了一个名为 api 的守卫,其驱动程序为 jwt-auth

以下用法示例假设你已经设置了你的默认守卫为使用 jwt-auth 驱动程序的守卫。

你还可以通过在调用任何方法之前用 Auth::guard('api') 前缀显式定义守卫。

示例: Auth::guard('api')->user()

尝试认证并返回令牌

// This will attempt to authenticate the user using the credentials passed and returns a JWT Auth Token for subsequent requests.
$token = Auth::attempt(['email' => 'user@domain.com', 'password' => '123456']);

通过 ID 单次认证

if(Auth::onceUsingId(1)) {
    // Do something with the authenticated user
}

通过凭证单次认证

if(Auth::once(['email' => 'user@domain.com', 'password' => '123456'])) {
    // Do something with the authenticated user
}

验证凭证

if(Auth::validate(['email' => 'user@domain.com', 'password' => '123456'])) {
    // Credentials are valid
}

检查用户是否已认证

if(Auth::check()) {
    // User is authenticated
}

检查用户是否为访客

if(Auth::guest()) {
    // Welcome guests!
}

注销认证用户

Auth::logout(); // This will invalidate the current token and unset user/token values.

通过 ID 生成 JWT 认证令牌

$token = Auth::generateTokenById(1);

echo $token;

获取认证用户

一旦用户通过中间件认证,您可以通过执行以下操作访问其详细信息

$user = Auth::user();

您也可以使用令牌本身手动访问用户信息

$user = Auth::setToken('YourJWTAuthToken')->user();

获取认证用户的 ID

$userId = Auth::id();

刷新过期令牌

尽管建议您使用包中提供的中间件来刷新,但如果您愿意,您也可以使用此方法手动刷新。

刷新请求中传入的过期令牌

$token = Auth::refresh();

刷新传入的过期令牌

Auth::setToken('ExpiredToken')->refresh();

使令牌无效

使请求中传入的令牌无效

$forceForever = false;
Auth::invalidate($forceForever);

通过手动设置使令牌无效

$forceForever = false;
Auth::setToken('TokenToInvalidate')->invalidate($forceForever);

获取令牌

$token = Auth::getToken(); // Returns current token passed in request.

获取令牌有效载荷

此方法将解码令牌并返回其原始有效载荷。

获取请求中传入的令牌的有效载荷

$payload = Auth::getPayload();

手动获取给定令牌的有效载荷

$payload = Auth::setToken('TokenToGetPayload')->getPayload();