Laravel Sanctum 使用IP访问时auth中间件请求返回401
Laravel Sanctum 携带有效Token仍返回401问题修复
问题场景
- 登录接口运行正常,可成功生成并返回新的访问Token
- 所有经过
auth:sanctum中间件的路由请求,无论是否携带有效Token,均返回401状态码 - 项目当前通过内网IP
192.168.0.26访问,未绑定正式域名,曾尝试移除配置里的/api后缀,问题仍未解决
当前存在的配置错误
APP_URL=192.168.0.26/api SANCTUM_STATEFUL_DOMAINS=192.168.0.26/api SESSION_DRIVER=cookie SESSION_DOMAIN=.192.168.0.26/api
触发异常的核心原因
- 所有和域名匹配相关的配置,仅支持主机名+端口值,不允许携带任何路径后缀,配置里追加的
/api路径,会直接让Sanctum、Session的域名匹配规则完全失效 SESSION_DOMAIN格式完全不符合配置规范:前导点.xxx是泛域名匹配语法,仅用于正式域名场景下匹配同根域的所有子域名,IP地址没有子域层级,加前导点+带路径会导致Cookie根本无法正常写入- 纯Token认证(分离部署、手动携带Bearer Token的场景)本身不依赖
SANCTUM_STATEFUL_DOMAINS配置,之所以带Token还是返回401,是因为Session/Cookie相关的配置异常,导致Sanctum的认证流程初始化报错,连带拦截了所有请求
分步修复方案
- 第一步:修正所有域名类配置为符合规范的值,参考如下配置
# APP_URL 仅写访问根地址,不需要携带/api路由前缀 APP_URL=http://192.168.0.26 # Stateful域名配置仅写访问的IP/域名,使用自定义端口的话需要和IP一起写,不要带路径、不要加斜杠 SANCTUM_STATEFUL_DOMAINS=192.168.0.26 SESSION_DRIVER=cookie # IP场景下的Session域名不要加前导点、不要带任何路径,直接写实际访问的IP SESSION_DOMAIN=192.168.0.26 - 第二步:执行配置清理命令,让修改后的.env配置生效,避免旧的缓存配置干扰
php artisan config:clear - 第三步:校验路由与跨域配置
- 确认API路由挂载的是
auth:sanctum中间件,没有错误挂载成web端的auth中间件 - 如果是跨域调用的分离部署场景,检查
config/cors.php配置,确保允许携带凭证(supports_credentials=true)时,允许的来源和实际访问IP保持一致,不要带路径
- 确认API路由挂载的是
- 第四步:基础环境校验
确认已经执行过Sanctum的服务发布和数据库迁移命令,个人访问Token的存储表正常存在,修改配置后重新调用登录接口生成全新的Token做测试
补充说明:IP场景下完全可以正常使用Laravel Sanctum的所有能力,不需要绑定正式域名,所有配置异常本质都是没有遵循域名配置的格式规范。
内容的提问来源于stack exchange,提问作者eloelo530
相关产品推荐
相关产品推荐

