跳到正文Skip to Content
核心概念DSN 与 HMAC 签名

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-DSNpublic_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。