① 注册登录

产品定义:手机号 → 短信验证码 → 设备信息采集;注册即建档。图例与服务名映射见 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_MISSINGUserBusiness:73
2登录第一步-发码validCode 空sendCaptcha + 返回 nextLoginType=OTP + captchaConfig:76/91
3验证码限频间隔<60s / 日>10次SMS_LIMIT:270/275
4短信实际发出验证码生成后无短信 Feign 客户端✗ 出口缺失
5OTP 登录loginType=OTPloginByOtp:94
6OTP-自动建档findUserByPhone 为空buildUser+insert,ifReg=true(注册即建档):111
7用户已删除delFlag=1USER_NOT_EXIST:122/133
8密码登录非 OTPloginByPasswordFlow: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注册检查前端 isregisteredtudcAux/user/exists(是否接 TUDC 待确认)端点△ 待确认
14登出logoutlogout:188
15设备采集登录后IDataCollectService 落 BnsDataCollectUploadRecord/Item

接口落地

#业务步骤服务真实接口现状说明
1登录/发码(第一步)BNSIUserService.login POST /bns/user/login(validCode 空)UserBusiness.login:限频 + generateCaptcha + 存 Redis + 返回 nextLoginType=OTP
2短信实际发出(出口未见)bns 无短信 Feign 客户端(无 ISmsClient);验证码生成后真实发送出口未见,印证触达 mdut 缺口
3OTP 登录(第二步)BNSlogin(loginType=OTP)→ loginByOtp校验验证码 + 自动建档(ifReg)+ issueToken
4密码登录BNSloginloginByPasswordFlowuser 为空 REGISTER_FIRST;密码校验
5人脸登录BNSIApplyService.faceDetection(faceScene=FACE_CHECK)复用人脸端点做登录,见 02-授信
6注册检查BNStudcAux/user/exists前端调;是否接 TUDC 待确认
7登出BNSIUserService.logout
8设备信息采集BNSIDataCollectService 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 调用)。