DSN 与 HMAC 签名
DSN
接入任何 Argus SDK 都需要一个 DSN(Data Source Name),在 Console 创建项目时自动颁发。 DSN 分为两种安全边界:
# 原生端 / 后端:HMAC 签名
argus://<public_key>:<secret_key>@<host>[:port]/<project_id>
# 浏览器 Web SDK:仅公钥 + 服务端 Origin 白名单
argus://<public_key>@<host>[:port]/<project_id>| 片段 | 含义 |
|---|---|
public_key | 公钥,随上报放进 X-Argus-DSN 头 |
secret_key | 原生端 / 后端的 HMAC 密钥;浏览器 DSN 必须省略,不能写进前端构建产物 |
host[:port] | 上报端点;loopback 本地开发使用 HTTP,远程 host 默认使用 HTTPS |
project_id | 数据归属的项目 |
HMAC-SHA256 签名
原生端与后端的上报请求用 secret_key 在本地签名(密钥不出网)。浏览器无法保守 secret,
因此 Web SDK 的仅公钥请求不带 X-Argus-Auth,由 ingestion 端对该 key 的 Origin 精确白名单做
fail-closed 校验。HMAC 规范如下,跨 ingestion 与 SDK 实现逐字节一致:
canonical = METHOD + "\n" + PATH + "\n" + TIMESTAMP + "\n" + sha256_hex(BODY)
X-Argus-Auth = "HMAC-SHA256=" + base64( HMAC-SHA256(secret_key, canonical) )请求头:
| 头 | 值 |
|---|---|
X-Argus-DSN | public_key |
X-Argus-Timestamp | 当前 epoch 秒(服务端 ±300s 防重放,须为真实时间) |
X-Argus-Auth | 上面算出的签名 |
浏览器代码、前端环境变量与 source map 都不是秘密存储。若把 secret_key 交给 Web SDK,任何访问者
都能提取它并伪造请求;请只使用 Console 颁发的浏览器公钥,并把生产域名加入该 key 的 Origin 白名单。
两个时间戳别混:签名头 X-Argus-Timestamp 是 epoch 秒(鉴权);日志 / 事件条目里的
ts 是 epoch 毫秒(数据时间戳)。
跨语言一致性
各端 SDK 的签名实现都对同一份参考 fixture 做 CI 校验
(sdks/common-protocol/testdata/hmac-fixtures.json),
保证 Go(后端)、TypeScript(Web)、Dart(Flutter)等签出的请求字节一致。后端日志 shipper 的
sign() 也与独立实现交叉验证过——任何语言按上面的 canonical 公式即可自行实现。
完整协议见
docs/07-design/sdk-protocol.md§5、后端接入指南docs/07-design/backend-log-ingestion.md。