Sanctum无需安装认证,但必须执行vendor:publish和migrate;API认证需用EnsureFrontendRequestsAreStateful中间件而非auth:sanctum;token须调用$user->createToken()生成,不可手写JWT;鉴权依赖数据库记录,删除即登出。

Sanctum 不需要“安装认证”,它本质是 Laravel 的一个轻量级 API token 管理包,直接 composer require 就能用;但若跳过配置或误用中间件,token 会始终 401 —— 这不是安装失败,而是没走通它的鉴权链路。
composer require laravel/sanctum 后必须手动发布迁移和配置
执行 composer require laravel/sanctum 只是把包拉进 vendor/,不会自动注册服务或生成配置。不手动运行以下命令,Sanctum::issueToken() 会报错,数据库表也不存在:
-
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"(生成config/sanctum.php) -
php artisan migrate(创建personal_access_tokens表)
注意:Laravel 9+ 默认已自动发现 Sanctum 服务提供者,但 vendor:publish 仍不可跳过 —— 配置文件里有关键的 stateful 域名白名单,漏掉会导致 Cookie 认证失效。
API Token 认证必须用 sanctum 中间件,不能用 auth:sanctum
auth:sanctum 是为「Web + Session」设计的,依赖 Cookie 和 CSRF;纯 API 场景下,它会拒绝所有无 Cookie 的请求(哪怕带了 Authorization: Bearer xxx)。正确做法是:
- 在
app/Http/Kernel.php的$middlewareGroups['api']中,把throttle:api前加上\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class - 路由中使用
->middleware('auth:sanctum')是对的,但前提是该请求已通过EnsureFrontendRequestsAreStateful的域名/来源判断,否则直接被拦在门外 - 如果前端不在 Laravel 项目同域(比如 Vue SPA 部署在
https://app.example.com,后端在https://api.example.com),必须在config/sanctum.php的stateful数组里显式加域名,否则中间件直接跳过 token 解析
生成 Token 必须调用 $user->createToken(),别手写 JWT
Sanctum 的 token 是数据库持久化的加密字符串,不是 JWT。常见错误是试图用 JWTAuth::fromUser() 或自己拼 base64_encode(json_encode(...)),结果 token 根本查不到:
- 正确方式:
$token = $user->createToken('api-token')->plainTextToken;,返回的是明文 token 字符串,需前端保存(如 localStorage) - 数据库里存的是哈希后的值,所以你不能用
DB::table('personal_access_tokens')->where('token', $raw)->first()查 —— 要用Sanctum::findToken($raw)或让 Sanctum 自动解码 - 调用
createToken()后,$token只出现一次,之后再读$user->currentAccessToken()得到的是模型实例,不是字符串
最常被忽略的点:Sanctum 的 token 生命周期由数据库记录控制,删掉数据库里的记录就等于登出;它不依赖 Redis 或过期时间字段,expires_at 字段只是可选标记,不影响实际鉴权逻辑。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











