标准 HTTP API 签名鉴权 Header 完整规范

一、统一请求头命名(全行业通用 X- 前缀)

Header 字段 含义 格式要求
X-App-Key 客户端应用唯一标识 字符串,服务端分配
X-Timestamp 秒级时间戳 10位Unix时间戳
X-Nonce 随机防重串 8~32位大小写+数字
X-Sign 最终签名值 大写MD5/SHA256
X-Real-IP 客户端真实IP 转发层透传
X-Device-Id 设备唯一标识 移动端/客户端可选

为什么都是X开头?

因为早期 HTTP 规范规定:

  • 不带 X-**:标准官方请求头(Host、User-Agent、Cookie、Referer 等)
  • X- 前缀**:代表私有、自定义、非标准化的头部字段

作用:

避免和未来官方标准头重名冲突

一眼区分:系统内置头 / 业务自定义头

行业通用习惯,所有人都这么约定

二、签名算法规则(通用最简版)

  1. 排序规则
    AppKey、Timestamp、Nonce、请求参数ASCII升序拼接

  2. 拼接格式

    key1=val1&key2=val2&...&secret=AppSecret

  3. 加密方式

  • 简易项目:MD5
  • 正式生产:SHA256
  1. 超时防刷
    服务端校验时间戳差值 ±60秒,超出直接拒绝

三、GET/POST 统一签名逻辑

  • GET:URL参数全部参与签名
  • POST JSON:JSON完整字符串参与签名
  • 路径、Header自定义字段不参与

四、请求示例

http 复制代码
POST /api/data HTTP/1.1
Host: shturl.cc/V
X-App-Key: client123666
X-Timestamp: 1747652000
X-Nonce: 8sJd72kP9z
X-Sign: E8F2D7A9C0B3E1F56789ABCD12345678
Content-Type: application/json

{"name":"test","id":1}

五、服务端中间件校验顺序

  1. 校验是否携带全部必填Header
  2. 校验时间戳是否过期
  3. 校验Nonce是否重复(Redis去重)
  4. 本地重组签名对比 X-Sign
  5. 校验通过放行,失败统一返回401

六、避坑要点

  1. 签名参数必须排序,顺序错必失败
  2. 前后端密钥一致、编码UTF-8
  3. 空格、换行、特殊字符原样参与加密
  4. 禁止把 AppSecret 放在请求头传输

七、极简通用签名伪代码

复制代码
str = 排序后所有参数拼接 + AppSecret
sign = SHA256(str).toUpperCase()
相关推荐
曲幽20 小时前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
带刺的坐椅3 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
Goodbye6 天前
大模型无状态架构:从 HTTP 协议到 Harness AI 工程的深度解析
http
曲幽7 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
曲幽8 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
霜落长河12 天前
抛弃TCP改用UDP,HTTP3怎么了?
http
之歆13 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
程序员mine13 天前
HTTPS-TLS加密与证书完全指南(下)
网络协议·http·https
SomeOtherTime13 天前
http协议处理播放video/mp4视频
http
llz_11213 天前
web-第四次课后作业
前端·spring boot·web