EGreg
(Greg Magarshak)
1
こんにちは。Discourse の Webhook を使って、ユーザーの作成や更新時のイベントを利用したいと考えていますが、Discourse から送信されるデータを信頼できるようにしたいです。公開鍵と秘密鍵のペア、あるいは少なくとも署名を検証するために使える共通のシークレットキーを導入することは可能でしょうか?また、すべてのペイロードに署名するための標準的なフレームワークと、署名のシリアライズと検証を行うための標準的な PHP 実装(例)を提供することは可能でしょうか?
Facebook は、ユーザーに関する情報を送信する際にこのような仕組みを採用しています。これにより、他のソフトウェアが Discourse のユーザーやその他のオブジェクトと統合できるようになります。
simon
2
Webhook 秘密鍵は、お探しのものに近いですか?以下は、WP Discourse プラグインが WordPress に設定された Webhook 秘密鍵に対してそれを検証する方法です。
public function verify_discourse_webhook_request( $data ) {
$options = $this->get_options();
// X-Discourse-Event-Signature は、'sha256=' . raw ペイロードの hmac で構成されます。
// これは `hash_hmac( 'sha256', $payload, $secret )` を計算することで生成されます。
$sig = substr( $data->get_header( 'X-Discourse-Event-Signature' ), 7 );
if ( $sig ) {
$payload = $data->get_body();
// リクエストの検証に使用される鍵 - 一致する鍵を Discourse Webhook に設定する必要があります。
$secret = ! empty( $options['webhook-secret'] ) ? $options['webhook-secret'] : '';
if ( ! $secret ) {
return new \WP_Error( 'discourse_webhook_configuration_error', 'Webhook 秘密鍵が設定されていません。' );
}
if ( hash_hmac( 'sha256', $payload, $secret ) === $sig ) {
return $data;
} else {
return new \WP_Error( 'discourse_webhook_authentication_error', 'Discourse Webhook リクエストエラー: 署名が一致しませんでした。' );
}
}
return new \WP_Error( 'discourse_webhook_authentication_error', 'Discourse Webhook リクエストエラー: リクエストに X-Discourse-Event-Signature が設定されていません。' );
}
「いいね!」 3