You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旧版Passport无法在生成后1秒内验证新版Passport生成的Token

问题根因

这个1秒延迟的核心诱因是跨Laravel版本的日期时间精度处理不兼容,具体逻辑如下:

  • Lumen 8.x + Passport 10.x 默认启用了日期微秒精度(保留6位小数),生成Token时写入oauth_access_tokens表的created_at字段会携带微秒信息,例如 2024-05-20 14:00:00.723109
  • Laravel 5.8 + Passport 7.x 对日期的默认处理精度为秒级,读取带微秒的created_at值时,会自动对时间做四舍五入取整:上述示例时间会被转换成时间戳1716213601(对应14:00:01)
  • Passport校验Token合法性时会校验JWT载荷中的iat(签发时间,始终为秒级整数)必须大于等于Token的created_at时间戳:刚生成的Tokeniat为1716213600(对应14:00:00),小于消费方转换出的1716213601,直接校验失败;等待1秒后新的请求iat变为1716213601,满足校验条件就可以正常通过。
  • 提供方本身是同版本栈,读取created_at时会保留微秒信息,转换的时间戳和iat一致,所以不会出现校验失败问题。
解决方案

可选以下任意一种方案落地即可:

方案1:调整提供方的Token创建时间精度(推荐,改造成本最低)

在提供方Lumen项目的AppServiceProvider的boot方法中,添加以下代码,全局关闭日期微秒精度,确保写入数据库的created_at始终为秒级:

use Illuminate\Database\Eloquent\Model;

public function boot()
{
    Model::withoutTimestampsMicros();
}

该配置会让所有模型写入时间字段时自动抹除微秒,和Laravel 5.8的处理逻辑完全对齐,修改后新生成的Token即可实现消费方即时校验通过。

方案2:调整消费方的日期解析逻辑

如果无法修改提供方代码,可以在消费方Laravel 5.8项目中,自定义Passport的Token模型,覆盖created_at字段的日期解析逻辑,强制丢弃微秒部分而非四舍五入:

  1. 首先创建自定义的Token模型:
// app/Models/OauthAccessToken.php
namespace App\Models;

use Laravel\Passport\Token as PassportToken;
use Carbon\Carbon;

class OauthAccessToken extends PassportToken
{
    public function getCreatedAtAttribute($value)
    {
        // 丢弃微秒部分,不做四舍五入
        return Carbon::parse(substr($value, 0, 19));
    }
}
  1. 在AuthServiceProvider的boot方法中注册自定义模型:
use Laravel\Passport\Passport;
use App\Models\OauthAccessToken;

public function boot()
{
    $this->registerPolicies();

    Passport::useTokenModel(OauthAccessToken::class);
}

方案3:统一数据库字段精度

直接修改oauth_access_tokens表的created_at、updated_at字段精度为0,强制数据库自动截断微秒部分,SQL语句如下:

ALTER TABLE oauth_access_tokens 
ALTER COLUMN created_at TYPE TIMESTAMP(0),
ALTER COLUMN updated_at TYPE TIMESTAMP(0);

该方案不需要修改业务代码,直接在数据库层面统一精度即可生效。

内容的提问来源于stack exchange,提问作者Mojtaba Hn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:15:03