TanStack Start 中文文档
认证与数据

认证总览

认证与授权

  • 认证(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 认证库

托管服务:

合作伙伴方案

WorkOS——企业级认证

WorkOS

  • 单点登录(SSO)——SAML、OIDC 和 OAuth 集成
  • 目录同步——与 Active Directory 和 Google Workspace 的 SCIM 供应
  • 多因素认证——企业级安全选项
  • 合规就绪——符合 SOC 2、GDPR 和 CCPA

访问 WorkOS → | 查看示例 →

Clerk——完整的认证平台

Clerk

  • 即用的 UI 组件——登录、注册、用户资料和组织管理
  • 社交登录——Google、GitHub、Discord 以及 20+ 个服务商
  • 多因素认证——短信、TOTP 和备用代码
  • 组织与团队——对团队应用的内置支持

访问 Clerk → | 免费注册 → | 查看示例 →

示例

合作伙伴方案:

DIY 实现:

客户端示例:

架构决策指南

选择认证方案

合作伙伴方案:

  • 专注于你的核心业务逻辑
  • 企业级特性(SSO、合规)
  • 托管的安全与更新
  • 预制 UI 组件

开源方案:

  • 社区驱动开发
  • 特定定制
  • 自托管方案
  • 避免厂商锁定

DIY 实现:

  • 对认证流程的完全控制
  • 自定义安全要求
  • 特定业务逻辑需求
  • 认证数据的完全所有权

生产认证检查清单

  • 生产环境使用 HTTPS,并设置一个强会话密钥。
  • 把会话存储在 HttpOnlySecureSameSite cookie 中。不要把会话令牌存在 localStoragesessionStorage 中。
  • 在每个读写私有用户、租户或账户数据的服务器函数、服务器路由或 API 端点中强制认证。用 beforeLoad 处理页面 UX,而不是作为数据边界。
  • 在每个接受输入的服务器函数上使用 .validator()
  • 用 bcrypt、scrypt 或 Argon2 哈希密码。对于不存在的用户,用一个 dummy 哈希做验证,并返回相同的登录/重置消息。
  • 对登录、注册和密码重置端点做限流。
  • 对非 GET 的服务器函数和服务器路由使用 CSRF 或同源保护。
  • 记录认证事件并监控失败。
  • 测试对受保护服务器函数的直接未认证调用;它们应该在返回数据之前就被拒绝。

下一步

资源

实现指南:

基础概念:

分步教程:

On this page