本文目录导读:

在 Laravel 项目中,Sanctum 和 Passport 是两种主流的 API 认证方案,它们各有侧重,选择哪一个,完全取决于你的项目类型和应用场景。
以下是从多个维度进行的详细对比和选型建议:
核心定位与适用场景
| 特性 | Laravel Sanctum | Laravel Passport |
|---|---|---|
| 核心定位 | 轻量级,专为 SPA(单页应用) 和 移动端 设计的简单令牌认证。 | 重量级,完整实现 OAuth 2.0 协议的官方包。 |
| 适用场景 | - 前后端分离的 SPA(如 Vue/React) - 移动端 App(小而美) - 仅需简单的 API 令牌验证 - 内置飞镖/轮播图等简单权限控制 |
- 第三方开发者需要接入你的 API(如开放平台) - 多个独立客户端(不同 App/网站)需要授权登录 - 需要标准的 OAuth 2.0 授权码模式、刷新令牌机制 - 复杂的权限和作用域(Scopes)管理 |
认证机制差异(重中之重)
这是两者最大的区别:
-
Passport(标准 OAuth 2.0):
- 通过 授权码(Authorization Code) 或 密码授权(Password Grant) 获取
access_token,并配套refresh_token(刷新令牌)。 - 令牌有过期时间,需要刷新机制。
- 支持作用域(Scopes/权限范围),非常完善,适合大型复杂系统。
- 通过 授权码(Authorization Code) 或 密码授权(Password Grant) 获取
-
Sanctum(个人访问令牌 / SPA Cookie):
- 模式一(SPA):基于 Cookie 的 Session 认证,利用了 Laravel 内置的 Session 中间件,自动处理 CSRF 防护,无需每次发送 Bearer Token。
- 模式二(移动端):基于个人访问令牌(Personal Access Token),这个令牌是长期有效的(除非手动吊销),永远不会过期,它仅仅是存储在数据库中的一段随机哈希字符串。
复杂程度与维护成本
| 维度 | Sanctum | Passport |
|---|---|---|
| 安装配置 | 极简,一个 php artisan install:api 命令即可。 |
复杂,需要执行迁移、发布配置、生成加密密钥(php artisan passport:install),需要创建 OAuth Client。 |
| 数据库表 | 只需 2 张表(personal_access_tokens)。 |
需要至少 4-5 张表(oauth_clients, oauth_auth_codes, oauth_access_tokens, oauth_refresh_tokens, oauth_personal_access_clients)。 |
| 学习曲线 | 低,几乎无 OAuth 概念。 | 高,需要理解 OAuth 2.0 的授权流程。 |
安全性对比
- Passport:因为支持刷新令牌,如果长期令牌泄露,风险较大;但标准 OAuth 允许在服务端强制令牌失效和刷新,安全性较高。
- Sanctum:
- 对于 SPA:安全性极高,因为依赖 Session + Cookie,浏览器自动处理,且易受 CSRF 保护。
- 对于 移动端:令牌是永久的,如果令牌泄露,除非你在数据库中手动删除该条记录,否则攻击者可以永久使用。风险较高。
选型决策建议(直接给结论)
| 你的项目情况 | 推荐选择 |
|---|---|
| Vue/React + Laravel(SPA),且用户主要在自己网站内登录 | Sanctum ✅ |
| 移动 App,需要访问自己的 API,且不需要复杂第三方授权 | Sanctum ✅(简单快捷) |
| 移动 App,需要刷新令牌,或有高安全性要求(如金融、医疗) | Passport |
| 开放 API,允许第三方开发者(如微信开放平台、GitHub)接入 | Passport ✅ |
| 需求快速开发,不想折腾 OAuth 授权流程 | Sanctum |
| 需要精细控制用户权限(作用域/Scopes),如“只读权限”、“写权限” | Passport |
补充说明(重要)
- 新项目默认选 Sanctum:Laravel 官方文档已经将 Sanctum 列为默认的 API 认证方案(甚至在新版 Laravel 中,
laravel/ui已不再内置 Passport)。 - Passport 的“密码授权”模式:如果你们内部开发封闭 App,且不想用户跳转网页授权,Passport 也支持密码授权,但它的令牌仍然有过期时间,需要处理刷新逻辑。
- 两者混合使用:在实际项目中,你可以让 Sanctum 负责内部 SPA 认证,同时使用 Passport 向外部开放 API,虽然这会让系统复杂,但在大型企业中常见。
最终总结(一句话)
如果你只想快速实现“用户接口鉴权”,选 Sanctum; 如果你在做“开放平台”或需要“OAuth 2.0 标准流程”,选 Passport。
在 Laravel 10/11/12 时代,默认优先考虑 Sanctum,只有当你明确需要 OAuth 2.0 特性时才切换到 Passport。