Laravel中间件更新Cookie后无法传递新AccessToken至控制器问题
Laravel Sanctum 刷新Token后控制器获取旧值的解决办法
问题核心
你当前的代码仅将新Token写入响应的Cookie,但当前请求周期内的$request对象仍保留旧Cookie数据,导致控制器读取到的还是过期Token。要解决这个问题,需要同时修改请求对象的Cookie和响应的Cookie。
具体修复步骤
- 修改请求对象的Cookie(让控制器拿到新值)
在调用$next($request)之前,直接更新当前请求里的Cookie值,确保后续控制器和中间件能读取到新Token:
// 生成加密后的新令牌字符串 $newTokenStr = Crypt::encryptString($newAuthTokens->concatenate()); // 关键操作:更新当前请求的Cookie集合 $request->cookies->set(AdminConstants::COOKIE_NAME, $newTokenStr);
- 修正并生成响应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);
- 调整中间件执行顺序
必须让你的刷新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
相关产品推荐
相关产品推荐

