① 注册登录
产品定义:手机号 → 短信验证码 → 设备信息采集;注册即建档。图例与服务名映射见 00-总览。
后端UserBusiness是自建简化登录(OTP/密码/token,验证码本地存 Redis)。真实分支见下方「分支清单」。前端侧详见 01-注册登录。
时序
sequenceDiagram autonumber actor C as 客户 participant App as 客户端 H5/原生 participant GW as 业务网关 participant BNS as BNS 业务编排(UserBusiness) participant SMS as 短信发送(缺失系统) C->>App: 输入手机号 App->>GW: POST /bns/user/login(validCode 空) GW->>BNS: login Note over BNS: 限频(间隔60s/日限10/有效期5min) + generateCaptcha + 存 Redis BNS->>SMS: 发送短信验证码 Note over SMS: ✗ 无短信 Feign 客户端,发送出口缺失 BNS-->>App: nextLoginType=OTP + captchaConfig(wait/resend 120) C->>App: 输入验证码 App->>GW: POST /bns/user/login(validCode + loginType=OTP) alt OTP 登录(loginByOtp) Note over BNS: verifyAndConsumeCaptcha 校验 Note over BNS: findUserByPhone 为空→buildUser 建档+insert(ifReg=true 注册即建档) Note over BNS: delFlag=1→USER_NOT_EXIST Note over BNS: issueToken 发 token + buildLoginResp else 密码登录(loginByPasswordFlow) Note over BNS: user 为空→REGISTER_FIRST;loginByPassword 校验;issueToken else 需设密码 Note over BNS: nextLoginType=PW(buildNeedSetPasswordResp) end Note over BNS: 人脸登录走 apply/faceDetection(faceScene=FACE_CHECK),见 [[02-授信]] App->>GW: POST /bns/datacollect 设备信息采集 Note over BNS: 落 BnsDataCollectUploadRecord/Item(内部落库)
分支清单(穷举注册登录全部分支)
出处 UserBusiness。状态 ✓活跃 / ✗缺失。
| # | 分支 | 触发条件 | 处理 | 出处 | 状态 |
|---|---|---|---|---|---|
| 1 | 参数缺失 | phone 空 | PARAM_MISSING | UserBusiness:73 | ✓ |
| 2 | 登录第一步-发码 | validCode 空 | sendCaptcha + 返回 nextLoginType=OTP + captchaConfig | :76/91 | ✓ |
| 3 | 验证码限频 | 间隔<60s / 日>10次 | SMS_LIMIT | :270/275 | ✓ |
| 4 | 短信实际发出 | 验证码生成后 | 无短信 Feign 客户端 | — | ✗ 出口缺失 |
| 5 | OTP 登录 | loginType=OTP | loginByOtp | :94 | ✓ |
| 6 | OTP-自动建档 | findUserByPhone 为空 | buildUser+insert,ifReg=true(注册即建档) | :111 | ✓ |
| 7 | 用户已删除 | delFlag=1 | USER_NOT_EXIST | :122/133 | ✓ |
| 8 | 密码登录 | 非 OTP | loginByPasswordFlow | :97/128 | ✓ |
| 9 | 密码登录-未注册 | user 为空 | REGISTER_FIRST(先注册) | :131 | ✓ |
| 10 | 需设密码 | 无密码 | nextLoginType=PW(buildNeedSetPasswordResp) | :140 | ✓ |
| 11 | 人脸登录 | FACE 场景 | apply/faceDetection(faceScene=FACE_CHECK),见 02-授信 | ApplyBusiness:198 | ✓(独立路径) |
| 12 | 发 token | 登录成功 | issueToken(generateToken+updateUserLoginInfo+buildLoginResp) | :150 | ✓ |
| 13 | 注册检查 | 前端 isregistered | tudcAux/user/exists(是否接 TUDC 待确认) | 端点 | △ 待确认 |
| 14 | 登出 | logout | logout | :188 | ✓ |
| 15 | 设备采集 | 登录后 | IDataCollectService 落 BnsDataCollectUploadRecord/Item | — | ✓ |
接口落地
| # | 业务步骤 | 服务 | 真实接口 | 现状 | 说明 |
|---|---|---|---|---|---|
| 1 | 登录/发码(第一步) | BNS | IUserService.login POST /bns/user/login(validCode 空) | ✓ | UserBusiness.login:限频 + generateCaptcha + 存 Redis + 返回 nextLoginType=OTP |
| 2 | 短信实际发出 | (出口未见) | — | ✗ | bns 无短信 Feign 客户端(无 ISmsClient);验证码生成后真实发送出口未见,印证触达 mdut 缺口 |
| 3 | OTP 登录(第二步) | BNS | login(loginType=OTP)→ loginByOtp | ✓ | 校验验证码 + 自动建档(ifReg)+ issueToken |
| 4 | 密码登录 | BNS | login → loginByPasswordFlow | ✓ | user 为空 REGISTER_FIRST;密码校验 |
| 5 | 人脸登录 | BNS | IApplyService.faceDetection(faceScene=FACE_CHECK) | ✓ | 复用人脸端点做登录,见 02-授信 |
| 6 | 注册检查 | BNS | tudcAux/user/exists | △ | 前端调;是否接 TUDC 待确认 |
| 7 | 登出 | BNS | IUserService.logout | ✓ | |
| 8 | 设备信息采集 | BNS | IDataCollectService POST /bns/datacollect | ✓ | 采集型号/OS/IP/指纹等,喂风控 |
缺口小结
- 登录链路本地齐备:发码(限频+生成+存 Redis)、OTP 登录(自动建档)、密码登录、issueToken 均可跑。
- 唯一缺口:验证码短信发送出口——bns 无短信通道客户端(无
ISmsClient),验证码只存 Redis 不发短信,印证触达 mdut 缺口;短信网关已后置,MVP 不在 crs 建短信出口。 - 登录是自建简化实现(UserBusiness:OTP/密码/token),nextLoginType 返回 OTP/PW;人脸登录走 apply/faceDetection(faceScene=FACE_CHECK)独立路径(前端 01-注册登录 的 FACE 对应此)。
- 注册即建档:OTP 登录时 findUserByPhone 为空则自动建 BnsUser(ifReg=true),注册与登录同一接口。
tudcAux/user/exists(前端注册检查)是否对接 TUDC 统一认证待确认(UserBusiness 自身未见 TUDC 调用)。