DSN 与 HMAC 签名
DSN
接入任何 Argus SDK 都需要一个 DSN(Data Source Name),在 Console 创建项目时自动颁发:
argus://<public_key>:<secret_key>@<host>[:port]/<project_id>| 片段 | 含义 |
|---|---|
public_key | 公钥,随上报放进 X-Argus-DSN 头 |
secret_key | 密钥,仅用于本地 HMAC 签名,不出网 |
host[:port] | 上报端点;:443 走 https,否则 http;本地默认 localhost:4318 |
project_id | 数据归属的项目 |
HMAC-SHA256 签名
每个上报请求都用 secret_key 在本地签名(密钥不出网)。规范如下,跨 ingestion 与所有
SDK(Go / TypeScript / Swift / Kotlin / Dart)逐字节一致:
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 | 上面算出的签名 |
两个时间戳别混:签名头 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。