Files
airz-uniapp/docs/superpowers/specs/2026-10-12-account-sms-design.md
hujun c95482a0f3 feat: 实现协议全文与同意记录功能
新增协议全文后台管理、版本化发布及本人同意记录功能,支持可撤销授权;完善资料与授权相关边界提示,调整评估提交时的资料与授权校验逻辑,同步更新相关页面文案与路由。
2026-10-14 14:53:13 +08:00

2.5 KiB

短信登录与账户安全内部实现

用户已授权先写相关代码;供应商、已审核签名及模板暂缺。本轮只实现本地代码并使用全新隔离存储验证,不能发送真实短信、部署、提交或修改生产。产品机构库由同事维护,不触及产品代码;不恢复已回撤的产品AI分析,不改融资评估28项输入。

接口与行为

沿用手机号登录/注册、验证码改密、手机号双验证换绑页面和JSON契约。发送成功返回retryAfter/expiresIn;未配置短信始终503/SMS_NOT_CONFIGURED,不产生可用验证码或用户。供应商接口只定义send(phone,code,purpose)及可用性,默认不可用,测试替身仅放tests。未来真实适配需明确启用、审核签名/各用途模板及服务端凭据。

验证码六位、安全随机,Redis仅保存带服务端秘密的摘要,手机号/上下文键使用摘要;60秒同号码冷却、号码/IP限流、300秒过期、最多5次错误。验证码绑定用途、号码和账户当前手机号;多挑战同一次Lua原子核销,错误不能消耗另一个正确挑战,重复/并发核销最多成功一次。发送失败/未知不激活,预留失败次数仍算限流。不能在响应、业务日志或持久测试回执中保存明文码。

短信登录支持已存在正常账户及首次注册;随机不可知初始密码、邮箱null、默认昵称和零积分,沿用已有密码哈希与Token。现有唯一手机号约束防并发重复注册,账户行锁与Auth::direct串行防换绑后旧号码登录。注册Hook或存储失败不返回Token。禁用账户不登录。

安全发送/改密/换绑须认证,账户行锁内再次检查会话有效性与当前手机号。验证码改密只支持已登录本人;不新增匿名找回密码流程。换绑同时验证原号码和新号码,校验占用及唯一约束,事务写入当前账户手机号,撤销本人全部会话,不重写历史融资快照。验证码先原子消费,后续业务失败不恢复验证码,须明确重新发送,避免跨Redis/SQL补偿导致重放。

验证与发布边界

测试使用全新本机MySQL/Redis、独立ROOT及显式bootstrap,真实模型屏蔽、供应商发送只在测试中注入。覆盖用途/账户隔离、过期/限流/错误上限、发送失败、双码、注册并发、Token撤销、禁用、Hook及事务故障;回归现有密码登录与资料。无渠道配置时上线仍不可发送,本轮不视为短信业务已上线或真实渠道验收。