Laravel Sanctum生产环境成功认证后访问受保护路由仍报未认证错误
Laravel Sanctum 生产环境未认证错误排查方案
1. 核心配置校验
SANCTUM_STATEFUL_DOMAINS必须填写生产环境的实际访问域名,不要带http/https前缀,使用非80/443端口时需要带上端口,多域名用英文逗号分隔,不要留空,示例:
# 常规域名 SANCTUM_STATEFUL_DOMAINS=yourdomain.com,admin.yourdomain.com # 带端口的场景 SANCTUM_STATEFUL_DOMAINS=yourdomain.com:8000,test.yourdomain.com:3000
SESSION_DOMAIN需要填写根域名,前缀加小数点,确保跨子域的session可以正常识别,示例:
SESSION_DOMAIN=.yourdomain.com
- 配置修改后必须依次执行缓存清理命令:
php artisan config:clear php artisan route:clear php artisan cache:clear
生产环境建议重新生成缓存提升性能:
php artisan config:cache php artisan route:cache
2. 请求规则校验
- 前端请求受保护路由时,必须携带两个请求头:
Authorization头,值格式为Bearer 接口返回的有效tokenAccept头,值为application/json,确保Laravel识别为API请求,不会触发登录页跳转逻辑
- 如果是SPA同源请求,还要确保请求的
withCredentials属性设置为true
3. 令牌有效性校验
- 确认数据库
personal_access_tokens表中存在请求携带的token对应的记录,且expires_at字段为空或者未到过期时间 - 检查生产环境
APP_KEY是否和本地生成token时的密钥一致,如果生产环境重新生成过密钥,之前生成的所有token都会失效,需要重新登录获取新token
4. 框架配置校验
- 确认
app/Http/Kernel.php的api中间件组中已经正确添加Sanctum中间件:
'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
- 检查访问的路由是否确实归属
auth:sanctum中间件分组,无拼写错误
5. 服务器环境校验
- 检查Nginx/Apache配置是否丢弃了Authorization头,Nginx可以在站点配置中添加以下规则解决:
add_header Access-Control-Allow-Headers Authorization; fastcgi_pass_header Authorization;
- 确认生产环境HTTPS配置正常,Sanctum默认在HTTPS环境下才会生成安全cookie,如果临时用HTTP环境测试,需要在
.env中添加SESSION_SECURE_COOKIE=false,注意正式生产环境必须开启HTTPS并配置SESSION_SECURE_COOKIE=true
内容的提问来源于stack exchange,提问作者biswa
相关产品推荐
相关产品推荐

