SuperAPI AI 工具集

convex-setup-auth

安全与审计

查看项目

更新于 10-13 20:08

技能介绍

Convex Authentication Setup 用于在 Convex 中实现安全的认证、用户管理与访问控制。

用途

  • 首次为 Convex 应用设置认证。
  • 实现用户管理(users 表、身份映射)。
  • 创建认证辅助函数。
  • 设置认证提供商:Convex Auth、Clerk、WorkOS AuthKit、Auth0、自定义 JWT。

不适用场景

  • 非 Convex 后端的认证。
  • 纯 OAuth/OIDC 文档,不涉及 Convex 实现。
  • 与认证无关、只是碰巧出现在认证代码附近的调试问题。
  • 认证提供商已完全配置好,只需一行修复的情况。

第一步:选择认证提供商 Convex 支持多种认证方式,不要默认某一提供商。在编写设置代码前:

  • 除非仓库已明确表明,否则先询问用户想用哪种认证方案。
  • 如果仓库已使用某提供商,除非用户想切换,否则沿用该提供商。
  • 如果用户未选择且仓库未明确,先询问再继续。

常见选项:

  • Convex Auth:当用户希望由 Convex 直接处理认证时的良好默认选择。
  • Clerk:应用已使用 Clerk,或用户需要 Clerk 托管认证功能时使用。
  • WorkOS AuthKit:应用已使用 WorkOS,或用户明确需要 AuthKit 时使用。
  • Auth0:应用已使用 Auth0 时使用。
  • 自定义 JWT 提供商:集成上述未覆盖的现有认证系统时使用。

询问前先查找仓库中的信号:

  • 依赖:@clerk/、@workos-inc/、@auth0/* 或 Convex Auth 包。
  • 现有文件:convex/auth.config.ts、认证中间件、提供商包装器或登录组件。
  • 明确指向某提供商的环境变量。

选择提供商之后 阅读该提供商的官方指南以及对应的本地参考文件:

  • Convex Auth:官方文档,然后 references/convex-auth.md
  • Clerk:官方文档,然后 references/clerk.md
  • WorkOS AuthKit:官方文档,然后 references/workos-authkit.md
  • Auth0:官方文档,然后 references/auth0.md

本地参考文件包含具体工作流、预期文件与环境变量、注意事项和验证检查。这些来源用于:包安装、客户端提供商接线、环境变量、convex/auth.config.ts 设置、登录与登出 UI 模式、React/Vite/Next.js 框架特定设置。

共享认证行为以 Convex 官方文档为准:

  • Auth in Functions:ctx.auth.getUserIdentity()
  • Storing Users in the Convex Database:可选的 app 级用户存储
  • Authentication:通用认证与授权指导
  • Convex Auth Authorization:提供商为 Convex Auth 时

优先使用官方文档而非凭记忆的步骤,因为提供商 CLI 与 Convex Auth 内部实现会随版本变化,凭记忆编造设置可能带来过时模式。对第三方提供商,仅当应用确实需要在 Convex 中存储用户文档时才添加 app 级用户存储,并非每个应用都需要 users 表。对 Convex Auth,遵循其文档和内置认证表,不要额外添加并行的 users 表加 storeUser 流程,因为 Convex Auth 已在内部管理用户记录。运行提供商初始化命令后,需检查生成文件并完成提供商参考中列出的初始化后接线步骤;初始化命令很少能完成整个集成。

核心模式:保护后端函数 最常见的认证任务是在 Convex 函数中检查身份。

// Bad: trusting a client-provided userId
export const getMyProfile = query({
  args: { userId: v.id("users") },
  handler: async (ctx, args) => {
    return await ctx.db.get(args.userId);
  },
});

// Good: verifying identity server-side
export const getMyProfile = query({
  args: {},
  handler: async (ctx) => {
    const identity = await ctx.auth.getUserIdentity();
    if (!identity) throw new Error("Not authenticated");

    return await ctx.db
      .query("users")
      .withIndex("by_tokenIdentifier", (q) =>
        q.eq("tokenIdentifier", identity.tokenIdentifier),
      )
      .unique();
  },
});

工作流

  1. 确定提供商:询问用户或从仓库推断。
  2. 询问用户现在只做本地设置还是直接做生产就绪设置。
  3. 阅读匹配的提供商参考文件。
  4. 按官方提供商文档获取当前设置细节。
  5. 按官方 Convex 文档处理共享后端认证行为、用户存储与授权模式。
  6. 仅当文档与应用需求要求时才添加 app 级用户存储。
  7. 仅在应用需要时添加归属、角色或团队访问的授权检查。
  8. 如需,验证登录状态、受保护查询、环境变量与生产配置。

如果流程因提供商或部署的交互式设置而阻塞,明确向用户说明所需的人工步骤,待其完成后继续。对于面向 UI 的认证流程,可在设置完成后提出验证真实的注册或登录流程;若环境有浏览器自动化工具可使用,否则给用户一份简短的人工验证清单。

参考文件 提供商参考:

  • references/convex-auth.md
  • references/clerk.md
  • references/workos-authkit.md
  • references/auth0.md

检查清单

  • 编写设置代码前已选择正确的认证提供商
  • 已阅读相关提供商参考文件
  • 已询问用户要本地设置还是生产就绪设置
  • 提供商特定接线使用官方提供商文档
  • 共享认证行为与授权模式使用官方 Convex 文档
  • 仅在应用确实需要时才添加 app 级用户存储
  • 未为 Convex Auth 发明跨提供商的 users 表或 storeUser 流程
  • 在受保护后端函数中添加认证检查
  • 在应用确实需要处添加授权检查
  • 错误消息清晰(“Not authenticated”、“Unauthorized”)
  • 已为所选提供商配置客户端认证提供商
  • 如被要求,生产认证设置也已覆盖