Laravel Sanctum生产环境始终返回401未授权问题求助
本地开发时,使用Vitesse-Nuxt3前端模板搭配Laravel 9 Sanctum后端,引入nuxt-sanctum-auth包完全正常,但部署到生产环境后,登录确认成功,请求通过auth:sanctum中间件时却出现401未授权错误。前后端采用HTTPS子域名架构:前端https://fe.mydomain.com,后端https://be.mydomain.com,Postman测试接口正常,问题集中在前后端交互环节。
已尝试的配置如下:
- .env文件设置:
SANCTUM_STATEFUL_DOMAINS="mydomain.com" SESSION_DRIVER=cookie SESSION_DOMAIN=.mydomain.com
- cors.php文件配置:
'paths' => ['api/*', 'sanctum/csrf-cookie'], 'supports_credentials' => true,
排查与解决步骤
修正SANCTUM_STATEFUL_DOMAINS配置
子域名场景下,需精确指定前端域名而非根域名。将.env中的SANCTUM_STATEFUL_DOMAINS修改为前端实际域名:SANCTUM_STATEFUL_DOMAINS="fe.mydomain.com"Sanctum的stateful domains需要匹配发起请求的具体前端域名,根域名配置无法正确识别子域名请求。
检查Nuxt端sanctum配置
确保nuxt.config.ts中sanctum模块的配置正确开启凭证携带,并同步Cookie域名:export default defineNuxtConfig({ modules: ['nuxt-sanctum-auth'], sanctum: { baseUrl: 'https://be.mydomain.com', credentials: true, csrfCookie: { path: '/', domain: '.mydomain.com' } } })核心是
credentials: true必须开启,保证请求自动携带Cookie;csrfCookie的domain要与后端SESSION_DOMAIN保持一致。验证HTTPS环境下的Cookie属性
生产HTTPS环境中,Cookie需开启secure属性。打开Laravel的config/session.php确认:'secure' => env('SESSION_SECURE_COOKIE', true),同时将
same_site设置为'lax'(跨子域名场景下足够),若跨顶级域名可设为'none'(但必须配合secure: true):'same_site' => 'lax',确认请求的Cookie携带状态
登录成功后,在浏览器开发者工具的Application -> Cookies中,检查是否存在laravel_session和XSRF-TOKEN,且它们的Domain为.mydomain.com、Secure属性为true。
发起受保护请求时,查看Network面板的Request Headers,确认Cookie字段和X-XSRF-TOKEN头是否正确携带。清理浏览器缓存与Cookie
生产环境可能残留旧Cookie缓存导致验证失败,手动清除对应域名的Cookie后重新测试。
内容的提问来源于stack exchange,提问作者Lekz Flores

