Skip to content

Webhook

Webhooks提供了一种将通知发送到外部web服务器的方式。

签名验证

为了让我们自身服务器信任这次请求不是伪造的,我们会在配置 Webhooks 的时候填写一个 Secret 信息。Github 每次请求我们接口的时候,都会将请求的数据和我们配置的 Secret 来进行 HMAC-SHA1 签名,然后放入请求头 X-Hub-Signature 中,以便我们服务器进行签名验证。

ts
import type { BinaryLike } from 'node:crypto'
import { createHmac, timingSafeEqual } from 'node:crypto'

const SECRET = '123456'

/**
 * 签名算法
 * @param data 响应数据
 * @returns 签名
 */
function sign(data: BinaryLike) {
  return `sha1=${createHmac('sha1', SECRET).update(data).digest('hex')}`
}

/**
 * 数据效验
 * @param signature 签名
 * @param data 接口响应的数据
 */
export function verify(signature: string, data: any) {
  const sig = Buffer.from(signature)
  const signed = Buffer.from(sign(data))

  if (sig.length !== signed.length)
    return false

  return timingSafeEqual(sig, signed)
}