Skip to content

功能:账号与登录

字数
1577 字
阅读时间
7 分钟

功能简介

账号与登录功能负责在微信小程序中建立、刷新和吊销 MindGuard 用户的安全会话,支持与校园身份绑定、风控验证与跨模块鉴权。该功能与“账号与资料管理”“隐私中心”“我的”Tab 紧密联动,是所有需要用户身份的业务流程的前置条件。

支持的登录方式

1. 微信一键登录

  • 入口:登录页面主按钮、全局登录失效弹窗。
  • 流程:wx.login → 云函数 authLogin 根据 code 获取 openid/unionid → 查询/创建 users 记录 → 下发 session_tokensession_id
  • 成功条件:用户状态为 active/inactive;更新 users.last_login_at
  • 失败处理:
    • E_USER_RESTRICTED:用户被封禁,提示联系辅导员/客服。
    • E_WX_AUTH_DENIED:用户拒绝授权,记录埋点 login_result(status=cancelled)。
    • 网络异常:允许重试,最多 3 次后提示稍后再试。

2. 绑定学号 + 密码(登录后补充身份)

  • 触发条件:users.campus_affiliation 缺失或 student_binding.status!='verified'
  • 接口:/api/auth/bind-student(POST),参数 student_idpasswordconsent_scope
  • 验证:调用校内认证网关,成功后写入 users.student_binding{student_id, verified_at, department})。
  • 风控:失败三次需短信或图形验证码辅助验证;支持“忘记密码”指引到学校自助系统。
  • 解除绑定:账号设置页可发起解绑,需再次验证微信密码或短信。

3. 其他补充登录能力(规划)

  • 守护人/辅导员以邀请链接进入时,可通过同流程完成微信登录,但需额外确认角色(users.role)。
  • 后续支持企业微信/教职工单点登录,可在 authLogin 中拓展凭据解析。

会话策略

  • 凭据形式
    • 前端持久化 session_token(header X-Session-Token)与 session_id(用于埋点)。
    • 云开发侧依赖 TCB 登录态 _openid 作为最终鉴权依据,所有数据库写操作校验 _openid
  • 有效期
    • session_token 有效期 7 天,refresh_token 有效期 30 天;存储于 sessions 集合。
    • 若 5 天内未活跃,ensureLoggedIn 触发静默刷新(调用 /api/auth/refresh)。
  • 刷新机制
    • 请求返回 401refresh_token 有效时自动调用刷新接口,成功后重放原请求。
    • 刷新失败时清除本地凭据并跳转登录页。
  • 登出策略
    • 用户在账号设置点击“退出登录”时调用 /api/auth/logout,服务端将 sessions.status 置为 revoked 并清空 refresh token。
    • 在设备风险检测、封禁时,后端可批量失效所有活跃会话。

业务流程

  1. 用户触发登录页或全局鉴权失败弹窗。
  2. 提交微信登录授权,后端创建/刷新用户记录与 sessions
  3. 前端存储 token,触发 getCurrentUser 拉取资料,更新“我的”Tab 欢迎卡与隐私中心入口。
  4. 若需要,展示学号绑定弹窗并完成校内身份补全。
  5. 后续每次请求前调用 ensureLoggedIn 校验 token 有效性,失效时自动刷新或跳转登录页。
  6. 用户主动退出或账号被封禁时,吊销 sessions 并清除本地缓存。

数据交互

  • 集合
    • users:写入 last_login_atstatusstudent_binding;引用参见《集合-用户.users.md》。
    • sessions:记录 session_tokenrefresh_tokenuser_iddevice_fingerprint 等字段,详见新增《集合-登录会话.sessions.md》。
  • 接口/服务
    • 云函数 authLogin:校验 code、生成凭据。
    • REST /api/auth/refresh:刷新 session。
    • REST /api/auth/logout:注销。
    • REST /api/auth/bind-student:绑定学号。
    • services/auth.js:提供 getCurrentUserensureLoggedIn 封装,统一错误处理与重定向。
  • 埋点pv_loginact_login_wechatact_login_bind_studentlogin_result。详见《埋点与数据分析.md》对应更新。

错误码与提示

错误码触发场景前端反馈说明
E_AUTH_EXPIREDsession 过期弹出“登录失效,请重新登录”调用 refresh 失败
E_USER_RESTRICTED用户状态 restricted/suspended展示封禁说明与申诉渠道不允许继续登录
E_CAPTCHA_INVALID验证码错误输入框标红 + 错误文本记录失败次数,触发冷却
E_STUDENT_BIND_FAIL学号认证失败提示校内账号或密码错误累计失败后要求验证码
E_DEVICE_RISK风控标记要求人工验证/联系客服sessions 标记 requires_review

安全与合规

  • 与《色彩系统》“错误提示”策略一致,避免大面积危险色造成二次打击。
  • 所有 token 使用 HTTPS 传输,存储在 wx.setStorageSync 前加密(可使用 AES 加密后存储)。
  • sessions 集合配置 TTL 索引自动清理过期记录,减少泄露风险。
  • 登录协议勾选状态同步写入 users.consent_version,与隐私中心一致。
  • 支持未成年人监护提醒:若 users.guardian_ids 为空且年龄 <18,登录成功后提示补充监护人。

测试与验收联动

  • 对应《测试用例.md》新增 LOGIN-* 用例,覆盖成功登录、验证码失败、封禁、token 过期重登、学号绑定。
  • 回归时需验证登录后“我的”Tab、任务列表等模块可正常读取数据。
  • 与上线流程联动:上线前必须完成正式域名、微信开放平台配置,并在体验版自测表中记录登录结果。

埋点与数据联动

  • 登录漏斗:pv_loginact_login_wechatlogin_result(status=success)act_login_bind_student
  • 失败样本分析:login_result(status=failed) 携带 error_code,可在数据后台按失败类型统计。
  • 会话续期监控:login_result(status=success, context=refresh) 用于衡量 refresh 成功率。

变更记录

  • 2024-04-07:新增账号与登录功能文档,定义会话策略、接口联动、测试与埋点要求。

贡献者

The avatar of contributor named as Cai Hongyu Cai Hongyu

文件历史

撰写