【NestJS】stripe webhookの署名検証
概要
- 署名シークレットを取得
- リクエストに
rawBody
を追加する - コントローラで
request.rawBody
よりrawBody
を取得する - コントローラで
stripe-signature
より ヘッダの署名を取得する - 署名の検証
ハマりポイント
署名の検証時に raw body
が必要になるため、リクエストに rawBody
を追加する必要がある
1. 署名シークレットを取得
- 開発者の
Webhook
をクリック
-
エンドポイントを追加後、署名シークレットを取得
-
prefix
がwhsec_
-
2. リクエストに raw body
を追加する
- before
nest new [name]
で生成した結果
main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
- after
リクエストに raw body を追加する
main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { json } from 'body-parser';
const cloneBuffer = require('clone-buffer');
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(
json({
verify: (req, res, buf, encoding) => {
// リクエストに `raw body` を追加する
if (req.headers['stripe-signature'] && Buffer.isBuffer(buf)) {
(req as any).rawBody = cloneBuffer(buf);
}
return true;
},
}),
);
await app.listen(3000);
}
bootstrap();
3. コントローラから request.rawBody
で rawBody
を取得する
-
@Req
を利用し、request
を取得
controller.ts
@Req() request: Request
-
request
からrawBody
を取得する
controller.ts
(request as any).rawBody
4. コントローラで stripe-signature
より ヘッダの署名を取得する
-
@Headers
を利用し、stripe-signature
ヘッダの値を取得
controller.ts
@Headers('stripe-signature') sig,
5. 署名の検証
stripe = new Stripe()
stripe.webhooks.constructEvent(
(request as any).rawBody,
sig,
'whsec_...'
)
参考文献
Author And Source
この問題について(【NestJS】stripe webhookの署名検証), 我々は、より多くの情報をここで見つけました https://qiita.com/Naoto9282/items/d2f3e436087ad7999f15著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .