Sanctum::login()不存在,正确流程是先Auth::attempt()校验,再$user->createToken()->plainTextToken获取明文token;需配置stateful域名、注册auth:sanctum中间件,并在User模型中引入HasApiTokens trait。

直接用 Laravel Sanctum,别碰 Passport 或手写 JWT——除非你明确需要 OAuth2 流程或第三方授权中心。Sanctum 是 Laravel 9+ 官方推荐的 API 认证方案,轻量、安全、开箱即配(但不是“开箱即用”,得手动补几处关键配置)。
为什么 Sanctum::login() 报错 “Call to undefined method”
因为这个方法根本不存在。Sanctum 没提供静态登录入口,它只管发 token 和校验 token,登录逻辑必须你自己实现。
- 正确做法是调用
$user->createToken('name'),返回一个NewAccessToken实例 -
$token->plainTextToken是唯一一次能拿到明文 token 的机会,前端必须存这个值,不是数据库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 格式和配置有硬性要求。
- 确认
config/sanctum.php中'stateful'数组不包含你的 API 域名或 localhost 端口(例如删掉'localhost:3000'),否则它强制走 session 流程 - 请求 header 必须是
Authorization: Bearer {token},注意中间是空格,不是冒号或等号 - Laravel 10+ 默认禁用全局中间件
EnsureFrontendRequestsAreStateful,API 路由要显式加middleware('auth:sanctum') - 确保路由注册在
routes/api.php,且没混用web中间件(如web、encrypt_cookies),否则会触发 CSRF 错误或 session 初始化失败
登录后能取用户,但刷新 token 或登出失败
Sanctum 的 token 是独立记录在 personal_access_tokens 表里的,没有自动刷新机制,登出也只删当前 token,不是“所有 token”。
- 刷新 token = 创建新 token + 主动删旧 token:
$user->currentAccessToken()->delete(); $newToken = $user->createToken('name'); - 登出所有设备?用
$user->tokens()->delete(),但注意这会干掉所有 token,包括其他客户端的 -
Sanctum::user()返回 null,但Auth::user()有值?这是最常被忽略的中间件顺序问题:检查app/Http/Kernel.php中$middlewareGroups['api']是否漏掉了EnsureFrontendRequestsAreStateful::class - 数据库迁移没跑?
personal_access_tokens表不存在会导致createToken()直接抛出QueryException
最容易被忽略的是 stateful 配置和中间件顺序——前者决定走 session 还是纯 token 流程,后者决定是否能解析到已登录用户。这两处一错,整个鉴权链就断了,但错误表现却千奇百怪:401、419、null 用户、token 无效……全都不报具体原因。


















