# Base44 组合流程

## 更新记录

- 2026-07-16: 创建 Base44 Web、Function、Go 和 Supabase 分层。
- 2026-07-16: 统一 core 客户端上下文、幂等键模块和领域错误链。
- 2026-07-16: 增加可信 Base44 用户到短时 RS256 assertion 的访问申请链路。
- 2026-07-16: 将通用用户解析复用到 core，并集中固定路径和页面请求体安全规则。

```text
Base44 Web
  │  只提交页面动作、申请说明和幂等键
  ▼
CreateSupabaseClient
  │  明确的 Auth / Crud / Platform / Admin 方法
  ▼
Base44 Backend Function
  │  core ResolveBase44User 调用 auth.me()；读取受控 Provider App ID
  │  为每次调用签发唯一 JTI、最长 60 秒的 RS256 assertion
  ▼
CreateSupabaseFunctionHandler
  │  三个 Base44 固定路径重建 Body；其余路径处理 Go Token
  ▼
go_qoder_file
  │  验 assertion、映射 App、限流、幂等、Session/Permission
  ▼
Supabase
```

`CreateSupabaseClient` 通过 core `CreateFacadeClientContext` 统一处理远程 Function、已存在 Handler 和本地默认 Handler。Go Token、领域 envelope、assertion 和幂等键仍由本 facade 处理，不下沉到通用 core。

可信 Base44 用户解析通过 core `ResolveBase44User` 复用；它只负责 `auth.me()` 和登录态判断。Go 固定路径由 `service_paths.js` 集中维护，页面 Body 白名单与安全重建由 `base44_request.js` 负责；assertion claims、Go 路由、幂等和错误字段仍属于本 facade，不能下沉到通用 core。

访问申请固定映射：

| 客户端方法 | Go 路径 | 最终 Body | Go Bearer | 幂等 Header |
| --- | --- | --- | --- | --- |
| `GetBase44AccessStatus()` | `/auth/base44/access-status` | `{ assertion }` | 无 | 无 |
| `CreateBase44AccessRequest(...)` | `/auth/base44/access-requests` | `{ assertion, request_message }` | 无 | 有 |
| `ExchangeCurrentBase44User()` | `/auth/base44/exchange` | `{ assertion }` | 无 | 无 |

安全边界：

- Web 只持有 Go 登录令牌；
- npm 包不需要 Supabase URL、Secret 或 `service_role` Key；
- Go 服务端持有 Supabase 高权限密钥；
- 浏览器 Actor、App、Permission 等服务端字段不能覆盖；
- Base44 `sub/email/is_verified/disabled` 只来自服务端 SDK，`provider_app_id` 只来自 Function 配置；
- assertion、JTI、私钥和 Go Session Token 不写日志、不返回浏览器；
- 三个 Base44 响应使用 `Cache-Control: no-store`，不启用用户身份 Header 转发；
- 通用 CRUD 继续服从 Go 表、列、操作符和权限白名单；
- RLS 应作为数据库侧第二道安全边界，但不能替代 Go 的领域鉴权。

当前实现刻意不包含：

- 任意 PostgREST URL 透传；
- 任意 RPC 名称透传；
- `/ts/xdata`；
- 通用 hard delete；
- Supabase Secret 配置。

## 扩展原则

- React 新增调用时，先确认 Go 已注册固定路由。
- 复杂业务优先新增 Go 固定领域接口，不扩展任意 RPC 透传。
- 通用 CRUD 新字段必须同时核对 Go request parser 和白名单。
- 平台/管理写接口统一从 `idempotency_key.js` 取得幂等键。
- 公开 Auth 路由必须加入明确集合，不能用宽泛字符串判断跳过 Authorization。

完整流程见 [AI 快速开发指南](ai_development.md)。
