GET接口调用的两段鉴权链路
■ 鉴权分两段,先换短期访问令牌,再用令牌签名请求,令牌本身不承载任何身份信息。■
如果你也在处理WhatsApp网页版,这篇可以顺手对一下。 顺便一提,WhatsApp网页版 讲的是另一个容易忽略的点。 相关的坑WhatsApp网页版 里列得比较细,可以对照看看。 顺便一提,WhatsApp网页版 讲的是另一个容易忽略的点。
调用方先以凭证换取访问令牌,有效期以分钟计。
每次请求需携带令牌与请求体摘要,两者共同参与签名。
服务端只校验签名与有效期,不解析令牌内的业务信息。
因此令牌泄露的窗口很短,但签名密钥泄露则风险极高。
签名覆盖请求体摘要,任何字节改动都会导致校验失败。
时间戳用于限制重放窗口,超出容差即视为过期请求。
密钥应存放在服务端,不得下发到浏览器或客户端。
换取令牌的凭证同样需要轮换,长期不换等于长期暴露。
// 请求头结构示意 Authorization: Bearer <access_token> X-Sign: hmac_sha256(secret, method + path + body_digest) X-Ts: 1761… // 秒级时间戳,容差 ±120s
POST限流的计数口径与退避
■ 限流按主体计数而非按 IP,同一主体下所有席位共享同一份额度,单席位统计必然算错。■
额度以窗口滚动方式计算,非固定整点重置。
读请求与写请求分属不同额度池,互不挤占。
超出额度返回的状态码与业务错误不同,应分别处理。
重试需带退避,否则会在窗口内持续消耗剩余额度。
| scope | window | burst | retry-after |
|---|---|---|---|
| read | 60s 滚动 | 允许短时突发 | 按剩余窗口算 |
| write | 60s 滚动 | 严格 | 同上 |
| handshake | 300s 滚动 | 极低 | 指数退避 |
| webhook | 不适用 | 接收方决定 | — |
POST回调重试的幂等设计
■ 回调至少投递一次,接收方必须自行去重,事件编号是唯一可靠的键,时间戳会重复。■
投递失败按指数退避重试,重试次数有上限。
超限后进入死信,需主动查询而非等待推送。
同一事件可能因确认超时被重复投递,属设计内行为。
去重键应使用事件编号,时间戳与内容摘要都可能重复。
处理逻辑必须幂等,重复执行不应产生额外副作用。
// 幂等处理骨架
if (store.has(evt.id)) return 200;
store.put(evt.id, processing);
try { apply(evt); store.put(evt.id, done); }
catch (e) { store.del(evt.id); return 500; }
return 200;
ENV沙盒与生产的隔离边界
■ 沙盒与生产使用独立凭证与额度池,跨环境复用凭证是最常见的错误,且报错信息不指向它。■
沙盒返回的是构造数据,不具备真实投递能力。
两套环境的凭证互不通用,混用会直接返回鉴权失败。
额度池同样独立,沙盒内的压测不会影响生产。
切换环境只需替换基础地址与凭证,路径结构保持一致。
接入前的四项核对动作
■ 核对顺序固定,先指向环境再核对凭证,最后才做压测,顺序颠倒会污染额度统计。■
- 先确认基础地址指向目标环境,再核对凭证归属。
- 记录当前额度用量,避免重试放大消耗。
- 回调接收端实现事件编号去重,再接入生产。
- 上线前用沙盒压测,观察限流返回与退避策略。
- token_ttl
- 访问令牌有效期,以分钟计,过期需重新换取。
- scope
- 额度池的划分维度,读写与握手各自独立计数。
- event_id
- 回调事件的唯一编号,是幂等去重的可靠键。
生产环境一直返回鉴权失败
[核心疑难] 多因凭证与环境不匹配,而非签名算法错误。
[底层诊断] 沙盒与生产凭证互不通用,混用直接拒绝,替换凭证即可验证。
回调收到两次一模一样的通知
[核心疑难] 确认超时会导致重复投递,属设计内行为。
[底层诊断] 接收方须以事件编号去重,处理逻辑保持幂等,重复执行不产生副作用。
额度没用完却开始被限流
[核心疑难] 额度以主体为单位,席位共享同一份额度。
[底层诊断] 其他席位的调用同样计入,需按主体统计而非单席位统计。
接口侧变更记录
→ 10月23日 令牌有效期维持分钟级,签名覆盖方法路径与体摘要
→ 10月23日 时钟容差双向一百二十秒,超出即判过期
→ 10月23日 限流以主体计数,席位共享同一额度池
→ 10月23日 读写额度分池,读请求突发容忍度更高
→ 10月23日 回调至少投递一次,去重键应为事件编号
→ 10月23日 重试按指数退避,超限进入死信需主动查询
→ 10月23日 沙盒与生产凭证互不通用,跨环境复用直接拒绝
→ 10月23日 沙盒压测不影响生产额度,两套池完全隔离