架构、信任边界与流程图
以下图形是仓库内静态 SVG,随单二进制嵌入;不访问 CDN 或在线渲染。可点击原图后保存。图中箭头表示请求或结果交付,不代表客户端可以绕过鉴权;重试仅适用于标出的安全分支。
三种接入方式
- 统一登录:浏览器导航到平台,平台 Cookie 仅属平台。
- 授权码回调 → Secret + PKCE 换码 → 本地业务会话。
- 自定义 Web:同源 CSRF POST 创建,verifier/state/nonce 留后端。
- 密码 / 短信 / 扫码直接认证;短期 WebAuth 凭据留内存。
- 一次性 code 同源交付;长期 Token 只存产品后端。
- Native:原生 HTTP + PKCE;无 Secret、不依赖浏览器 Cookie。
官网不跳页认证时序
- ① 当前业务会话 + CSRF 创建事务。
- ② Web Basic、精确 Origin、回调、state、nonce、S256。
- ③ 五分钟凭据;不返回 Web Secret / verifier。
- ④ WebAuth + Origin:二维码 / 短信 / 密码;Cookie omit。
- ⑤ ready 后同意协议 → 一次性 code(60 秒)。
- ⑥ 同源 POST code;后端校验原会话、state、issuer、回调。
- ⑦ Basic + verifier 换码、RS256/JWKS + nonce + UserInfo。
- ⑧ 业务会话 Cookie;长期 Token 不返回浏览器。
桌面原生认证时序
- ① 随机 verifier/state/nonce;Native Client 创建五分钟事务。
- ② 原生 HTTP 下载二维码 / 提交短信 / 密码。
- ③ ready / phone_required;新身份绑定手机号。
- ④ 当前协议 + complete;领取一次性授权码。
- ⑤ 无 Secret;S256 verifier 换 Token。
- ⑥ 校验签名、issuer、aud、exp、nonce;Token 存系统凭据库。
- ⑦ 产品校验用户身份后映射 stable sub;错误不自动重放。
公众号关注与扫码
- 创建随机场景与事务;二维码有效五分钟。
- 申请公众号临时带参数二维码。
- 未关注:扫码并关注;已关注:扫码。
- subscribe / SCAN:签名 + AES 解密、一次性事件处理。
- UnionID 已绑定 → ready;新身份 → phone_required。
- 短信确认手机号;当前协议;原事务完成。
- 身份冲突:拒绝自动合并;过期/取消/重放:拒绝。
短信挑战与结果未知
- 提交 E.164 手机号;凭据绑定用途与事务。
- 原子限流 + 挑战预留;随机源失败直接拒绝。
- 发送一次,不对未知结果自动重试。
- 明确受理 → 激活挑战;明确失败 → 回滚预留。
- 超时 / 连接中断 → unknown;挑战不激活。
- 返回 202 unknown,等待 >=60 秒后由用户手动决定。
- 短信校验只消费本事务激活挑战;Redis 故障返回 503。
改密与撤销的事务边界
- reset 无会话;set 绑定该 Client 的有效 Access Token。
- 本事务短信验证;set 只能验证账号当前手机号。
- 复核账号状态、手机号、认证版本和源 Token。
- 提交新密码:统一策略 + Argon2id。
- 同一提交:密码 + 中央 Session/Token 撤销 + 旧证明取消。
- 同一提交:user.sessions_revoked Outbox。
- 完成后重新登录;不发授权码 / 新会话;超时不自动再提交。
- 产品消费签名事件,幂等撤销本地业务会话。
授权码和刷新重放防护
- 一次性 code + PKCE(Web 另加 Basic)。
- 授权码原子消费;检查 Client、回调、授权请求未撤销。
- 返回 ID / Access / Refresh;校验签名和 nonce。
- 串行刷新;旧 Refresh 一经使用不得再用。
- 轮换新 Refresh;撤销原关联 Access。
- 旧 code 重放 → 拒绝;旧 Refresh 重放 → 撤销 family。
- 网络结果未知:停止自动重放,重新登录恢复。
认证短信与业务短信
- WebAuth / Native:平台生成和验证 OTP;不返回验证码。
- Service Token sms:send:调用已授权业务模板。
- 业务短信只返回受理/未知状态;不是用户认证证明。
- 认证成功只交付一次性登录 code,不给服务 Scope。
- 业务查询使用 sms:read;模板和额度按产品隔离。
- 浏览器绝不持 Service Secret / 服务 Access Token。
支付回调与退款信任边界
- 产品服务端定价,整数分 + 幂等 Key 创建。
- 随机收银台 URL;浏览器不能改金额。
- 创建渠道单;超时未知由 Worker 查询。
- 签名回调 + 解密 + 商户/金额/币种核验。
- 行锁幂等:paid + Outbox 同一事务。
- 签名 payment.succeeded;产品事件幂等交付权益。
- 退款:幂等 Key、累计金额;超阈值待人工审批。
- 退款回调 / 查询确认;对账差异不自动改资金状态。
Webhook 至少一次投递
- 业务状态与事件原子写入;事件含稳定 sub,不含完整手机号。
- 事件 ID、时间戳、HMAC 签名;TLS 固定端点。
- 校验签名与时效;事件 ID 唯一约束。
- 业务处理和已消费标记同一事务。
- 成功返回 2xx;重复事件也幂等成功。
- 超时 / 非成功:指数退避;不把超时当业务未发生。
- 重投同一事件 ID;产品不得重复交付权益。