オンライン決済サービスのStripeで定期課金を実装する機会があったのですが、1つ問題として「どうやってStripeからのWebhookをローカルホストで受け取るか」というものがありました。

調べてみた結果、UltraHookというサービスを用いることで解決したので、この導入方法についてまとめてみます。

Webhookとは

そもそもWebhookとはどういうものなのでしょうか。

Webhookは、あるアプリケーションから別のアプリケーションに対してデータを送信する仕組みのことをいいます。

前述のStripeでいうと、あるユーザの決済処理が完了しました、というデータをアプリケーションに通知する際にこのWebhookが利用されます。

問題点

開発環境における問題点として、Webhookを受け取るには、そのエンドポイントをパブリックネットワーク上に公開する必要がある、ということです。

開発環境はローカルホスト、つまりパブリックネットワーク上にない場合が多いと思います。 これを解決するのがUltraHookです。

UltraHookとは

UltraHookとは、簡単に言うと「パブリックネットワーク上にエンドポイントをつくり、それに対するリクエストをローカルホストのエンドポイントにトンネルしてくれるサービス」です。

パブリックネットワーク上のエンドポイントは永続化してくれますし、無料で利用できるといった特徴があります。

導入方法

それでは、このUltraHookの導入について書いていきます。 まず公式サイトよりユーザ登録し、手順に従ってAPIキーを設定します。

次に、Gemでクライアントライブラリをインストールします。

$ gem install ultrahook

あとは次のようにコマンドを実行すると、ログのようにローカルホストに対してトンネルを作成してくれます。

$ ultrahook stripe 5000
Authenticated as {username}
Forwarding activated...
http://stripe.{username}.ultrahook.com -> http://localhost:5000

セキュリティ

これはUltraHookに限らず言えることですが、Webhookを利用するということは、副作用のあるエンドポイントをパブリックネットワーク上に公開する、ということです。

つまり、そのURLを見つけた第三者から、なんらかの攻撃を受ける可能性をつくってしまいます。

これを防ぐ簡単な方法として、リクエストにトークンを含めるようにし、アプリケーション側でトークンによる認証を行なえばよいです。 もちろん完全ではありませんが、簡単に実装できて大きな効果が得られると思います。

https://example.com/api/xxx?token=xxxxxxxxxxxxxxxx

参考記事

おわりに

UltraHookに関しては開発元がちょっと不透明な気がしますが、クライアントライブラリのソースコードを見る限り大丈夫なようでした。

ただ、機密情報が流れないよう、UltraHookの利用はテストのみにするよう気をつけたいですね。