如何在Laravel Passport的API请求中保持laravel_session Cookie不变?
核心原因是Laravel Passport默认是无状态认证机制,你强行给API中间件加入Session初始化逻辑,会和Passport的认证流程冲突,导致Session Cookie不断重建。以下是可行的解决步骤:
移除API中间件组的StartSession
直接从app/Http/Kernel.php的api中间件数组里删掉\Illuminate\Session\Middleware\StartSession::class。Passport的Token认证不需要依赖Session,强行引入会让框架每次请求都尝试重新生成Session,这就是Cookie频繁变更的根源。修正Session配置项
调整.env里的Session相关配置,避免干扰Passport的Cookie处理:SESSION_DOMAIN:如果是同域前后端,设置为.site.test(前缀加.适配子域);跨域场景要和前端域名完全匹配SESSION_SAME_SITE:本地HTTP环境设为lax,none仅适用于HTTPS环境且必须配合SESSION_SECURE_COOKIE=true,本地开发用lax更稳定SESSION_SECURE_COOKIE:本地HTTP保持false,线上HTTPS环境改为true
确保Passport认证中间件正确使用
API路由必须使用auth:api中间件,而非web中间件,示例:Route::middleware('auth:api')->group(function () { // 你的API业务路由 });检查跨域请求的凭证传递
如果是跨域场景,前端请求要开启withCredentials: true(比如Axios配置),同时后端config/cors.php要开启凭证支持:'supports_credentials' => true,确保前端每次请求都完整携带
laravel_sessionCookie,不能遗漏或篡改。若需Session+Passport结合使用
如果你确实需要在API中保留Session(比如用Passport的会话认证模式),要确保:- 执行过
php artisan session:table和migrate,生成正确的数据库会话表 - 将Passport的
CreateFreshApiToken中间件加到web中间件组,而非API中间件组,用于给前端注入API Token
- 执行过
内容的提问来源于stack exchange,提问作者Daniel L
相关产品推荐
相关产品推荐

