Laravel 9 Sanctum+React SPA Cookie认证登录后401未授权问题
Laravel 9 Sanctum 跨子域名SPA认证401问题解决
你的核心问题出在SANCTUM_STATEFUL_DOMAINS配置上,当前配置未包含SPA所在的子域名,导致Sanctum无法识别合法的请求来源。以下是具体修复步骤:
1. 修正.env配置
更新.env文件中的SANCTUM_STATEFUL_DOMAINS,加入你的SPA域名agefa.devetapia.cl:
SESSION_DRIVER=cookie SESSION_DOMAIN=.devetapia.cl SANCTUM_STATEFUL_DOMAINS=agefa.devetapia.cl,backend.devetapia.cl
SESSION_DOMAIN=.devetapia.cl是正确的,确保Cookie能在所有子域名下共享SANCTUM_STATEFUL_DOMAINS需要明确指定所有允许发起有状态请求的域名(即你的SPA和后端自身域名),原配置仅写了根域名devetapia.cl,不包含子域名agefa,这是导致401的关键
2. 清除配置缓存
修改配置后必须清除框架缓存,否则线上环境不会加载新配置:
php artisan config:clear
3. 验证登录逻辑
确保你的LoginController的login方法使用框架自带的认证方法,而非手动生成Token(Cookie认证依赖框架自动设置会话Cookie):
public function login(Request $request) { $validated = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (!Auth::attempt($validated)) { return response()->json(['message' => '登录凭证无效'], 401); } return response()->json(['user' => Auth::user()]); }
4. 检查关键配置细节
- Session安全设置:确保HTTPS环境下Session Cookie强制使用Secure属性,在
config/session.php中:
同时在'secure' => env('SESSION_SECURE_COOKIE', true),.env中添加:SESSION_SECURE_COOKIE=true - CORS配置优化:生产环境建议将
cors.php中的allowed_origins从*改为具体域名,提升安全性:'allowed_origins' => ['https://agefa.devetapia.cl'],
5. 浏览器端验证
登录成功后,打开浏览器开发者工具的Application面板,检查Cookie:
- 确认存在
laravel_session和XSRF-TOKEN两个Cookie - 确认Cookie的
Domain为.devetapia.cl,Secure和HttpOnly(laravel_session)属性已启用
完成以上步骤后,重新测试/api/user请求即可正常返回用户信息。
内容的提问来源于stack exchange,提问作者Eduardo Tapia
相关产品推荐
相关产品推荐

