Webhookとは?
WebhookとはWEBシステムで特定のイベントが発生した際に外部システムへHTTPでリアルタイムに通知する仕組みのことです。
事前に通知するタイミングや通知の内容や通知の宛先を指定しておくことで、他システム連携が可能になります。
例えば、申請データのステータスが完了になった時に他システムにその情報を連携する、といった使い方ができます。
とても便利な仕組みですが、受信側システムとしてはメッセージが改ざんされていないかどうかは重要なポイントですね。
今回は外部システムからServiceNowに送られてきたWebhookメッセージが改ざんされていないか検証する方法をご紹介したいと思います。
事前に用意するもの
メッセージ送信側システムで作成された下記3点
・秘密鍵
・メッセージ本文
・ハッシュ値
サンプルスクリプト
今回はServiceNowのScripted REST APIs宛てに送信されたDocuSign Connectからのメッセージを扱います。
DocuSign Connectからのリクエストヘッダーには秘密鍵でハッシュされたメッセージ本文が含まれています。
DocuSignの秘密鍵とリクエスト本文を使ってServiceNowでもハッシュ値を生成し、
リクエストヘッダーに同じ値が含まれているか検証します。
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var bodyAll =JSON.stringify(request.body.data);
var Headers =JSON.stringify(request.headers);
//秘密鍵と取得したbodyを使用してハッシュ値を作成する。
var mac = new GlideCertificateEncryption;
var key = "送信側システムで作成した秘密鍵";
key = GlideStringUtil.base64Encode(key); //base64に変換されている場合はここは不要
var h = mac.generateMac(key, "HmacSHA256", bodyAll);
if (Headers.indexOf(h) !== -1) {
//検証OKの場合に実行する処理を記載する
}
})(request, response);
上記の処理で作成したハッシュ値がリクエストヘッダーに含まれていたら
・DocuSign Connectから送信されたメッセージである
・メッセージは改ざんされていない
ということがわかります。
終わりに
今回はDocuSign Connectから受信したリクエストをもとにご紹介しましたが、別システムからのリクエストの検証にも転用できるのではと思っています。
似たようなケースを検討されている方は上記方法をぜひ試してみてください。
参考サイトまとめ
DocuSign
ServiceNow
Developerサイト - GlideCertificateEncryption
Developerサイト - GlideStringUtil