Fri Jan 09 2026
...
Webhook 安全更新
新变化
之前,设置 Webhooks 相比于其他平台有额外的摩擦。我们认为这是件好事,因为需要额外的安全措施,然而我们最近确定了一种机制,既安全又是可选的。
之前的行为
以前,系统会在负载中传递您的 API 密钥,并期望您进行验证。如果您没有返回 401 表示无效的 api 密钥,系统将不允许设置。
新行为
现在,对于新的 webhook 配置,系统将不再传递 API 密钥。相反,对于新的和现有的集成,将包括一个经过签名的 HMAC 签名。您可以根据所需的安全级别选择是否验证此签名。
现有配置将继续传递 API 密钥 - 您现在可以通过支持票请求关闭此功能。
HMAC 签名验证
FastComments 现在在每个 webhook 请求中发送以下头部:
| 头部 | 描述 |
|---|---|
X-FastComments-Timestamp |
请求签名时的 Unix 时间戳(秒) |
X-FastComments-Signature |
HMAC-SHA256 签名,格式为 sha256=<hex> |
token |
您的 API 密钥(保留用于向后兼容) |
签名计算方法
- 连接:
timestamp + "." + JSON_payload_body - 使用您的 API 密钥作为密钥计算 HMAC-SHA256
- 十六进制编码结果
示例验证(Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# 验证时间戳是否合理
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# 验证签名
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
HTTP 方法选择
此外,这次更新还增加了配置每个 webhook 事件类型的 HTTP 方法的功能:
- 创建事件:POST 或 PUT(默认:PUT)
- 更新事件:POST 或 PUT(默认:PUT)
- 删除事件:DELETE、POST 或 PUT(默认:DELETE)
安全优势
新系统有一些优势:
- 防止中间人攻击
- 通过时间戳验证防止重放攻击
- 负载篡改检测
向后兼容性
包含您 API 密钥的 token 头仍然在每个请求中发送。现有集成将继续正常工作,且如前所述,您可以请求通过支持关闭旧行为。
文档
有关完整文档,请参见我们的 Webhooks 指南。
结论
像所有重大版本一样,我们很高兴能够花时间优化、测试并正确发布这些更改。如果您发现任何问题,请在下面告诉我们。
干杯!
