replica-backend
读取 replica/architecture.md。编写迁移和服务器代码,并保持 replica/backend.md(见下方清单)为最新状态。
规则
- 仅使用官方、公开的 API,并使用用户自己的密钥。 绝不要调用原始应用的私有端点,绝不要复用其 OAuth 客户端,绝不要通过它进行代理。
- 用户创建账户和密钥。 代理绝不注册服务,绝不输入密码、信用卡或真实密钥。用户创建 Stripe、Supabase、Resend 或 Google Cloud 项目,并将密钥放入
.env.local。代理编写.env.example,包含每个变量名且不包含值。 - 先使用测试模式。 使用 Stripe 测试密钥和测试卡,直到 replica-deploy。
身份认证
- 邮箱注册与验证、密码重置、如果原始应用有的话则包括魔法链接。OAuth(Google、Apple)使用用户自己的开发者应用。
- 会话:http-only 安全 Cookie。所有地方登出。
- 如果重新映射图中有角色和团队:所有者、管理员、成员,并提供一个函数来回答“此用户能否对此记录执行此操作”。
- 账户删除必须实际删除。Apple 要求提供注册功能的应用必须这样做。
数据库
- 从
architecture.md生成的迁移脚本,已检入,由脚本运行。 - 每张表的访问规则:Supabase 上的行级安全策略,或在每个查询中调用授权函数。测试:第二个用户必须什么也拿不到。
- 使用逼真的虚假数据(无真人数据)的种子脚本。
- 备份(主机的每日备份计数,检查它们是否已启用)。
支付
- 使用 Stripe Checkout 注册套餐,使用客户门户进行更改和取消。不要构建卡表单。
- Webhook:验证签名,存储事件 ID,使每个处理程序具有幂等性(Stripe 会重试)。处理
checkout.session.completed、customer.subscription.updated、customer.subscription.deleted、invoice.payment_failed。 - 订阅状态存在于你的数据库中,由 Webhook 更新,由你的应用读取。永远不要信任客户端。
- 取消只需点击一次。难以取消的计费是大多数应用最常见的投诉之一,在许多地方也是非法的。
邮件和任务
- 通过 Resend 或 Postmark 从你自己的域名发送事务性邮件。模板全新编写。
- 任何基于时间的任务(提醒、摘要、同步、清理)都使用任务处理,支持重试和死信日志。时间使用 UTC,并在用户的时区显示。
集成
对于功能矩阵中的每个集成:官方 API、所需的 OAuth 作用域(尽可能少)、提供商的审核流程、速率限制。像 Calendar 这样的 Google 作用域在公开发布前需要 Google 的 OAuth 验证,这需要数周时间。尽早开始,并在 backend.md 中写明。
安全检查清单
- 机密仅存在于环境变量中,
.env*在.gitignore中,客户端包中不包含任何机密 - 在每个路由上进行服务器端输入验证(zod 或类似工具)
- 每次读取和写入都检查授权,并使用第二个用户进行测试
- 对身份认证、注册以及任何发送邮件或短信的操作进行速率限制
- Webhook 验证签名
- 上传:大小和类型限制,从单独的域或存储桶提供
- URL 或日志中不包含用户数据
- 依赖项审计(
npm audit) - 隐私政策列出所有处理方(Stripe、Resend、主机、分析工具)
输出
可工作的身份认证、数据库、测试模式下的支付、邮件和集成,.env.example,replica/backend.md,其中清单已勾选,功能矩阵行已更新。下一步:/replica-test。