什么是 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 属性获取明文令牌值。明文令牌不会保存到数据库,因此签发后必须立即返回给用户。
设置 Scope(能力)
可以为令牌附加能力(scope),限定该令牌能够执行的操作。通过中间件校验 scope
在bootstrap/app.php 注册中间件别名:
令牌有效期
默认情况下 Sanctum 令牌没有有效期。可通过config/sanctum.php 的 expiration 选项以分钟为单位设置。
吊销令牌
SPA 认证
SPA 认证使用 Session Cookie,无需签发和管理令牌。适合自家前端(Vue、React、Next.js 等)调用 API 的场景。启用 Sanctum 中间件
在bootstrap/app.php 中启用 statefulApi()。
配置一方(First-party)域名
在config/sanctum.php 的 stateful 选项中配置 SPA 的域名。
CORS 配置
若从其他子域名调用 API,需要配置 CORS。config/cors.php 中将 supports_credentials 设置为 true。
来自 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() 认证用户并指定要授予的能力。
- Pest
- PHPUnit
小结
安装步骤概览
安装步骤概览
HasApiTokens trait:常用 API 汇总
常用 API 汇总
API 令牌认证 vs SPA 认证的选择
API 令牌认证 vs SPA 认证的选择
- API 令牌认证:适用于移动应用、第三方、CLI 工具等无 Session 的客户端。
- SPA 认证:适用于自家 Vue / React / Next.js 前端等同一域名(或子域名)上的 SPA。更安全,无需管理令牌。