承接目录治理:上轮只压缩内容未减文件数,闭线工作记录仍平铺致目录看着仍一堆(创始人指出)。本次执行 B2 归档。 64 个 ≤06-15 闭线档(25 压缩桩 + 闭线 review/report/纪要/edit-plan)git mv 入 docs/agent-specs/_archive/(文件名不变、仍 git 跟踪可查)。热目录 ≤06-15 仅留 13 活档(决策/纲领/SoT/活spike)+13 个 06-16 在飞。 活资产 20 处旧路径引用(.agents/docs/memory/_index)同步改 _archive/,引用断裂复测=0;_index 活地图 + 治理档状态收口。约束:0 个 06-16 被移、orchestrator 等未跟踪在飞档零误纳。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 KiB
真实鉴权与匿名玩家身份 — 评审版(创始人拍板用)
文档类型:Review(结论先行,供拍板;定稿后另出 execution 版) 日期:2026-06-10 | 状态:✅ 已拍板(2026-06-10 创始人七项全拍,结果见 §9.1)→ 待出 execution 版排建设(建议 M-b 之后) | 作者:架构 Agent 关联:
docs/agent-specs/2026-06-09-下一阶段路线-plan.md:79("真实鉴权…建显式 backlog"——本文即该 backlog 落实);A 轨种子名单(A2)到位即卡此件 修订记录:2026-06-10 双镜头评审(CEO+Eng)11 条意见全部采纳落稿——①拆准入拍板项(玩家注册 vs 创作白名单)并在漏斗图标明非白名单去向;②如实摊开"报备前玩家侧注册转化不可用"时序阻塞+短信报备今天进 A 轨闸门看板;③登录方式选项补全 B 权衡并增 C 混合项;④依赖改两级(短信=硬闸门/隐私文案=软前置)+P-ACC-02 口径调整声明;⑤⑨"与 glossary 完全对齐"改为显式变更声明;⑥保留期降为既定假设;⑦新增 §5A 匿名身份安全边界(伪造/刷量/bot 排除三联);⑧新增 R6 发码端点滥用;⑩计数口径修为 app 28 处/7 文件;⑪生产 profile 未建立注记;⑫平迁断言标注推断。意见原文核验:所有代码/文档引用均经本仓复读证实。
0. 结论先行
推荐方案乙:不复活 member 模块,在 huijing system 基座上做"最小玩家身份"——匿名免登读路径(刷 feed/试玩零门槛)+ 手机验证码登录发真 OAuth2 token(userType=MEMBER)+ 创作/发布种子期限 A2 白名单(玩家注册是否开放为独立拍板项);staging 的 mock(test1) 与真实鉴权天然并存、批跑不断,生产环境关死 mock。
- 体量:后端薄层 + 前端登录页/守卫,AI 压缩后约 3–5 个有效工作日(推断),远小于复活 member(约 1.5–2 周,含裁剪与装配返工)。
- 外部依赖分两级:硬日历闸门 = 生产短信签名报备(影响通道切换与玩家转化,今天即加入 A 轨闸门看板,行动项见 R2);软前置 = 隐私政策/用户协议文案(可占位文案过渡,正式拉新前须法务定稿,挂 A 轨;P-ACC-02 口径调整声明见 §3)。
- 时序如实摊开:短信报备完成前,Debug 短信通道(验证码落库、后台查码、人工下发)只对 5 个已知种子创作者可运营;分享链路来的陌生玩家,运营不知道把码发给谁——玩家侧"互动触发一键登录→注册"在报备前实质不可用。种子期是否需要在报备前激活玩家转化漏斗,是本件最尖锐的拍板项(§9-2,与登录方式 §9-1 联动)。
- 报备完成后切真实渠道≈配置切换、无二次改造,但有安全前置:发码端点必然免登,须先补按 IP/设备限频与图形验证码开关(现状为上游 TODO + captcha 关闭,见 R6)——不要把"切渠道"理解为纯配置动作。
- 需创始人拍板的产品方向问题见 §9:登录方式与漏斗激活时机(联动)/ 准入语义(玩家注册、创作白名单分开拍)/ 游客转正机制 / 实名收集时点 / 匿名身份机制。
1. 背景与现状(亲核事实,标注出处)
1.1 mock 鉴权怎么 mock 的
| 事实 | 出处 |
|---|---|
huijing 框架原生 mock:mock-enable=true 时,token 以 test 开头即直造登录态,test1→userId=1;撤 mock=改一行配置,无代码改动 |
game-cloud/huijing-framework/huijing-spring-boot-starter-security/.../TokenAuthenticationFilter.java:117-129、SecurityProperties.java:34-40 |
| 校验顺序=先查真 OAuth2 token,查不到才走 mock——真实鉴权与 mock 天然可并存 | TokenAuthenticationFilter.java:60-65 |
staging/local 均 mock-enable: true;tenant.enable: false(单租户);验证码关 |
huijing-server/.../application-staging.yaml:152-157 |
userType 按 URL 前缀推导:/app-api→MEMBER(1)(创作者/玩家),/admin-api→ADMIN(2)(运营) |
WebFrameworkUtils.java:105-122、UserTypeEnum.java:17-18 |
staging 批跑(黄金闭环 e2e、agent 化生成 QA 闭环)全依赖 Bearer test1 |
记忆 golden-loop-b1-done、game-studio/.env.staging:5 |
1.2 既有能力盘点(都在,不用新造轮子)
| 能力 | 现状 | 出处 |
|---|---|---|
| C 端账号模块 member | 已整体裁剪(11 个 demo 模块之一),无目录、server 引用被注释 | game-cloud/pom.xml:16、huijing-server/pom.xml:96 |
| OAuth2 token 服务 | system 基座完备,user-type 无关:可直接发 userType=MEMBER 的真 token,框架过滤器原生校验 | OAuth2TokenApiImpl.java:28、OAuth2AccessTokenCreateReqDTO.java:23 |
| 短信验证码 | 场景化验证码 API(MEMBER_LOGIN 场景已内置)+ 5 个渠道客户端(阿里云/腾讯/华为/七牛/Debug钉钉) |
system/api/sms/SmsCodeApi.java、SmsSceneEnum.java:19、framework/sms/core/client/impl/ |
| 管理端登录 | game-admin 原生 Login.vue + system 账密/短信登录端点齐备,staging 已实证可用(20 真实用户) | game-admin/src/views/Login/、AuthController.java、记忆 m1-runtime-bringup-state |
| 前端匿名 ID | ensureAnonId() localStorage 持久化;遥测上报已带 user:{userId, anonId} 双身份 |
game-studio/src/store/user.ts:10-24、src/telemetry/index.ts:143-160 |
| 遥测契约匿名位 | UserVO{userId, anonId}("匿名 token 派生的稳定匿名 ID")契约已锁定 |
EnvelopeReqVO.java:61-66、contracts/events.schema.json |
| 既定设计意向 | "匿名玩家通过 framework 层扩展的匿名 Token 机制接入,只能浏览试玩、不能发布/收藏/进后台" | .agents/knowledge/glossary.md:40 |
1.3 缺口与既有错位
- app-api 无任何登录端点(member 裁剪后 C 端鉴权整体缺位);**app 控制器 28 处
getLoginUserId()(7 文件)**全靠 mock 喂身份,另有 admin 控制器 3 处(3 文件:AdminProjectController/ComplianceBanController/TradeAdminController)——admin 侧自 M1 起有真实登录,不在撤 mock 的 C 端回归面内(grep 实证,合计 31 处/10 文件)。 - app-api 全部强制登录:feed/runtime/telemetry 无一处
@PermitAll(grep 0 命中)——今天"匿名刷 feed"实际不可能,靠 test1 掩盖。 - 身份错位既有 bug:前端固定
userId='1001'(store/user.ts:30)vs 后端 mocktest1→userId=1——同一行为遥测记 1001、互动落库记 1,数据归属已错位。这是 mock 的真实危害样本,真实登录后自然消除。 - 前端无登录 UI、无路由守卫(views/ 无 login,router 无 beforeEach;
setLogin/logout已预留空挂点store/user.ts:44-57)。 - 产品口径:MVP 黄金链路第一步="创作者登录"(
.agents/knowledge/mvp-scope-and-milestones.md:11);账号 owner=system 基座(需求模块映射.md:237,258);安全基线=OAuth2+JWT+Refresh 轮换 7d/30d、手机号脱敏、隐私政策注册前展示(.agents/rules/security-and-reliability.md:15,113,151)。
2. 目标
- 种子创作者真实登录:手机号验证码登录→创作→发布全链真 token,支撑 A2 种子名单到位即可试用(白名单只限创作/发布、内容风险可控;玩家注册是否开放为独立拍板项,见 §9-3/§9-4——两者语义不同,勿混)。
- 匿名玩家零门槛:不注册即可刷 feed、试玩、被遥测(短视频式体验);互动/创作才要求身份。
- 身份数据可衔接:匿名 anonId ↔ 登录 userId 可关联(登录事件绑定),点赞收藏归属真实 userId,为后续支付实名留好挂点。
- staging 批跑零中断:mock 与真实鉴权并存;生产关死 mock 并有负路径验证。
3. 非目标(明确不做)
- 第三方社交登录(微信/抖音/小程序授权):MVP 不做;渠道版与小游戏提审闸门联动时再评。
- 多租户:维持
tenant.enable=false单租户;数据行保留tenant_id=1兼容,不开租户拦截。 - 生产短信供应商采购与签名报备:属 A 轨日历闸门(记忆
mvp-binding-constraint-calendar-gates),不在本设计内,但是切真实短信通道的前提。 - 防沉迷/学生账号(P-BIZ-11)、适龄分级展示(P-ACC-03):均 v2.0(
产品需求清单.md:216,239)。 - member 式运营包袱:积分/等级/签到/标签/分组;账号全功能(找回密码/换绑/注销)只留最小集(验证码登录天然免密码体系)。
口径调整声明(P-ACC-02 提前):隐私政策/用户协议展示(P-ACC-02)在产品需求清单中原排 v2.0(
产品需求清单.md:238),但安全基线要求"隐私政策注册前展示"(.agents/rules/security-and-reliability.md)——本件验收标准 5 实质把它以占位文案形式提前到 MVP。处理方式:占位文案随注册页一并上线(软前置);正式文案法务定稿挂 A 轨隐私协议项,不视为 P-ACC-02 的 v2.0 全功能整体提前,避免与产品清单排期打架。
4. 方案对比(2 个可行 + 1 个反例)
| 维度 | 甲:复活 huijing-module-member 全量 | 乙:system 基座最小玩家身份(推荐) | 丙:纯匿名 + 创作者借用 ADMIN 体系 |
|---|---|---|---|
| 做法 | 从上游恢复 member 模块(用户表/AppAuth/profile),裁掉积分等级等无关件 | 新增 game_player 表 + app 端登录端点;复用 system 的 SmsCodeApi+OAuth2TokenApi 发 MEMBER 真 token;读路径 @PermitAll+anonId |
玩家全匿名;创作者用 system 账号走 ADMIN token |
| 体量(推断) | ~1.5–2 周:恢复+裁剪+M1 装配教训重走(repackage/Flyway/CommonApi @Primary,记忆 m1-runtime-bringup-state) |
~3–5 天:后端薄层 + 前端登录页/守卫 + e2e | ~1–2 天 |
| 单租户契合 | member 自带租户/多端包袱,逆向裁剪 | 原生贴合,表带 tenant_id=1 即可 | — |
| 演进性 | 微信小程序登录等开箱(远期优势) | 实名/转正/三方登录挂点预留;真需要 member 时迁移路径存在(推断:平迁成立条件=member_user 表从未启用、ID 段不冲突,且 OAuth2 token 内 userId 语义切换需迁移映射——成本待执行版评估) | 死路:ADMIN token 调 app-api 被 userType 校验拒(TokenAuthenticationFilter.java:92-95),要么破坏 API 约定要么放宽安全边界 |
| 风险 | 大块外来代码引入审计面;MVP 窗口占用 | fork 侵入面小(新增包路径隔离) | 身份模型畸形:互动无归属、实名无挂靠,违背 glossary 既定意向 |
| 结论 | 远期备选(需要会员运营体系时再评) | 采纳 | 仅作反例,否决 |
推荐乙的核心理由:①账号 owner=system 是三文档套件既定口径(Doc C:258),扩展落点与文档一致、零跨模块 RPC;②OAuth2/SMS/过滤器全是现成基座能力,新写的只有"一张表+三个端点+一个登录页";③匿名行为边界与 glossary 既定意向一致(只能浏览试玩、不能发布/收藏/进后台),但实现机制是对既定意向的显式变更——由"framework 层匿名 Token"简化为免登读+anonId(更克制;变更声明、安全代价与待回写文档清单见 §5 关键设计点 1 与 §5A),属文档级返工(glossary 词条+契约 anonId 描述需同步修订),无代码级返工。 落点工程细节(system 内扩展 vs 新薄模块 passport)不需创始人拍板,执行版评审定稿;倾向 system 内扩展(口径一致+零 RPC),备选新模块(fork 零侵入)。
5. 推荐方案乙:身份模型与关键设计
flowchart LR
subgraph P[玩家侧(匿名优先,短视频式)]
A["打开 game-studio<br/>本地 anonId(已有)"] -->|免登录| B["刷 feed / 试玩 / 遥测上报<br/>读路径 @PermitAll + anonId 透传"]
B -->|点赞·收藏·支付 触发| C{"一键登录<br/>手机号+验证码"}
C --> W{"准入判定<br/>(§9-3 玩家注册 / §9-4 创作白名单<br/>两个独立拍板项)"}
W -->|"推荐语义:玩家注册开放<br/>任意手机号可注册"| PD["注册成真实玩家<br/>可点赞/收藏,不能创作/发布"]
W -.->|"若拍'注册整体限 A2 白名单':<br/>非白名单手机号被拒<br/>=玩家转化漏斗第一跳即断"| X["流失(反例去向,<br/>仅当放弃种子期玩家增长才可接受)"]
end
subgraph CRE[创作者侧(创作/发布限 A2 白名单 §9-4)]
PD -->|"手机号 ∈ A2 白名单"| D["game_player 创作者身份<br/>OAuth2 真 token (userType=MEMBER)"]
D --> E["创作 / 发布 / 钱包<br/>app-api 默认强制登录(不动)"]
E -->|提现前| F["实名收集<br/>挂 A 轨支付进件闸门"]
end
subgraph OPS[运营侧(现状即可用)]
G["game-admin 原生登录<br/>system AdminUser (userType=ADMIN)"] --> H["admin-api 审核/运营"]
end
B -. anonId .-> I[("telemetry<br/>双身份可关联")]
PD -. "登录事件绑定 anonId↔userId" .-> I
图注:白名单语义拆分——推荐语义为"玩家注册开放(漏斗存活)+ 创作/发布限 A2 白名单(内容风险收口)";非白名单手机号用户的去向=可注册、可互动、不能创作/发布。若创始人改拍"注册整体白名单",则虚线分支生效、匿名玩家转化漏斗在第一跳被设计性切断——该后果必须有意识地拍,不能默认。另:报备前该漏斗还受短信通道时序阻塞(见 §0 与 §9-2),与准入语义是两个独立断点。
关键设计点:
- 匿名玩家=免登读路径,不发匿名 token——对 glossary 既定意向的显式变更声明。feed 流/分享页/runtime 取包/遥测上报等约 7–10 个读端点加
@PermitAll,身份用前端既有 anonId 透传(契约已留位);广告曝光是计费链上游,是否进免登清单单独评审(见 §5A)。行为边界与 glossary 一致(只能浏览试玩、不能发布/收藏/进后台),但机制偏离既定意向"framework 层扩展匿名 Token"(glossary.md:40):偏离理由=免去匿名 token 签发/存储/续期厚度(token 存储量=真实登录用户,容量可控);安全代价=anonId 纯客户端生成、身份不可信,防伪造/刷量责任转嫁聚合侧(机制备选与归属见 §5A,§9-7 拍板);定稿后需同步修订的文档=glossary.md:40匿名条目 +contracts/events.schema.json与EnvelopeReqVO的 anonId 描述(现仍写"匿名 token 派生的稳定匿名 ID"),防止后续 agent 按旧意向去造匿名 token 机制。若 §9-7 拍 A(服务端匿名票据),机制回归 glossary 原意向、本变更声明作废。 - 互动是身份转化点。点赞/收藏(
AppFeedController.interact,其注释已预埋"匿名互动 anon_id 为后续对接点")默认弹一键登录;是否做"匿名影子账号+转正合并"由创始人拍板(§9-5)。 - 登录方式一次成型,短信通道分级——但 Debug 通道只对创作者侧可运营。UI/API 首发即手机号+验证码(C 端习惯,复用
MEMBER_LOGIN场景);种子期走 Debug 渠道(验证码落库,运营后台查码人工下发给 5 个已知种子创作者)。对分享链路来的陌生玩家该通道完全不可运营(运营不知道把码发给谁)——报备前玩家侧注册转化实质不可用,是否需要提前激活见 §9-2(选 B 账密或 C 邀请码旁路可绕开短信依赖)。短信报备闸门完成后切渠道≈配置切换、无二次改造,但须先落安全前置(IP/设备限频+验证码开关,R6),不是纯配置动作。 - telemetry 身份衔接。登录成功补发一条登录事件携带 anonId+userId;此后上报双带(前端已实现)——离线归因可把登录前行为串回同一人。
- 创作者实名链。
game_player预留mobile/real_name/id_card_no(加密)字段;MVP 注册只收手机号,实名收集后置到提现前(降低注册摩擦,与 A 轨 LLM 实名/支付进件闸门节奏对齐,拍板项 §9-6)。 - 单租户立场。维持
tenant.enable=false;新表带tenant_id默认 1,将来开租户无需改表。 - 既定假设(不进拍板表):匿名数据保留期默认 180 天。这是合规参数而非产品方向决策——默认值写入隐私政策草案,随 A 轨隐私协议法务复核时一并定稿;法务若调整,仅改清理任务配置与政策文案,不影响架构。
5A. 匿名身份安全边界(伪造 / 刷量 / bot 排除三联)
现状亲核(不粉饰):anonId 为前端 localStorage 随机串(game-studio/src/store/user.ts:10-24),可任意伪造、可批量铸造;telemetry 入口对它的全部"校验"只有 traceId 的 @NotBlank 存在性校验 + (traceId,event,ts) 幂等键(EnvelopeReqVO.java:41、TelemetryEventConsumer.java:12)——对变造 ts/traceId 的批量刷量无任何约束;game-module-telemetry/feed 现无任何 bot 排除/反作弊代码(grep 0 命中),技术架构与模块.md 亦无对应技术项。
利害关系(为什么不能含糊):遥测事件直接喂 quality_score→feed 推荐排序(数据回路已通,黄金闭环 B2);广告曝光事件后接 trade T+1 分账。伪造匿名事件可操纵推荐排序与未来真金分成——免登读路径放开前,这条边界必须先写明。
机制备选(§9-7 拍板):
| 维度 | A:服务端签发签名匿名设备票据 | B:纯客户端 anonId + 聚合侧异常剔除(建议种子期) |
|---|---|---|
| 做法 | 首访由服务端签发带签名的匿名设备票据,anonId 服务端派生;可限频、可撤销、可加签发难度 | 维持现状 anonId 透传;聚合侧按 anonId/IP 维度做异常剔除 |
| 身份可信度 | 可信(伪造需破签名) | 不可信(任意铸造),靠事后剔除兜底 |
| 实现厚度 | +签发端点/密钥管理/前端改造(推断 +1–2 天) | 最薄(前端零改动),种子期挂"聚合侧按 anonId/IP 异常剔除"最小桩即可 |
| 与 glossary 既定意向 | 贴合(即"匿名 Token"原意向,§5-1 变更声明作废) | 偏离(需按 §5-1 走显式变更声明) |
防刷归属(边界与 owner,拍板前即写明):
- quality_score 喂入事件的异常剔除 → telemetry 聚合侧(owner=telemetry 模块);种子期最小桩=按 anonId/IP 维度异常剔除(阈值可粗暴),桩可薄、归属边界必须先立。
- 广告曝光计费事件的反作弊 → compliance/ad 反作弊项(owner=compliance;
技术架构与模块.md现无此技术项,定稿后补列)。
广告曝光单独标注:它是计费链上游(T+1 分账依据),不是普通读路径——是否进免登 @PermitAll 清单单独评审;若进,必须同时挂聚合侧剔除桩+曝光校验(执行版定细节)。
落地依赖(执行版注明):@RateLimiter 所在 huijing-spring-boot-starter-protection 仅 huijing-server/system/bpm 引入,game-module-* 的 pom 均未依赖(grep 实证)——限频落地需先补该依赖。
6. 影响面
| 端 | 改动 | 说明 |
|---|---|---|
| 后端 game-cloud | 新增:game_player 表(Flyway 新版本)+ app 端 3 端点(发验证码/验证码登录/我的信息)+ 准入开关(按 §9-3/§9-4 拍板语义配置);存量:读端点加 @PermitAll 注解与 anonId 入参(每处 1–2 行) |
创作/交易/项目端点不动(默认强制登录即正确行为)。发验证码端点必然 @PermitAll:切真实短信渠道前须补 IP/设备限频+验证码开关(R6);限频依赖 protection starter,game 模块 pom 需补(§5A) |
| 前端 game-studio | 新增登录页(Vant)+ 路由守卫(创作/互动需登录,feed/play 放行)+ 401 统一拦截跳登录;store/user.ts.setLogin 已预留挂点 |
.env.staging 与 mock 回退逻辑保留不动 |
| 前端 game-admin | 零改动(原生登录已可用) | — |
| 契约 contracts | 新增 passport.yaml(登录/验证码/匿名约定);telemetry/events 契约已含 anonId 不动 |
契约先行(§6 工作协议) |
| staging | mock-enable=true 保持:过滤器"真 token 优先、mock 兜底"天然并存,批跑 test1 零中断;新增一条"真 token 黄金闭环 e2e"并行验证 |
出处 §1.1 |
| 生产 | mock-enable=false + mockSecret 随机化(防 test 前缀默认值);上线验收含负路径 |
框架注释明示"线上一定要关"(TokenAuthenticationFilter.java:110)。前置未点明项:huijing-server 现仅有 dev/local/staging 三份 profile(grep 实证),生产 profile 尚未建立——"生产关死 mock 负路径实测"挂生产环境部署轨,部署项落地后补测 |
7. 风险与兼容
| # | 风险 | 等级 | 缓解 |
|---|---|---|---|
| R1 | 撤 mock 回归面:app 控制器 28 处 getLoginUserId(7 文件)依赖登录态(admin 侧 3 处自 M1 有真实登录,不在面内) |
中 | staging 不撤 mock,新增真 token e2e 并行跑;生产负路径验收(test1→401,挂部署轨见 §6) |
| R2 | 短信报备闸门延误(1–2 周不可压缩);且报备完成前玩家侧注册转化整体不可用(Debug 通道只对 5 个已知创作者可运营,陌生玩家无法拿码) | 高 | 行动项(今天执行):短信签名报备加入 A 轨闸门看板——plan(2026-06-09 §2.A)看板枚举现无此项;含其自身前置:企业主体资质、部分供应商要求已备案域名(可能与 ICP 串联)。创作者侧 Debug 通道先行;玩家侧是否报备前激活走 §9-2 拍板(选 B/C 可绕开短信依赖) |
| R3 | 匿名读路径放开后的伪造/刷量:anonId 可任意铸造;telemetry 入口仅 traceId 存在性校验+(traceId,event,ts) 幂等键,对变造刷量无约束;伪造事件可操纵 quality_score 推荐与未来广告分账 |
中 | 限频:@PermitAll 端点接 huijing RateLimiter+Nginx 限频(呼应 T-CMP-31"登录安全与限频";game 模块需补 protection starter 依赖);身份机制与防刷归属见 §5A(种子期最小桩=聚合侧按 anonId/IP 异常剔除,机制 §9-7 拍板) |
| R4 | 前端 userId 1001/后端 1 错位(既有) | 低 | 真实登录后 userId 以登录响应为准,错位自然消除;mock 路径维持现状不动(批跑兼容) |
| R5 | fork 侵入(system 落点) | 低 | 新增代码隔离在独立包路径,上游合并冲突面小;备选新模块零侵入 |
| R6 | 切真实短信渠道后的发码端点滥用(短信轰炸/费用滥用——手机验证码登录经典攻击面):发码端点必然 @PermitAll;现状仅按手机号频控+日上限,按 IP 的每日/每小时限制是上游 TODO(SmsCodeServiceImpl.java:65-66),且 staging captcha.enable=false(application-staging.yaml:155) |
中 | 切渠道的安全前置(与"配置切换"绑定排期,不可省):按 IP/设备限频 + 图形/行为验证码开关(需可一键启用);种子期 Debug 渠道+白名单下风险≈0,前置随切渠道一并落地,列入执行版 |
兼容性:API 前缀/userType 约定不变;既有契约零破坏;game-admin 零改动;所有新表带 tenant_id 兼容将来多租户。
8. 验收标准
- 真 token 全链:种子创作者验证码登录→创作→发布→审核→feed 可见,全程无 test1(staging 真 token e2e 证据)。
- 匿名零门槛:无登录刷 feed/试玩成功,遥测 anonId 落库;点赞触发登录引导。
- 身份衔接:登录事件含 anonId+userId;互动归属真实 userId(1001/1 错位消除)。
- mock 并存:staging 既有批跑(Bearer test1)零中断;生产 profile
Bearer test1→401(负路径实测。注:生产 profile 尚未建立,此条挂生产环境部署轨,部署落地后补测,不阻塞本件其余验收)。 - 安全基线:refresh 轮换 7d/30d 生效;日志手机号/token 脱敏抽查;隐私政策注册前展示占位文案(P-ACC-02 原 v2.0 提前的口径调整见 §3 声明,正式文案挂 A 轨法务定稿)。
- 运营不回归:game-admin 原生登录链路冒烟通过。
9. 待创始人拍板项
表已按评审意见收敛与拆分:移除"匿名数据保留期"(合规参数,降为 §5 既定假设 7);原"种子期注册准入"因语义混淆拆为 #3/#4 两个独立项;新增 #2 漏斗激活时机(最尖锐)与 #7 匿名身份机制。#1 与 #2 联动拍,#3 与 #4 分开拍。
| # | 决策 | 选项与建议 |
|---|---|---|
| 1 | 首发登录方式(与 #2 联动) | A=手机号+验证码(C 端习惯、一次成型;但报备前玩家侧转化不可用,种子创作者后台查码过渡);B=账密+邀请码(包袱:后续二次改造+密码找回体系;核心优势此前漏列:对玩家转化也零短信依赖,匿名→注册漏斗在短信报备闸门完成前即可激活);C=验证码为主+邀请码旁路(混合:创作者走验证码 Debug 通道,陌生玩家凭邀请码/口令注册,报备后旁路自然退役)。若 #2 拍"需要激活"→建议 C(或 B);拍"不需要"→建议 A |
| 2 | 种子期是否需要在报备前激活玩家转化漏斗(最尖锐,决定 #1 走向) | 是=分享拉来的路人在报备前就能注册互动,提前验证"创作者分享→玩家转化"假设 → #1 必须选 B 或 C;否=种子期只验证创作者闭环,玩家转化等报备落地(漏斗数据晚 1–2 周以上)→ #1 选 A 即可 |
| 3 | 玩家注册是否开放(影响匿名转化漏斗存活) | A=开放注册(建议:匿名玩家点赞→一键登录→注册成玩家,漏斗不断;内容风险不在注册侧,在发布侧);B=注册整体限 A2 白名单(约 5 个手机号——非名单路人被拒,玩家转化漏斗第一跳被设计性切断,仅当种子期明确放弃玩家增长才可选) |
| 4 | 创作/发布是否限 A2 白名单(影响内容风险) | A=限 A2 名单(建议:内容上架风险收口在 5 个已知创作者,审核压力可控);B=开放创作(流量大但审核压力前置,种子期不建议) |
| 5 | 游客转正机制 | A=互动即弹一键登录(建议:MVP 最简,转化点清晰);B=匿名影子账号+转正数据合并(体验最顺滑,但合并逻辑贵,建议 v2.0 再评) |
| 6 | 创作者实名收集时点 | A=提现前(建议:注册零摩擦,与支付进件闸门对齐);B=注册即收(合规最保守,但伤种子转化) |
| 7 | 匿名身份机制(安全边界,详见 §5A) | A=服务端签发签名匿名设备票据(身份可信、可限频可撤销,贴合 glossary 原意向;+1–2 天);B=纯客户端 anonId+聚合侧异常剔除(建议种子期:实现最薄、前端零改动;代价=身份不可信、靠事后剔除兜底,并接受 §5-1 的 glossary 变更声明) |
9.1 拍板结果(创始人 2026-06-10,七项全拍,均采推荐项)
| # | 决策 | 拍板结果 |
|---|---|---|
| 1 | 首发登录方式 | C:验证码为主 + 邀请码旁路(创作者走验证码 Debug 通道;陌生玩家凭邀请码/口令注册零短信依赖;短信报备完成后旁路自然退役、全量切验证码) |
| 2 | 报备前是否激活玩家转化漏斗 | 是·受限激活(邀请码旁路实现,与审计 R2「自有端=邀请制内测」定性自洽,提前拿「分享→转化」漏斗数据) |
| 3 | 玩家注册是否开放 | 开放注册(受限激活期体现为凭邀请码注册;报备落地后转全开放,漏斗第一跳不断) |
| 4 | 创作/发布是否限白名单 | 限 A2 白名单(内容上架风险收口在 ~5 个已知种子创作者) |
| 5 | 游客转正机制 | 互动即弹一键登录(影子账号+转正合并留 v2.0 再评) |
| 6 | 创作者实名收集时点 | 提现前收(注册只收手机号,与支付进件/LLM 实名闸门节奏对齐) |
| 7 | 匿名身份机制 | B:纯客户端 anonId + 聚合侧异常剔除(种子期最小桩,owner=telemetry;接受 §5-1 glossary 显式变更声明——glossary/contracts 描述已同步修订;广告曝光是否进免登清单留执行版单独评审) |
执行版待办(出 execution 版时落):邀请码旁路的发码/核销机制与退役开关、
passport.yaml契约、Flyway 版本、R6 切渠道安全前置、§5A 聚合侧剔除最小桩 + protection starter 依赖、EnvelopeReqVOanonId 注释同步。
出处均为本仓实读核验(2026-06-10);体量与"+1–2 天"类估算为推断,以执行版排期为准。下一步:拍板后出 execution 版(含落点定稿/端点清单/Flyway 版本/e2e 用例/§5A 聚合侧剔除最小桩与 protection starter 依赖补齐/R6 切渠道安全前置),并同步回写文档:glossary.md:40 匿名条目、contracts/events.schema.json 与 EnvelopeReqVO 的 anonId 描述(若 §9-7 拍 B)、技术架构与模块.md 补广告反作弊技术项。