繁体   English   中英

Laravel sanctum 如何使令牌过期?

[英]How does Laravel sanctum expire tokens?

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

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

可以在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,

我查看了 sanctumm 的源代码,似乎是处理它的守卫。

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

这意味着验证令牌过程如下所示:

  • 检查数据库中是否存在令牌
  • 检查 token creation_date 是否没有超过过期时间
  • 检查可标记模型是否与提供者的模型类型匹配
  • 检查可令牌模型是否支持 API 令牌

如果失败,它只是拒绝请求。 不删除令牌。

然而,删除令牌是撤销令牌的手动方式。

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

在撰写此答案时,令牌现在从数据库中删除,以便解决。

Sanctum 如何知道令牌是否过期非常简单:

  • 令牌有一个创建日期,称之为C
  • config/sanctum.php 中的配置数据有一个过期时间,称之为E
  • 你要使用令牌的当前时间是现在,称之为N

为了检查是否到期,它从C 中减去N。 如果N - C小于E ,则令牌尚未过期。 如果大于,则令牌过期。

例子:

  • 您在 5:00 AM 创建了一个令牌
  • 过期时间设置为5小时
  • 您想在上午 8:00 通过令牌访问数据

当您从 5 中减去 8 时,您会得到 3。这距离您创建令牌仅 3 小时。 不到您设置的 5 小时。

如果您在上午 11:00 访问数据,则时间范围变为 6 小时,即超过 5 小时,这意味着令牌已过期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM