Webhook 验证
本文档说明如何验证接收到的 QI Tech webhook 请求的真实性和完整性。
Webhook 请求格式
请求头
| 字段 | 描述 |
|---|---|
Authorization | 包含 JWT 令牌的签名头部 |
请求体
标准 JSON 格式的 webhook 数据。
验证步骤
1. 导入所需库
根据您使用的编程语言,导入处理 JWT 和加密哈希的库。
2. 定义 QI Tech 公钥
使用 QI Tech 提供的公钥对请求进行验证。
3. 解密 Authorization 头部
AUTHORIZATION 头部包含一个 JWT 令牌,需要使用 QI Tech 公钥进行解密和验证。
4. 执行验证
解密 JWT 后,请验证以下内容:
- 方法(Method):确认请求使用的 HTTP 方法正确
- URI:确认请求的 URI 与预期一致
- Payload MD5:对接收到的 body 计算 MD5 哈希值,并与 JWT 中的值进行对比
- 时间戳(Timestamp):确认时间戳在合理范围内,以防止重放攻击
- Python
import hashlib
import json
import jwt
QI_TECH_PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
<YOUR_QI_TECH_PUBLIC_KEY>
-----END PUBLIC KEY-----"""
def validate_webhook(authorization_header, request_body, method, uri):
# 解密 JWT
decoded = jwt.decode(
authorization_header,
QI_TECH_PUBLIC_KEY,
algorithms=["ES512"]
)
# 计算 payload 的 MD5 哈希值
body_string = json.dumps(request_body)
md5_hash = hashlib.md5(body_string.encode()).hexdigest()
# 解析签名字符串
signature = decoded["signature"].split("\n")
# 验证各字段
assert signature[0] == method
assert signature[1] == uri
assert signature[2] == md5_hash
return True