概述
持有者令牌只需被复制即可被重放。DPoP 把令牌绑定到一个客户端私钥,要求每个请求附带签名证明,资源服务器校验签名、令牌指纹与 jti,从而让单纯持有令牌的窃取者无计可施。
关键步骤
- 生成客户端密钥对,在令牌请求中随 DPoP 证明发送公钥。
- 每个 API 请求附带新鲜的 DPoP 证明。
- 在资源服务器校验证明签名、令牌指纹与 jti 重放 id。
- 拒绝证明与令牌绑定不符的请求。
验证
- 单独持有令牌无法调用接口。
- 重放同一证明被拒绝。
- 证明签名与令牌指纹均被校验。
- 时钟偏差在容忍窗口内不误伤。
注意事项
- DPoP 需要客户端管理密钥并为每请求附带证明,复杂度上升。
- 并非所有客户端都支持,迁移期可能需要同时接受持有者与 DPoP 令牌。
适用范围
本条目围绕「用 DPoP 将令牌绑定到客户端」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
const proof = await makeDpopProof({ htm: 'GET', htu: url, key: privateKey });
fetch(url, {
headers: { Authorization: `DPoP ${token}`, DPoP: proof },
});