认证与请求签名
不支持 Bearer 认证。每个 /v1 操作都必须带以下四个请求头;X-Sx-Actor 只是可选审计文本,绝不参与授权。
text
X-Sx-Key-Id: sxk_<16-32 位小写字母或数字>
X-Sx-Timestamp: <10 位 Unix 秒>
X-Sx-Nonce: <16-64 位 A-Za-z0-9_->
X-Sx-Signature: v1=<标准 base64>
X-Sx-Actor: <可选;清除控制字符并截到 128 位>规范请求
严格用 LF(\n)连接七行,末尾不能有换行:
text
sx-v1
{大写 HTTP 方法}
{与实际发送完全一致的路径和查询串}
{KEY_ID}
{TIMESTAMP}
{NONCE}
{原始 body 字节的 SHA256 小写十六进制}路径以 / 开头并包含查询串,必须与 HTTP 客户端实际发送的字节一致。无 body 时哈希空字节串(e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)。body 只序列化一次,同一份字节用于签名和发送。
hmac-sha256:用发放的 secret 对规范 UTF-8 字符串做 HMAC-SHA256。rsa2:使用至少 2048 位私钥做 SHA256withRSA(PKCS#1 v1.5)。
结果用标准 base64 编码并加 v1= 前缀。算法由服务端保存的签名材料决定,不由调用方请求头任选。
校验顺序
服务端依次执行 Redis 预认证限流、规范字段校验、±300 秒时间窗、凭据查询与验签,最后才在 Redis 占用 nonce。验签前,未知 key id、已退出材料和错误签名返回相同结果;签名有效后,已吊销、停用、过期、重放和来源 IP 不允许才返回各自的安全错误。
nonce 在接受窗口内必须唯一。服务端只生成一个 req.partnerCaller;认证后继续检查 workspace 存在性/类型和类型化 scope,缺少元数据时失败关闭。
OpenAPI 无法计算签名。其中四个 apiKey 声明只用于说明必需请求头;“try it out”不会产生有效调用。