You need to enable JavaScript to run this app. Laravel Sanctum 使用IP访问时auth中间件请求返回401
优惠活动
大模型
产品
解决方案
定价
更多

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保持一致,不要带路径
  • 第四步:基础环境校验
    确认已经执行过Sanctum的服务发布和数据库迁移命令,个人访问Token的存储表正常存在,修改配置后重新调用登录接口生成全新的Token做测试

补充说明:IP场景下完全可以正常使用Laravel Sanctum的所有能力,不需要绑定正式域名,所有配置异常本质都是没有遵循域名配置的格式规范。

内容的提问来源于stack exchange,提问作者eloelo530

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 17:15:04