我在一个nextjs 13应用程序中有一个webhook,它使用了新的应用程序路由器。传入的lemon squeezy请求经过签名,并在x-signature
报头中提供该签名。
根据他们的文档,签名必须从原始身体计算出来。我如何在应用路由器路由中访问它?
我尝试了这个,但它(显然)不会工作,因为它不处理原始数据,而是处理已解析的主体。(顺便说一下,传入的Request
对象中的body对象是ReadableStream类型)
const isSignatureValid = (requestSignature: string | null, body: any) => {
const secret = process.env.LMS_SECRET || "";
const hmac = crypto.createHmac("sha256", secret);
const calculatedHash = hmac.update(JSON.stringify(body)).digest("hex");
console.log("found signature:", `[${requestSignature}]`);
console.log("calculated hash:", `[${calculatedHash}]`);
const digest = Buffer.from(calculatedHash, "utf8");
const signature = Buffer.from(requestSignature || "", "utf8");
return digest.length === signature.length && crypto.timingSafeEqual(digest, signature);
};
1条答案
按热度按时间cx6n0qe31#
解决了这个问题。我首先将
Response
对象的主体加载到Buffer中,该对象的类型为ReadableStream<Uint8Array>
。我用了这个方法我找到了here
完成此操作后,流将被消耗,您不能再使用
req.json()
方法。但是,你可以简单地toString()
body,然后像这样解析json: