Laravel Sanctum搭配Nuxt JS部署后返回Unauthenticated报错求助
Nuxt + Laravel Sanctum 认证异常修复方案
以下是配置中存在的明确问题及对应修复方式,按顺序调整即可解决:
- Session 域名与Sanctum白名单配置错误
当前.env中SESSION_DOMAIN设置为api.example.com会导致认证Cookie仅在API子域生效,前端主域无法读取、携带Cookie完成认证;SANCTUM_STATEFUL_DOMAINS未覆盖全量可信域名,Sanctum会将前端请求判定为第三方请求,拒绝发放认证凭证;HTTP部署场景下默认开启的Secure Cookie属性会阻止非HTTPS环境下的Cookie写入。
修复后.env配置:SESSION_DRIVER=file SESSION_LIFETIME=120 # 前置点号配置,支持主域与所有子域共享Cookie SESSION_DOMAIN=.example.com # 填入所有可信前端域名,非80/443端口必须追加端口号 SANCTUM_STATEFUL_DOMAINS=example.com,api.example.com # HTTP环境下设为false,HTTPS环境下设为true SESSION_SECURE_COOKIE=false SANCTUM_COOKIE_SECURE=false - CORS配置不符合凭证请求规范
跨域携带Cookie的请求场景下,allowed_origins不能设置为通配符*,否则浏览器会直接拦截跨域响应,不会写入认证Cookie。
修复后cors.php配置:'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], // 明确填写前端访问地址,必须与浏览器地址栏的协议、域名、端口完全一致 'allowed_origins' => ['http://example.com', 'https://example.com'], 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => true, - Nuxt侧配置缺失与协议不匹配
首先要保证Axios的baseURL协议和前端访问协议一致:如果前端通过HTTPS访问,API地址必须也为HTTPS,否则会触发浏览器混合内容拦截,请求直接被阻断;另外auth模块未显式开启凭证携带,部分场景下会出现请求未带Cookie的问题。
修复后nuxt.config.js对应配置段:auth: { strategies: { cookie: { // 强制认证类请求携带跨域凭证 withCredentials: true, endpoints: { csrf: { url: '/sanctum/csrf-cookie' }, login: { url: '/api/login' }, register: { url: '/api/register' }, logout: { url: '/api/logout' }, user: { url: '/api/user' } }, user: { property: 'data' }, } }, redirect: { login: '/auth/login', logout: '/auth/login', home: '/dashboard', }, plugins: ['~/plugins/axios'] }, axios: { // 协议与前端访问协议保持一致,HTTPS环境替换为https://api.example.com baseURL: 'http://api.example.com', credentials: true }, - 落地验证步骤
- 给Laravel项目
storage目录设置755权限,保证Web进程有Session写入权限 - 执行
php artisan config:clear清除配置缓存,避免旧配置生效 - 清除浏览器下所有相关域名的Cookie,先请求
/sanctum/csrf-cookie接口,在开发者工具-应用-Cookies面板检查是否存在laravel_session、XSRF-TOKEN两个Cookie,且Domain值为.example.com - Cookie正常写入后再走登录、获取用户信息流程即可。
- 给Laravel项目
内容的提问来源于stack exchange,提问作者Henry Oladeji
相关产品推荐
相关产品推荐

