认证与数据
认证总览
认证与授权
- 认证(Authentication):这个用户是谁?(登录/登出、身份验证)
- 授权(Authorization):这个用户能做什么?(权限、角色、访问控制)
架构总览
全栈认证模型
服务端(安全)
- 会话(Session)存储与校验
- 用户凭据验证
- 数据库操作
- 令牌(Token)生成/验证
- 受保护的 API 端点
客户端(公开)
- 认证状态管理
- 路由保护逻辑
- 登录/登出用户界面
- 重定向处理
同构(两者)
- 路由加载器检查认证状态
- 共享的校验逻辑
- 用户资料数据访问
会话管理模式
HTTP-Only Cookie(推荐)
- 最安全的方式——JavaScript 无法访问
- 浏览器自动处理
- 通过
sameSite内置 CSRF 保护 - 最适合传统 Web 应用
JWT 令牌
- 无状态认证
- 适合 API 优先的应用
- 需要小心处理以避免 XSS 漏洞
- 考虑刷新令牌轮换(refresh token rotation)
服务端会话
- 集中式会话控制
- 易于撤销会话
- 需要会话存储(数据库、Redis)
- 适合需要即时会话控制的应用
路由保护架构
布局路由模式(推荐)
- 用父级布局路由保护整个路由子树
- 集中式认证逻辑
- 自动保护所有子路由
- 认证路由与公开路由清晰分离
组件级保护
- 组件内部的条件渲染
- 对 UI 状态更细粒度的控制
- 适合同一路由上混合公开/私有内容
- 需要小心处理以避免布局抖动
数据/API 保护(安全边界)
- 授权每一个读写私有数据的服务器函数、服务器路由或 API 端点
- 即使没有先加载受保护的路由,也要拒绝未授权请求
- 把路由守卫(route guard)当作 UX 和导航控制,而不是数据边界
状态管理模式
服务器驱动状态(推荐)
- 每个请求都从服务器获取认证状态
- 始终与服务端状态保持同步
- 与 SSR 无缝配合
- 最安全——服务器是事实来源(source of truth)
基于上下文的状态
- 客户端认证状态管理
- 适合第三方认证服务商(Auth0、Firebase)
- 需要与服务端状态小心同步
- 适合交互性很强的客户端优先应用
混合方式
- 初始状态来自服务器,客户端更新
- 在安全与 UX 之间取得平衡
- 定期做服务端校验
认证选项
🏢 合作伙伴方案
🛠️ DIY 自建认证
使用 TanStack Start 的服务器函数和会话管理,构建你自己的认证系统。从认证服务器原语指南开始——它涵盖了会话 cookie(HttpOnly/Secure/SameSite/__Host-)、把会话查找做成中间件、OAuth state + PKCE、密码重置的枚举防御、CSRF、限流和会话轮换,并给出了能抓住常见错误的 WRONG/CORRECT 模式对比。
- 完全掌控:对认证流程的完全自定义
- 服务器原语:会话、OAuth、CSRF、限流——见认证服务器原语
- 会话管理:通过
setResponseHeader设置 HTTP-only cookie,用getRequestHeader读取 - 类型安全:认证状态的端到端类型安全
🌐 其他优秀方案
开源与社区方案:
- Better Auth——现代、TypeScript 优先的认证库
- Auth.js(原名 NextAuth.js)——流行的 React 认证库
托管服务:
- Supabase Auth——内置认证的开源 Firebase 替代品
- Auth0——功能丰富的成熟认证平台
- Firebase Auth——Google 的认证服务
合作伙伴方案
WorkOS——企业级认证
- 单点登录(SSO)——SAML、OIDC 和 OAuth 集成
- 目录同步——与 Active Directory 和 Google Workspace 的 SCIM 供应
- 多因素认证——企业级安全选项
- 合规就绪——符合 SOC 2、GDPR 和 CCPA
Clerk——完整的认证平台
- 即用的 UI 组件——登录、注册、用户资料和组织管理
- 社交登录——Google、GitHub、Discord 以及 20+ 个服务商
- 多因素认证——短信、TOTP 和备用代码
- 组织与团队——对团队应用的内置支持
访问 Clerk → | 免费注册 → | 查看示例 →
示例
合作伙伴方案:
DIY 实现:
客户端示例:
架构决策指南
选择认证方案
合作伙伴方案:
- 专注于你的核心业务逻辑
- 企业级特性(SSO、合规)
- 托管的安全与更新
- 预制 UI 组件
开源方案:
- 社区驱动开发
- 特定定制
- 自托管方案
- 避免厂商锁定
DIY 实现:
- 对认证流程的完全控制
- 自定义安全要求
- 特定业务逻辑需求
- 认证数据的完全所有权
生产认证检查清单
- 生产环境使用 HTTPS,并设置一个强会话密钥。
- 把会话存储在
HttpOnly、Secure、SameSitecookie 中。不要把会话令牌存在localStorage或sessionStorage中。 - 在每个读写私有用户、租户或账户数据的服务器函数、服务器路由或 API 端点中强制认证。用
beforeLoad处理页面 UX,而不是作为数据边界。 - 在每个接受输入的服务器函数上使用
.validator()。 - 用 bcrypt、scrypt 或 Argon2 哈希密码。对于不存在的用户,用一个 dummy 哈希做验证,并返回相同的登录/重置消息。
- 对登录、注册和密码重置端点做限流。
- 对非 GET 的服务器函数和服务器路由使用 CSRF 或同源保护。
- 记录认证事件并监控失败。
- 测试对受保护服务器函数的直接未认证调用;它们应该在返回数据之前就被拒绝。
下一步
资源
实现指南:
- 认证服务器原语——会话、cookie、OAuth、CSRF、限流(服务端这一半)
- 认证模式
- Router 认证指南
基础概念:
分步教程: