laravel sanctum 是认证机制,breeze 是脚手架工具;二者配合使用——breeze api栈默认集成 sanctum,但需手动确认中间件、路由和模型生效,否则持续报401错误。

直接说结论:Laravel Sanctum 是认证机制,Breeze 是脚手架工具;二者不是替代关系,而是配合使用——Breeze api 栈默认集成 Sanctum,但你必须手动确认中间件、路由和模型是否真正生效,否则 401 错误会反复出现。
auth:sanctum 中间件为什么总不生效
最常见的原因是 Laravel 的 api 路由组默认不启用 session,而 Sanctum 的 Cookie 认证(用于 SPA)依赖 EnsureFrontendRequestsAreStateful 中间件。如果你只写了 Route::middleware('auth:sanctum') 却没确保该中间件已注册进 $middlewareGroups['api'],请求永远过不去。
- 检查
app/Http/Kernel.php中'api'组是否包含\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class - 不要把
web中间件混进api路由——比如加encrypt_cookies或verify_csrf_token,会导致 token 解析失败 - 移动端调用时,
auth:sanctum只认Authorization: Bearer {token},不读 Cookie;SPA 才走 Cookie + CSRF 流程
personal_access_tokens 表缺失或字段类型错
执行 php artisan migrate 前,必须先运行 php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider",否则迁移文件不会生成。即使表存在,如果 users.id 是 UUID 类型(非整型),tokenable_id 字段会因类型不匹配导致 createToken() 报 SQL 错误:SQLSTATE[42S02]: Base table or view not found。
- 确认迁移文件
create_personal_access_tokens_table.php已出现在database/migrations/下 - 若用户主键是 UUID,请在迁移中将
tokenable_id改为$table->uuid('tokenable_id')并添加索引 - 执行迁移后,检查数据库中是否存在
personal_access_tokens表,且结构与 Sanctum 文档一致
Breeze api 安装后,AuthController 不处理 token 返回
Breeze api 栈生成的 AuthenticatedSessionController@store 默认返回 204 No Content,不返回 token。这会让移动端无法拿到 plainTextToken,必须手动改写登录逻辑。
- 在
store方法中,替换原响应为response()->json(['token' => $user->createToken('api-token')->plainTextToken]) - 注意:
createToken()返回的是对象,必须链式调用->plainTextToken才能拿到明文字符串;直接->token是哈希值,不可用 - 如果需要权限控制,可传入能力数组:
$user->createToken('api-token', ['read', 'write']),后续用$request->user()->tokenCan('write')校验
stateful 域名配置被忽略的后果
config/sanctum.php 中的 'stateful' 配置决定哪些域名允许走 Cookie 认证。开发时设成 ['localhost', '127.0.0.1'] 是基础要求;若前端跑在 http://localhost:3000,而后端是 http://localhost:8000,漏掉 localhost 就会卡在 CSRF 验证失败,返回 401 且无提示。
- 生产环境务必设为根域名(如
.example.com),否则子域名间 Cookie 不共享 -
SESSION_DOMAIN环境变量需与stateful列表一致,否则 Cookie 写不进浏览器 - 移动端不依赖此配置,但调试时若误用 Cookie 模式(比如 Postman 开了自动 cookie),也会因此失败
最常被跳过的一步:改完 config/sanctum.php 或 Kernel.php 后没清缓存。执行 php artisan config:clear 和 php artisan cache:clear 是硬性前提,否则所有配置变更都只是“看起来改了”。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











