3.2 KiB
3.2 KiB
认证模块说明(src/auth)
1. 目标
- 提供系统管理员创建、院内账号密码登录、B 端小程序手机号登录、C 端小程序手机号登录、
/me身份查询。 - 使用 JWT 做认证,院内账号与家属小程序账号走两套守卫。
2. 核心接口
POST /auth/system-admin:创建系统管理员(需引导密钥)POST /auth/login:院内账号密码登录,后台与小程序均可复用POST /auth/login/confirm:院内账号密码多账号确认登录POST /auth/miniapp/b/phone-login:B 端小程序手机号登录POST /auth/miniapp/b/phone-login/confirm:B 端同手机号多账号确认登录POST /auth/miniapp/c/phone-login:C 端小程序手机号登录GET /auth/me:返回当前院内登录用户上下文
3. 院内账号密码登录流程
- 前端提交
phone + password,role与hospitalId都可以选传。 - 若仅匹配到 1 个院内账号,后端直接返回 JWT。
- 若匹配到多个院内账号,后端返回
loginTicket + accounts候选列表。 - 前端带
loginTicket + userId调用确认接口获取最终 JWT。
4. 微信小程序登录流程
B 端
- 前端调用
wx.login获取loginCode。 - 前端调用手机号授权获取
phoneCode。 - 调用
POST /auth/miniapp/b/phone-login。 - 若手机号仅命中 1 个院内账号,后端直接返回 JWT。
- 若命中多个院内账号,后端返回
loginTicket + accounts。 - 前端带
loginTicket + userId调用确认接口拿最终 JWT。
C 端
- 前端同样传
loginCode + phoneCode。 - 后端先校验该手机号是否已存在于
Patient.phone。 - 校验通过后创建或绑定
FamilyMiniAppAccount,并返回 C 端 JWT。
5. 鉴权流程
院内账号
AccessTokenGuard从Authorization读取 Bearer Token。- 校验 JWT 签名、
id、iat等关键载荷字段。 - 根据
id回库读取User当前角色与组织归属。 - 校验
iat >= user.tokenValidAfter,保证旧 token 失效。
家属小程序账号
FamilyAccessTokenGuard从Authorization读取 Bearer Token。- 校验 C 端 token 的
id + type=FAMILY_MINIAPP。 - 根据
id回库读取FamilyMiniAppAccount。 - 将家属账号上下文注入
request.familyActor。
6. 环境变量
AUTH_TOKEN_SECRETSYSTEM_ADMIN_BOOTSTRAP_KEYWECHAT_MINIAPP_APPIDWECHAT_MINIAPP_SECRET
7. 关键规则
- 后台 Web 与 B 端小程序都可以复用
POST /auth/login做账号密码登录。 - 密码登录命中多个院内账号时,不再强制前端手填
hospitalId,改为后端返回候选账号供选择。 - B 端小程序登录复用
User表,继续使用openId。 - B 端账号未绑定
openId时,首次小程序登录自动绑定。 - 同一个
openId可绑定多个院内账号,支持同一微信号切换多角色/多院区账号。 - 若目标院内账号已绑定其他微信号,仍需先在用户管理中清空该账号的
openId再重新绑定。 - C 端家属账号独立存放在
FamilyMiniAppAccount。 - C 端手机号必须先存在于患者档案,否则拒绝登录。
serviceUid仅预留字段,本次不提供绑定接口。