Laravel 拉维圣殿如何使代币过期?

Laravel 拉维圣殿如何使代币过期?,laravel,laravel-sanctum,Laravel,Laravel Sanctum,当我运行$user->currentAccessToken()->delete()时令牌过期,Auth::check()变为false,这是预期的结果 但是,当我转到个人访问令牌表时,令牌仍然存在。没有软删除字段。既然令牌过期了,Sanctum怎么办?我查看了Sanctum的源代码,它似乎是一个守卫在处理它 if (! $accessToken || ($this->expiration && $

当我运行
$user->currentAccessToken()->delete()时令牌过期,
Auth::check()
变为
false
,这是预期的结果


但是,当我转到
个人访问令牌
表时,令牌仍然存在。没有软删除字段。既然令牌过期了,Sanctum怎么办?

我查看了Sanctum的源代码,它似乎是一个守卫在处理它

      if (! $accessToken ||
                ($this->expiration &&
                 $accessToken->created_at->lte(now()->subMinutes($this->expiration))) ||
                ! $this->hasValidProvider($accessToken->tokenable)) {
                return;
            }
这意味着验证令牌过程如下所示:

  • 检查数据库中是否存在令牌
  • 检查令牌创建日期是否未超过过期时间
  • 检查可标记模型是否与提供程序的模型类型匹配
  • 检查可标记模型是否支持API标记
一旦失败,它就是拒绝请求。不删除令牌

但是,删除令牌是手动撤销令牌的方法

您可以通过使用HasApiTokens特性提供的令牌关系从数据库中删除令牌来“撤销”令牌:


您可以在config/sanctum.php数组节点中设置过期时间

/*
|--------------------------------------------------------------------------
| 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' => 60 * 24 * 7,

sanctum.php
内部
'expiration'=>null,
您可以set@KamleshPaul,是的,但这是基于创建时间,而不是上次使用的时间,这并不理想。如果用户持续使用该应用程序,那么使用1天到期令牌有什么意义?如果您正在使用它并突然注销,则不是一个好的用户体验谢谢!但这就是问题所在,当我执行
$user->currentAccessToken()->delete()时它确实会撤销令牌,但不会从数据库中删除它。我想我的问题是,Sanctum怎么知道代币已经过期了?@Inigoc我想这是我回答的问题,Sanctum无论如何都不会修改代币,但在代币过期时拒绝了请求。删除方法不起作用的原因很可能是某些配置错误。您是否在用户模型中添加了trait
HasApiTokens
?您好@PatricNox,那么Sanctum如何检查它是否过期?假设sanctum配置文件中的过期为null,我使用
$user->currentAccessToken()->delete()手动使其过期;世界上没有什么比“过期”更好的了DB@InigoEC如果删除该令牌,它将作为已撤销的令牌处理。否则,默认情况下,即使记录已过期,该记录仍将存在。Sanctum将过期时间与创建的_at字段进行比较,而不是过期的_at。在哪里定义了过期时间?