Laravel Sanctum:如何配置令牌的到期日期?

Laravel Sanctum: How to configure the expiration date of the token?

背景和需求

在我的 api 路由文件中,我根据文档 (https://laravel.com/docs/8.x/sanctum#introduction) 编写了以下代码:

Route::post('/tokens/create', function (Request $request) {
    $token = $request->user()->createToken($request->token_name);
    return ['token' => $token->plainTextToken];
});

我想设置一个过期延迟,用于比较令牌的创建日期和当前检查令牌过期的日期:令牌的创建日期为 x,当前日期为 y,延迟为 d,因此如果 y > x + d.

,令牌将过期

我做了什么

所以我阅读了目录 vendor/laravel/sanctum 中的一些代码,并且找到了 class Guard.php.

class Guard.php 包含一个名为 $expiration 的对象属性,一个设置它的构造函数(除其他外),以​​及包含以下内容的 __invoke 方法到期检查:

if (! $accessToken ||
                ($this->expiration &&
                 $accessToken->created_at->lte(now()->subMinutes($this->expiration))) ||
                ! $this->hasValidProvider($accessToken->tokenable)) {
                return;
            }

如您所见,它完全符合我的要求。但是,我不知道如何为属性 $expiration.

设置我自己的值

在同一个文件中,有一些对现有配置文件的暗示,例如:config('sanctum.guard', 'web')。此外,class SanctumServiceProvider 实例化 Guard 并将以下值传递给其构造函数:config('sanctum.expiration')。但是我不知道 how/where 来定义这个配置值。也许 https://laravel.com/docs/8.x/configuration config(['sanctum.expiration' => '1277126']);?你能确认一下吗? (但是这条线放在哪里?

问题

我的问题是:在 Laravel 8 Sanctum 中,我如何为用于 Sanctum 令牌检查的变量 $expiration 设置我自己的值?我应该编辑配置文件吗?如果是,如何编辑?我应该在终端中输入配置命令吗?

文档 https://laravel.com/docs/8.x/sanctum#spa-configuration 说,对于 SPA,我们可以在文件 vendor/laravel/sanctum/config/sanctum.php 中为配置选项 SANCTUM_STATEFUL_DOMAINS 设置一个值。所以 expiration 应该是一样的。该文件确实包含以下文本:

/*
|--------------------------------------------------------------------------
| Expiration Minutes
|--------------------------------------------------------------------------
|
| This value controls the number of minutes until an issued token will be
| considered expired. If this value is null, personal access tokens do
| not expire. This won't tweak the lifetime of first-party sessions.
|
*/

'expiration' => null,

所以我想我应该修改它来设置令牌过期的分钟数。

唯一的问题是:由于此文件包含在 vendor 目录中,如果我下载 Sanctum 的更新,它是否会删除此修改(即:我写的过期分钟数)?如果是,那么我应该寻找一个类似的永久性解决方案(覆盖此配置文件?修改.env 文件?)。如果没有,那就没有问题,那就完美了。

也许 https://laravel.com/docs/8.x/configuration#accessing-configuration-values 知道做出哪个决定会很有趣。 但是,如果有人可以在评论中给我建议,那就太好了。


最终解决方案

重要编辑: 而不是 vendor/laravel/sanctum/config/sanctum.php,还有以下配置文件:<my_site>/laravel/sanctum/config/sanctum.php 所以后者应该可以毫无问题地进行编辑。我认为这是最好的解决方案。

您可以发布 Laravel 配置:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

https://laravel.com/docs/8.x/sanctum#installation

之后您可以更改 config/santum.php 中的所有配置选项。 config 中的配置文件将覆盖 vendors 默认配置。