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)
}