Stripeでの署名検証について

Stripeのwebhookでの署名検証の実施方法についてアドバイスを頂けないでしょうか。

前提条件

BubbleでStripe決済のWebhookを利用し継続課金の更新や解約の処理を実装しております。
その処理自体は問題ないのですが、Webhookを受信した際に署名の検証を実施したいと思っています。

発生している問題

stripeから送られてくwebhookの署名検証用のデータ( 実際の JSON ペイロード)を使って検証用のデータを作成する必要がありますが、Backend workflowのAPIを使って取得したデータでは、rawデータであってもペイロードがBubbleによって前処理がされている為、実際のJSONペイロードと異なっています。
その為、署名の検証を実施することが出来ずに困っています。

実装したい機能

・Stripeでの署名検証
・今後の為にwebhookで受信したデータのrawデータ(送信されたままのリクエスト本文)の取得方法を知りたい

試したこと

・APIで取得したwebhookのrawデータが実際にstripeから送られてきているペイロードとは異なっていることを確認。
・試してはいませんが、以下参考にあるhookdeckを利用、もしくは自身で中間サーバーを立てて署名検証を中継することでも対応は可能かと思いましたが、bubble内で完結する方法があればと思い、質問をさせていただいております。

参考

➔明確な解決策は示されていない?

➔hookdeck利用を提案

stripeの署名検証について、知識がない中で深掘りをもう少しさせていただきたいのですが、

署名検証は、bubble内でどのような状態をつくれば署名検証したと言える状況になるのでしょうか?
(状況の例:rawデータと異なる形であっても、そのJSON内で振られているidが同一であれば良いとするのか)

また、
webhookの署名検証用のデータが元々はどのような形式でbubbleに保存された時にどのようになっているかなど、ご教示いただけると幸いです。

「いいね!」 1

@toshiki.azuma さん
ありがとうございます。

署名検証ですが、webhookの送信元がstripeであることを検証するものになります。
以下の様な処理で署名検証が可能になります。

・Stripeからはwebhookでタイムスタンプ(以下の"t")と署名(ハッシュ値)(以下の"v1")が送付される。
以下の内容がヘッダーに含まれています。

Stripe-Signature:
t=1492774577,
v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd,
v0=6ffbb59b2300aae63f272406069a9788598b792a944a07aba816edb039989a39

・上記のタイムスタンプ"t"と実際のJSONペイロード(リクエスト本文)を連結させたものをハッシュ化し、それを上記の署名"v1"と比較して一致すれば署名検証で問題無しとなります。(Stripeと自社サービスで共通でつかう秘密鍵を使ってハッシュ化します。)

困っているのは、ストライプから送られてくるJSONペイロード(リクエスト本文)をそのまま取得することが出来ない点になります。
本来、以下の様なペイロードが送られてきてます。
{
“object”: {
“id”: “pi_3OrX4MClJnoPIsRv0xxxx”,
“object”: “payment_intent”,
“amount”: 1000,
“amount_capturable”: 0,
“amount_details”: {
“tip”: {
}
},
“amount_received”: 1000,

Bubbleのrawデータとして取得すると、以下のようになります。

{“id”:“evt_3OrX4MClJnoPIsRv0o4wSwqM”,“object”:“event”,“api_version”:“2023-10-16”,“created”:1709779951,“data”:{“object”:{“id”:“ch_3OrX4MCxxxxx”,“object”:“charge”,“amount”:1000,“amount_captured”:1000,“amount_refunded”:0,“application”:null,“application_fee”:null,“application_fee_amount”:null,“balance_transaction”:“txn_3OrX4Mxxxxxxxx”,“billing_details”:{“address”:

単純に改行を取り除いたレベルでは無い感じで、元のペイロードに戻すことも出来ません。
ペイロードが一文字でも異なるとハッシュ値が異なり、署名検証は失敗するので元のペイロードをそのまま取得できないか、という悩みになります。

以下のStripeのページの「4 エンドポイントを保護する」➔「手動で検証する」の内容になります。

全くいい方法とは、思えないのですが、元のペイロードの形式にbubble側が変形してしまった形式の中から抽出するというのはいかがでしょうか。

{“id”:“動的”,“object”:“event”,“api_version”:“動的”,“created”:動的,“data”:{“object”:{“id”:“動的”,“object”:“charge”,“amount”:動的,“amount_captured”:動的,“amount_refunded”:動的,“application”:null,“application_fee”:null,“application_fee_amount”:null,“balance_transaction”:“動的”,“billing_details”:{“address”:

上記の中から、Extract with regex等を用いて抽出して元のペイロードの形式(下記のjson)に入れ込んで、

{
“object”: {
“id”: “”,
“object”: “”,
“amount”: ,
“amount_capturable”: ,
“amount_details”: {
“tip”: {}
},
“amount_received”: ,

元の形式に無理やり戻す。。。とかしか現状思い浮かんでおりません。
すみません。

「いいね!」 2

@toshiki.azuma さん、
考えて頂き、ありがとうございます!
こうなってくると、Bubbleに何とかするよう相談したくなりますね、、

「いいね!」 1

そうですね。。。

形式が毎度毎度変わってくるなら、このゴリ押しの方法も不可能ですし、
なかなか対処しづらいですね。

「いいね!」 2