【问题标题】:Laravel Sanctum: How to configure the expiration date of the token?Laravel Sanctum:如何配置令牌的到期日期?
【发布时间】:2021-03-30 00:49:37
【问题描述】:

背景和需求

在我的 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 中的一些代码,并找到了Guard.php 类。

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')。此外,类SanctumServiceProvider 实例化Guard 并将以下值传递给其构造函数:config('sanctum.expiration')。但我不知道如何/在哪里定义这个配置值。也许https://laravel.com/docs/8.x/configurationconfig(['sanctum.expiration' => '1277126']);?你能确认一下吗? (但是这条线应该放在哪里?

问题

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

【问题讨论】:

    标签: laravel laravel-sanctum


    【解决方案1】:

    你可以发布 Laravel 配置:

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

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

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

    【讨论】:

      【解决方案2】:

      文档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 的更新,它会删除此修改吗(ie: 我的过期分钟数写过)?如果是,那么我应该寻找一个类似的永久解决方案(覆盖此配置文件?修改.env 文件?)。如果没有,那么没有任何问题,那就完美了。

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


      最终解决方案

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

      【讨论】:

      • 您永远不应该编辑vendor 下的内容。只需发布配置文件并在config/sanctum.php 中进行更改。见 php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
      • 我对您的答案投了反对票,因为它是错误的,并且存在将其作为解决方案的风险。在您的更新(最终解决方案)中,您有一条不存在的路径。它应该是config/sanctumphp 而不是<my_site>/laravel/sanctum/config/sanctum.php。在vendor 中编辑文件是你永远不应该考虑做的事情! vendor 文件由 composer 安装和管理。每次更新都会覆盖您的更改。所以我否决了它,并认为你应该从你的答案中删除解决方案。顺便提一句。 vendor 文件应该被你的 scm 忽略。
      猜你喜欢
      • 2021-01-14
      • 2021-11-09
      • 2020-04-15
      • 2022-09-27
      • 2019-08-30
      • 2016-04-27
      • 2021-11-27
      • 2018-01-06
      • 2017-12-01
      相关资源
      最近更新 更多