本页面为机器翻译。英文版本为原文,可能更准确或更及时。 查看英文版

Webhook 认证 —— 保护您的端点

finlight 提供多种认证方法来保护您的 webhook 投递。默认情况下,每个 webhook 都包含签名验证,并可选择附加的认证层以增强安全性。

finlight 支持四种认证方法,可单独使用或组合使用:

无附加认证

除默认的签名验证之外,没有附加认证。

何时使用:

  • 测试和开发环境
  • 位于安全网络之后的内部端点
  • 当签名验证已能提供足够的安全性时

注意: 无论此设置如何,每个 webhook 请求仍会包含签名验证。


FINLIGHT_KEY自定义标头

X-Finlight-Key 标头

在每个 webhook 请求中,通过自定义的 X-Finlight-Key 标头发送您的 API 密钥。

配置:

  • 在 webhook 设置期间提供您的 API 密钥
  • 该密钥将被包含在 X-Finlight-Key 标头中

实现: 您的端点应验证传入的标头:

const finlightKey = req.headers['x-finlight-key']
if (finlightKey !== 'your-expected-api-key') {
  return res.status(401).send('Invalid API key')
}

发送的标头:

X-Finlight-Key: your-api-key-value
X-Webhook-Signature: sha256=signature
X-Webhook-Timestamp: 2024-01-15T10:30:00.000Z

BASIC用户名/密码

基本认证

使用用户名/密码凭据的 HTTP 基本认证。

配置:

  • 在 webhook 设置期间设置用户名和密码
  • 凭据经过 base64 编码后在 Authorization 标头中发送

实现: 您的端点会收到标准的 HTTP 基本认证:

const auth = req.headers.authorization
if (!auth || !auth.startsWith('Basic ')) {
  return res.status(401).send('Missing Basic Auth')
}

const credentials = Buffer.from(auth.slice(6), 'base64').toString()
const [username, password] = credentials.split(':')

if (username !== 'expected-user' || password !== 'expected-pass') {
  return res.status(401).send('Invalid credentials')
}

发送的标头:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
X-Webhook-Signature: sha256=signature
X-Webhook-Timestamp: 2024-01-15T10:30:00.000Z

SIGNATURE始终包含

签名验证

自动安全保护: 无论您选择哪种认证方法,每个 webhook 请求都包含签名验证。

工作原理:

  1. finlight 在发送 webhook 时生成一个时间戳
  2. 通过拼接创建一条消息:timestamp + '.' + payload
  3. 使用您 webhook 的密钥,通过 HMAC-SHA256 对该消息进行签名
  4. 在标头中同时发送签名和时间戳

包含的标头:

X-Webhook-Signature: sha256=computed-signature
X-Webhook-Timestamp: 2024-01-15T10:30:00.000Z

签名算法:

message = timestamp + '.' + JSON.stringify(payload)
signature = HMAC-SHA256(message, webhook_secret)

SECURITY核心准则

安全最佳实践

时间戳验证

通过验证请求时间戳来防止重放攻击:

function isTimestampValid(timestamp, toleranceSeconds = 300) {
  const now = Date.now()
  const requestTime = new Date(timestamp).getTime()
  const difference = Math.abs(now - requestTime) / 1000

  return difference <= toleranceSeconds
}

安全地存储凭据

  • 环境变量:将所有密钥存储在环境变量中
  • 密钥管理:使用 AWS Secrets Manager、HashiCorp Vault 或类似工具
  • 切勿硬编码:切勿将密钥提交到版本控制
  • 定期轮换:定期更新 webhook 密钥

有关 webhook 设置指南,请参阅 webhooks 主文档。有关全面的测试,请查看 webhook 测试指南