Sanctum API鉴权分SPA(Cookie+CSRF)和API模式(Bearer Token)两种,需严格区分;必须完成数据库迁移、引入HasApiTokens、配置sanctum为api驱动、正确排序中间件;登录须先Auth::attempt再createToken并立即返回plainTextToken;请求头Authorization格式须为“Bearer {token}”,CORS需启用credentials且指定域名。

Sanctum 实现 API 登录鉴权,核心是“先认证、再发 Token、后续凭 Token 访问”,但具体方式取决于你用的是 SPA(如 Vue/React)还是纯 API 场景(如移动端、Postman 调试)。两者流程不同,不能混用。
区分两种模式:SPA 用 Cookie + CSRF,API 用 Bearer Token
Sanctum 不是单一方案,它提供两套并行机制:
-
SPA 模式:依赖浏览器 Cookie 和 Session,必须走三步——先 GET
/sanctum/csrf-cookie拿 CSRF token,再 POST/login提交账号密码(自动携带 XSRF-TOKEN),最后所有请求靠 Cookie 自动鉴权。适合 Vue/React 前端与 Laravel 同域或配置了可信跨域的场景。 -
API 模式:无状态,不依赖 Cookie。用户登录后拿到明文 Token(
$token->plainTextToken),后续每个请求在 Header 中带Authorization: Bearer {token}。适用于 App、小程序、第三方系统等。
关键配置一步都不能少
无论哪种模式,以下四点必须正确设置,否则 401 / 419 错误必然出现:
-
数据库迁移完成:执行
php artisan migrate创建personal_access_tokens表,否则createToken()直接报错。 -
User 模型引入 trait:在
app/Models/User.php中添加use Laravel\Sanctum\HasApiTokens;。 -
auth guard 驱动设为 sanctum:检查
config/auth.php中'api' => ['driver' => 'sanctum'],不是token或session。 -
中间件顺序正确:在
app/Http/Kernel.php的$middlewareGroups['api']开头加入\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class;若用于 SPA,这行必须在throttle:api之前。
登录接口怎么写才安全有效
登录逻辑不能只验证密码,还要确保返回的是可立即使用的明文 Token:
- 必须先调用
Auth::attempt()成功,再用$user->createToken();不能跳过登录直接造 Token。 -
createToken()返回的是对象,明文 Token 只能取一次:$token->plainTextToken必须在响应中立刻返回,之后就为空。 - 推荐写法:
前端请求头和跨域细节决定成败
Token 写对了,但请求仍 401?大概率卡在这几个地方:
-
Header 格式严格:必须是
Authorization: Bearer abc123—— Bearer 后面**必须有一个空格**,不能是Bearer:abc123或token abc123。 -
CORS 配置要精准:在
config/cors.php中:-
'supports_credentials' => true(启用 Cookie) -
'allowed_origins' => ['http://localhost:5173'](不能填*) 'paths' => ['sanctum/csrf-cookie', 'api/*']
-
-
本地开发注意 SESSION_DRIVER:.env 中设
SESSION_DRIVER=cookie,且SANCTUM_STATEFUL_DOMAINS=localhost:5173(对应你的前端地址)。


















