Skip to main content
Version: Current

登录码流程(How-to)

适用场景

本文档仅描述 国内场景(CN) 的玩家登录码与 Admin 发码流程。美国场景三端均为 OAuth,见 认证场景

Admin:发布登录码

  1. Staff 登录 /staff-login/admin
  2. Header 点击 发布登录码
  3. 调用 POST /api/admin/publish-login-code
  4. 状态变为 published

每次发布会 覆盖 旧码并广播新码。

Admin:关闭登录码

  1. 点击 关闭登录码
  2. POST /api/admin/close-login-code
  3. Show 收到 login_code_closed,登录区隐藏

已登录玩家 不受影响,仅阻止新 verify-code。

Display:展示登录码

/show 监听:

事件行为
login_code_published显示 6 位码
login_code_status重连补发当前码
login_code_closed隐藏码,显示等待文案

组件:LoginCodeDisplay — 大号数字 + 「当前已加入: N」(来自 survivorsCount)。

玩家:输入登录码

  1. 访问 /login
  2. 输入 6 位数字(CnLoginPanel
  3. 前端读取 getOrCreatePlayerId()(localStorage UUID)
  4. NextAuth signIn("player-code", { code, playerId })
  5. 内部调用 Backend verify-code
  6. 成功 → 欢迎语「玩家 #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,此后新玩家无法加入
  • 重置游戏 清空登录码与玩家注册表,需重新发布码