You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:45:49