应使用 laravel sanctum 而非 passport 或手写 jwt,因其轻量安全且为 laravel 9+ 官方推荐;需手动配置 stateful 域名、显式添加 auth:sanctum 中间件,并调用 $user->createtoken() 生成 token,注意 plaintexttoken 仅出现一次。

直接用 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,包括其他客户端的 - token 过期时间由
config/sanctum.php的'expiration'控制(单位分钟),设为null表示永不过期 —— 生产环境慎用 - 前端存 token 到
localStorage没问题,但别存到 cookie(除非你明确配了withCookies()),否则可能被 CSRF 中间件拦截
最容易被忽略的是 stateful 配置和中间件的显式声明——这两个地方一错,整个认证链就断在 401,但错误信息完全不提示具体原因。开发时建议先用 dd($request->user()) 在受保护路由里验证是否走到 auth 逻辑,再逐层排查 token 生成、header 传递、中间件绑定这三个环节。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











