Sanctum 不提供 Sanctum::login() 方法,需调用 $user->createToken('name') 获取明文 token;API 认证须禁用 stateful 域名、使用 Authorization: Bearer {plainTextToken} 头;登出需手动删除 token,刷新需新建并删旧 token;务必运行迁移且配置 HasApiTokens。

Sanctum 不是“开箱即用”的登录接口,它只管发 token 和校验 token,登录逻辑得你自己写。
为什么 Sanctum::login() 报错 “Call to undefined method”
因为 Sanctum::login() 根本不存在 —— Sanctum 没提供这个静态方法。常见错误是照着旧版 Passport 教程抄,或者误读文档。
- 正确做法:调用
$user->createToken('name'),返回一个NewAccessToken实例 - token 存在
$token->plainTextToken里,这是唯一一次能拿到明文 token 的机会 - 别漏掉
use Laravel\Sanctum\HasApiTokens;到 User 模型,否则createToken()方法不可用 - 如果用了自定义 guard(比如
sanctum_api),确保config/auth.php里对应 guard 的provider指向正确的 user provider
Postman 测试时始终返回 401,但 Authorization: Bearer xxx 明明填对了
Sanctum 默认只接受 cookie 认证(用于 SPA),API 模式下必须显式启用 token 认证,且 header 名和格式有硬性要求。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 确认
config/sanctum.php中'stateful'数组**不包含你的 API 域名或 localhost 端口**(例如删掉'localhost:3000'),否则它会强制走 session 流程 - 请求 header 必须是
Authorization: Bearer {token},注意中间是空格,不是冒号或等号 - token 值必须是
createToken()返回的plainTextToken,不是数据库里的哈希值(token字段) - Laravel 10+ 默认禁用全局中间件
EnsureFrontendRequestsAreStateful,API 路由要显式加middleware('auth:sanctum')
登录后能取用户,但刷新 token 或登出失败
Sanctum 的 token 是独立记录在 personal_access_tokens 表里的,没有自动刷新机制,登出也只删当前 token,不是“所有 token”。
- 刷新 token = 创建新 token + 主动删旧 token,没有
refresh()方法,得手写:$user->currentAccessToken()->delete(); $newToken = $user->createToken(...); - 登出所有设备?用
$user->tokens()->delete(),但注意这会干掉所有 token,包括其他客户端的 - 前端存 token 到 localStorage 没问题,但别存到 cookie(除非你明确配了
withCookies()),否则可能被 CSRF 中间件拦截 - token 过期时间由
config/sanctum.php的'expiration'控制(单位分钟),设为null表示永不过期 —— 生产环境慎用
最常被跳过的一步:没跑 php artisan migrate 就直接试登录,personal_access_tokens 表不存在,createToken() 会静默失败或抛 DB 异常。另外,APP_URL 和 SESSION_DOMAIN 在 .env 里配错,会导致 cookie 认证路径不匹配,但 API 模式下反而影响不大 —— 别被这些配置带偏方向。

















