3.9 KiB
3.9 KiB
问题陈述
将 auth 从当前演示版 JWT 发放器升级为可用于 Web 教师/机构端与小程序学生端的统一认证中心,确保令牌生命周期、租户上下文与审计链路可落地。
当前状态(已确认)
- 架构与 API 对
auth的约束是登录、刷新、当前用户三类基础接口。参考docs/architecture/api-design.md (12-16)、docs/architecture/logical-view.md (7-9)。 - 现有
AuthController仅暴露/auth/tokens、/auth/tokens/refresh、/auth/users/current。参考backend/auth/src/main/java/com/k12study/auth/controller/AuthController.java (1-49)。 AuthService当前为占位实现:默认admin、不校验密码、refresh token 直接复用 access token 生成逻辑。参考backend/auth/src/main/java/com/k12study/auth/service/AuthService.java (18-74)。init已提供auth.tb_auth_refresh_token与auth.tb_auth_login_audit,但代码尚未接入。参考init/pg/auth/10_create_auth_tables.sql (1-54)。- 当前需求已调整为“学生手机号绑定 + 手动登录”,不使用 openid/微信取号能力;现有代码尚未体现该约束。参考
docs/AI智能学习系统功能清单.md (1-30)。
模块拆分与设计细节
1) 子模块边界
auth-credential:账号密码、手机号绑定、手动登录、验证码/密码校验。auth-token:access/refresh 双令牌、旋转、撤销、过期策略。auth-context:输出标准 claims(userId/tenantId/tenantPath/deptId/adcode/roleCodes/clientType)。auth-audit:登录审计、刷新审计、异常登录行为记录。
2) 认证通道设计
- Web(机构/教师):账号密码 + 可选验证码。
- Mini(学生):手机号 + 手动输入凭证登录;“手机号+密码”与“手机号+短信验证码”为并列可选登录主流程,不依赖微信 code/openid。
- 统一返回 token 结构,但按
clientType写入不同策略(如 mini 更短 access TTL、更严格 refresh 轮换)。 - 学生身份主键统一使用平台
user_id+ 绑定手机号,不引入 openid 作为账号主索引。
3) 令牌与隔离策略
- access token 仅短期有效;refresh token 必须入库(
tb_auth_refresh_token)并采用“每次刷新强制轮换”策略(one-time refresh token)与撤销机制。 - claims 必须包含租户上下文与端侧上下文,供 gateway 与业务域执行“租户隔离 + 端能力限制”。
currentUser不再回退静态默认用户,统一由 token + 用户表读取。
4) 与小程序约束联动
- 身份区分以
role为准:小程序仅允许STUDENT角色登录;TEACHER/ORG_ADMIN角色不发放 mini 可用令牌。 - 为后续“课程仅展示课堂练习/课后作业”提供
clientType=MINI+role=STUDENT的稳定判定依据。 - 学生允许在不同家长手机登录,同一学生并发会话上限固定为
3,超限时淘汰最久未活跃会话。
问题点与风险
- 现有 refresh 流程不安全(refresh token 与 access token同构),无法实现撤销与会话治理。
- 代码未接
tb_auth_refresh_token/tb_auth_login_audit,审计与风控链路缺失。 - 若角色体系未在 token 与网关策略中一致生效,会导致小程序端角色越权风险。
- JWT claims 字段不足(缺 tenant_path/adcode/clientType),会放大跨租户与跨端越权风险。
- 跨设备登录场景下,若缺少设备会话治理(会话上限/异地提醒/强制下线),共享手机会增加账号滥用风险。
已确定的实现决策
- 学生手动登录提供双可选主流程:
手机号+密码与手机号+短信验证码。 - refresh token 采用“每次刷新强制轮换”策略。
- 学生跨多家长手机登录并发会话上限固定为
3,超限淘汰最近最久未活跃会话。 - 身份区分以
role为准;小程序仅开放STUDENT角色,老师与机构角色不开放小程序登录。