跳转到主要内容

什么是 Sanctum

Laravel Sanctum 是面向 SPA(单页应用)、移动应用以及简单 API 的轻量认证包。无需复杂的 OAuth 知识,也能为每个用户发放并管理多个 API 令牌。 Sanctum 解决两大问题:
从自家 SPA 调用 API 时使用 SPA 认证。移动应用或第三方调用 API 时使用 API 令牌认证。也可以只使用其中一种。

与 Passport 的选择

如果需要作为 OAuth2 提供方对接外部服务,请选择 Passport;大多数应用使用 Sanctum 就够了。

安装与配置

安装

只需执行 install:api Artisan 命令即可完成 Sanctum 的配置。
该命令会自动完成:
  • 安装 laravel/sanctum
  • 发布 personal_access_tokens 表的迁移文件
  • 执行迁移

添加 HasApiTokens trait

User 模型上添加 HasApiTokens trait。
这样就可以使用 $user->createToken()$user->tokens 等方法。

API 令牌认证

令牌流程

签发令牌

通过 createToken() 签发令牌。可以通过 plainTextToken 属性获取明文令牌值。明文令牌不会保存到数据库,因此签发后必须立即返回给用户。
数据库中保存的是经 SHA-256 哈希后的令牌。

设置 Scope(能力)

可以为令牌附加能力(scope),限定该令牌能够执行的操作。
处理请求时检查令牌的 scope:

通过中间件校验 scope

bootstrap/app.php 注册中间件别名:
在路由上应用中间件:

令牌有效期

默认情况下 Sanctum 令牌没有有效期。可通过 config/sanctum.phpexpiration 选项以分钟为单位设置。
也可以按令牌指定有效期:
若设置了有效期,请定期清理过期令牌。

吊销令牌


SPA 认证

SPA 认证使用 Session Cookie,无需签发和管理令牌。适合自家前端(Vue、React、Next.js 等)调用 API 的场景。
使用 SPA 认证要求 SPA 与 API 共享同一顶级域名(子域名可以不同)。同时请求需包含 Accept: application/json 头和 RefererOrigin 头。

启用 Sanctum 中间件

bootstrap/app.php 中启用 statefulApi()

配置一方(First-party)域名

config/sanctum.phpstateful 选项中配置 SPA 的域名。

CORS 配置

若从其他子域名调用 API,需要配置 CORS。
config/cors.php 中将 supports_credentials 设置为 true
前端 axios 也需配置:
别忘了设置 Session Cookie 域名:

来自 SPA 的认证流程

1

获取 CSRF Cookie

登录前访问 /sanctum/csrf-cookie 初始化 CSRF 保护。
2

发送登录请求

/login 发送 POST 请求。
3

发送已认证请求

登录后的请求会通过 Session Cookie 自动认证。

保护已认证路由

在路由上应用 auth:sanctum 中间件,未认证的请求会返回 401 Unauthorized。API 令牌认证与 SPA 认证都由同一个中间件处理。

实用示例:登录 API 与返回令牌

下面是移动应用使用 API 令牌认证的示例。
1

创建登录端点

2

创建已认证路由

3

从客户端发起请求


测试

在 Sanctum 测试中,使用 Sanctum::actingAs() 认证用户并指定要授予的能力。

小结

在 User 模型上添加 HasApiTokens trait:
  • API 令牌认证:适用于移动应用、第三方、CLI 工具等无 Session 的客户端。
  • SPA 认证:适用于自家 Vue / React / Next.js 前端等同一域名(或子域名)上的 SPA。更安全,无需管理令牌。
最后修改于 2026年7月18日