quickstart.md 3.4 KB

Quickstart: 设备信任免绑手机号

Date: 2026-09-20 | Spec: spec.md | 契约: contracts/api-contract.md

前置条件

  1. 数据库updatesql/sql.md 中"2026-09-20 设备绑定手机号信任表"DDL 已由开发者手动执行(本任务只追加脚本不执行)。
  2. Redis:本地 Redis 可用(临时凭证依赖)。
  3. JDK:临时设置(不改全局配置,Git Bash 示例):

    export JAVA_HOME="$HOME/.jdks/graalvm-jdk-21.0.12+7.1"
    export PATH="$JAVA_HOME/bin:$PATH"
    
  4. 短信万能码:沿用现网 8888(测试不必真实收码)。

自动化验证(测试命令)

# 全量跑本 feature 测试(DeviceTrust + 分支/确认流程)
mvn -pl ruoyi-admin -am test -Dtest='DeviceTrust*Test' -Dsurefire.failIfNoSpecifiedTests=false

# 编译校验(含 ruoyi-system)
mvn -pl ruoyi-admin -am compile

预期:全部通过。已知基线红测试与本 feature 无关(flash payType 白名单,见项目记忆)。

手动端到端场景(curl 模拟,配合契约文档 §6)

服务起在本地(默认 8080,按实际部署调整)。DEV=dev-uuid-001 为模拟设备标识。

场景 A:建立信任 → 三方免绑

# 1. 手机号短信登录(万能码 8888),带 deviceId —— 建立/刷新设备信任
curl -X POST http://localhost:8080/infouser/user/lodeing \
  -H 'Content-Type: application/json' \
  -d '{"phone":"0987654321","code":"8888","deviceId":"dev-uuid-001"}'
# 预期:登录成功 token;DB: info_user_device 出现 device_id=dev-uuid-001, phone=0987654321

# 2. 查库确认(人工)
#    SELECT * FROM info_user_device WHERE device_id='dev-uuid-001';

# 3. 用"新的"三方身份登录(credential 用测试渠道或 mock)
curl -X POST http://localhost:8080/infouser/user/oauthLogin \
  -H 'Content-Type: application/json' \
  -d '{"provider":"google","credential":"<test-idtoken>","deviceId":"dev-uuid-001"}'
# 预期:data = {status:"deviceConfirm", tempKey:"...", maskedPhone:"098****4321"}

# 4. 一键确认(免短信)
curl -X POST http://localhost:8080/infouser/user/oauthDeviceConfirm \
  -H 'Content-Type: application/json' \
  -d "{\"tempKey\":\"<第3步tempKey>\",\"deviceId\":\"dev-uuid-001\"}"
# 预期:返回 token + user(即 0987654321 的账号);info_user_oauth 新增 google 绑定行

场景 B:兼容性回归(必须零差异)

# 不带 deviceId 的老版本行为
curl -X POST http://localhost:8080/infouser/user/oauthLogin \
  -H 'Content-Type: application/json' \
  -d '{"provider":"google","credential":"<另一个新身份>"}'
# 预期:{status:"needPhone", tempKey}(原样)

场景 C:异常路径

  • tempKey 过期(>5 分钟再确认)→ no.oauth.tempkey.expired
  • 确认时换 deviceId(dev-uuid-999)→ no.oauth.device.mismatch,不产生绑定
  • 信任手机号账号停用(先手动 UPDATE status)→ no.user.stop

场景 D:LINE 回调

浏览器打开 authorize URL(state=dev-uuid-001)→ 走完 LINE 同意 → 观察 302 回跳参数:

  • 已信任:deviceConfirm=1&tempKey=...&maskedPhone=098****4321
  • 无信任(state 换成新值):needPhone=1&tempKey=...

通过标准

  • 自动化测试全绿;场景 A/B/C/D 行为与 contracts/api-contract.md 逐条一致。
  • 老版本兼容:所有不带 deviceId 的请求与改造前行为完全一致。