Add the token runtime schema alignment notes, record the keep-and-thread-through decision in the execution log, and mark P1-B analysis tasks complete in the master plan.
7.6 KiB
2026-04-21 Token Runtime Schema Alignment Notes
1. 输入范围
sql/postgresql/token_runtime_schema_v1.sqlplatform-token-runtime/internal/auth/service/inmemory_runtime.goplatform-token-runtime/internal/auth/service/postgres_runtime_store.goplatform-token-runtime/internal/auth/service/postgres_audit_store.goplatform-token-runtime/internal/auth/service/token_verifier.goplatform-token-runtime/internal/httpapi/token_api.go
2. P1-B-01 Schema 字段落点
2.1 auth_platform_tokens
来源:sql/postgresql/token_runtime_schema_v1.sql:11
| 字段 | 列位置 | 说明 |
|---|---|---|
tenant_id |
sql/postgresql/token_runtime_schema_v1.sql:16 |
token 归属租户 |
project_id |
sql/postgresql/token_runtime_schema_v1.sql:17 |
token 归属项目 |
operator_id |
无 | 当前 token 主表没有该列 |
metadata |
无 | 当前 token 主表没有该列 |
2.2 auth_token_audit_events
来源:sql/postgresql/token_runtime_schema_v1.sql:47
| 字段 | 列位置 | 说明 |
|---|---|---|
tenant_id |
sql/postgresql/token_runtime_schema_v1.sql:57 |
审计事件租户 |
project_id |
sql/postgresql/token_runtime_schema_v1.sql:58 |
审计事件项目 |
operator_id |
sql/postgresql/token_runtime_schema_v1.sql:59 |
操作人 |
metadata |
sql/postgresql/token_runtime_schema_v1.sql:61 |
事件附加信息 |
3. P1-B-02 当前模型缺口
3.1 TokenRecord
来源:platform-token-runtime/internal/auth/service/inmemory_runtime.go:18
当前字段:
TokenIDAccessTokenSubjectIDRoleScopeIssuedAtExpiresAtStatusRequestIDRevokedReason
与 schema / canonical principal 的差异:
- 缺
TenantID - 缺
ProjectID - 不承载
OperatorID - 不承载
Metadata
3.2 IssueTokenInput
来源:platform-token-runtime/internal/auth/service/inmemory_runtime.go:31
当前仅包含 SubjectID、Role、Scope、TTL、RequestID、IdempotencyKey,没有 TenantID、ProjectID、Metadata。
3.3 VerifiedToken
来源:platform-token-runtime/internal/auth/service/token_verifier.go:42
当前仅包含 TokenID、SubjectID、Role、Scope、IssuedAt、ExpiresAt、NotBefore、Issuer、Audience,缺 TenantID,与最新 canonical principal 约束不一致。
3.4 AuditEvent
来源:platform-token-runtime/internal/auth/service/token_verifier.go:66
当前仅包含 EventID、EventName、RequestID、TokenID、SubjectID、Route、ResultCode、ClientIP、CreatedAt,缺:
TenantIDProjectIDOperatorIDMetadata
4. P1-B-03 单一决策
决策:保留字段并贯穿
理由:
tenant_id已进入最小 canonical principal 契约,不能再通过删除字段回退。project_id、operator_id、metadata已进入现有 schema,且 Phase 1 目标明确要求补齐证据链与审计闭环,此时删除只会扩大文档、DDL 与代码的漂移面。- 当前问题不是“字段多余”,而是“DDL 已定义但模型和 store 没有贯穿”;收缩契约会让后续多租户和审计治理重新返工。
5. P1-B-04 字段迁移顺序
按以下单轨顺序执行:
model更新TokenRecord、IssueTokenInput、VerifiedToken、AuditEvent、AuditEventFilter的字段定义。store先改runtime_store.go/postgres_runtime_store.go,再改audit_store.go/postgres_audit_store.go的读写映射。API更新token_api.go的issue请求、introspect响应、audit-events输出与过滤参数。audit把 middleware、issue / refresh / revoke / introspect 的发射点补齐tenant_id、project_id、operator_id、metadata来源。tests补充 runtime store、audit store、HTTP API、middleware 的字段断言与回归验证。
6. P1-B-05 删除路线说明
不采用删除路线。
按 P1-B-03 的单一决策,当前不编写 shrink SQL,也不定义 existing DB 的收缩策略;后续实施只走“保留字段并贯穿”。
7. P1-B-06 postgres_runtime_store.go 字段映射检查
7.1 INSERT / UPSERT
来源:platform-token-runtime/internal/auth/service/postgres_runtime_store.go:84
当前已写入:
token_idtoken_fingerprinthash_algosubject_idrole_codescope_jsonstatusissued_atexpires_atrevoked_reasonrevoked_atissue_request_idissue_idempotency_keyissue_request_hash
当前未写入 schema 已存在列:
tenant_idproject_idlast_seen_atcreated_at/updated_at依赖 DB 默认值,不是问题
7.2 SELECT
来源:
platform-token-runtime/internal/auth/service/postgres_runtime_store.go:156platform-token-runtime/internal/auth/service/postgres_runtime_store.go:167
当前读取:
token_idsubject_idrole_codescope_jsonstatusissued_atexpires_atissue_request_idrevoked_reason
当前未读取 schema 已存在列:
tenant_idproject_idtoken_fingerprintrevoked_atlast_seen_at
结论:
- runtime store 当前只覆盖了最小旧字段集,没有贯穿多租户 / 项目字段。
- 即使 OpenAPI 已补
tenant_id,代码运行态仍无法产出该字段,后续必须先补 model 和 store。
8. P1-B-07 postgres_audit_store.go 字段映射检查
8.1 Emit
来源:platform-token-runtime/internal/auth/service/postgres_audit_store.go:68
当前写入:
event_idevent_namerequest_idtoken_idsubject_idrouteresult_codeclient_ipcreated_at
当前未写入 schema 已存在列:
tenant_idproject_idoperator_idmetadata
8.2 QueryEvents
来源:platform-token-runtime/internal/auth/service/postgres_audit_store.go:121
当前读取 / 过滤:
event_idevent_namerequest_idtoken_idsubject_idrouteresult_codeclient_ipcreated_at
当前未读取 / 未过滤:
tenant_idproject_idoperator_idmetadata
结论:
- audit schema 已预留审计闭环字段,但
AuditEvent/AuditEventFilter/ Postgres store 三层都没有承接。 - 这会导致数据即使以后由其他地方补写,也无法通过当前查询接口读出和验证。
9. P1-B-08 最小执行清单
9.1 改 model
- 给
TokenRecord补TenantID、ProjectID - 给
IssueTokenInput补TenantID、ProjectID、Metadata - 给
VerifiedToken补TenantID - 给
AuditEvent补TenantID、ProjectID、OperatorID、Metadata - 给
AuditEventFilter补TenantID、ProjectID、OperatorID
9.2 改 SQL / store
runtime_store.go持久化并返回TenantID、ProjectIDpostgres_runtime_store.go的INSERT/SELECT/UPSERT同步tenant_id、project_idaudit_store.go与postgres_audit_store.go同步tenant_id、project_id、operator_id、metadata
9.3 改 API
token_api.go的issue请求体补字段入口token_api.go的introspect响应补tenant_idaudit-events查询与返回体补齐审计扩展字段
9.4 改 tests
postgres_runtime_store_test.go增加tenant_id/project_id断言postgres_audit_store_test.go增加operator_id/tenant_id/metadata断言token_api_test.go增加 issue/introspect/audit-events 字段断言- middleware / executable tests 增加审计字段传递断言
9.5 跑验证
cd "/home/long/project/立交桥/platform-token-runtime" && GOCACHE=/tmp/lijiaoqiao-go-cache-platform-token-runtime go test ./...cd "/home/long/project/立交桥" && bash scripts/ci/repo_integrity_check.sh