登录码流程(How-to)
适用场景
本文档仅描述 国内场景(CN) 的玩家登录码与 Admin 发码流程。美国场景三端均为 OAuth,见 认证场景。
Admin:发布登录码
- Staff 登录
/staff-login→/admin - Header 点击 发布登录码
- 调用
POST /api/admin/publish-login-code - 状态变为
published
每次发布会 覆盖 旧码并广播新码。
Admin:关闭登录码
- 点击 关闭登录码
POST /api/admin/close-login-code- Show 收到
login_code_closed,登录区隐藏
已登录玩家 不受影响,仅阻止新 verify-code。
Display:展示登录码
/show 监听:
| 事件 | 行为 |
|---|---|
login_code_published | 显示 6 位码 |
login_code_status | 重连补发当前码 |
login_code_closed | 隐藏码,显示等待文案 |
组件:LoginCodeDisplay — 大号数字 + 「当前已加入: N」(来自 survivorsCount)。
玩家:输入登录码
- 访问
/login - 输入 6 位数字(
CnLoginPanel) - 前端读取
getOrCreatePlayerId()(localStorage UUID) - NextAuth
signIn("player-code", { code, playerId }) - 内部调用 Backend verify-code
- 成功 → 欢迎语「玩家 #NNN」→
/play
校验规则
- 码格式:
/^\d{6}$/ - playerId:UUID v4
- 码须与 Redis 中 active code 完全一致
错误处理
| 错误 | 用户看到 |
|---|---|
| 码错误/已关闭 | 「登录码无效或已过期,请查看现场投屏」 |
| playerId 非法 | authorize 返回 null → 同上 |
API 示例
# 验证登录码(NextAuth 内部调用,也可手动测)
curl -X POST http://localhost:4000/api/auth/verify-code \
-H "Content-Type: application/json" \
-d '{"code":"123456","playerId":"550e8400-e29b-41d4-a716-446655440000"}'
成功响应:
{
"playerId": "550e8400-e29b-41d4-a716-446655440000",
"internalEmail": "player:550e8400-e29b-41d4-a716-446655440000@game.local",
"displayName": "玩家 #001",
"playerNumber": 1
}
与游戏的关系
- 登录成功 ≠ 游戏开始;玩家进入
/play后 join survivors - Admin 发布第一题 时
gameStarted=1,此后新玩家无法加入 - 重置游戏 清空登录码与玩家注册表,需重新发布码