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

Laravel中间件更新Cookie后无法传递新AccessToken至控制器问题

Laravel Sanctum 刷新Token后控制器获取旧值的解决办法

问题核心

你当前的代码仅将新Token写入响应的Cookie,但当前请求周期内的$request对象仍保留旧Cookie数据,导致控制器读取到的还是过期Token。要解决这个问题,需要同时修改请求对象的Cookie和响应的Cookie。

具体修复步骤

  1. 修改请求对象的Cookie(让控制器拿到新值)
    在调用$next($request)之前,直接更新当前请求里的Cookie值,确保后续控制器和中间件能读取到新Token:
// 生成加密后的新令牌字符串
$newTokenStr = Crypt::encryptString($newAuthTokens->concatenate());

// 关键操作:更新当前请求的Cookie集合
$request->cookies->set(AdminConstants::COOKIE_NAME, $newTokenStr);
  1. 修正并生成响应Cookie
    简化有效期计算逻辑,确保Cookie参数正确后附加到响应:
// 计算Cookie有效期(分钟)
$expireMinutes = Carbon::parse($newAuthTokens->refreshTokenExpiredAt->value())->diffInMinutes(now());

// 生成Cookie实例
$newCookie = cookie()->make(
    AdminConstants::COOKIE_NAME,
    $newTokenStr,
    $expireMinutes
);

// 传递修改后的请求,同时返回带新Cookie的响应
return $next($request)->withCookie($newCookie);
  1. 调整中间件执行顺序
    必须让你的刷新Token中间件在Sanctum的auth:sanctum中间件之前运行,否则Sanctum认证时仍会使用旧Token。在app/Http/Kernel.php的api中间件组里调整顺序:
protected $middlewareGroups = [
    'api' => [
        \App\Http\Middleware\RefreshAdminToken::class, // 你的刷新中间件放前面
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'auth:sanctum', // Sanctum认证中间件放后面
    ],
];

逻辑说明

  • 修改$request->cookies->set()是为了当前请求周期内让所有后续流程获取新Token;
  • 响应里的withCookie()是为了让浏览器保存新Token,保证下一次请求使用新值。

内容的提问来源于stack exchange,提问作者juan manuel Sivianes Guisasola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:43:13