2016-07-31 10 views
1

私はgocardlessフックで作業しています。私はhmacシグネチャをサンドボックス環境で検証しています。gocardless PHP hmacの署名が一致しません

私はサンドボックスでWebHookテストを生成し、送信したリクエストボディとヘッダーを私に提供します。

私が理解する限り、リクエストボディを取得し、秘密鍵でハッシュを生成し、webhook署名ヘッダーハッシュと比較する必要があります(実際は複雑ではありません)。

私はローカルの環境でそれを再現するために同じメッセージを添付していますが、署名は決して一致しません。ここで

は、私が試したものです:

$request_data = file_get_contents('php://input'); 
$signature = hash_hmac('sha256',$request_data, 'secret'); 
:私は私の最初の考えは多分フレームワークは、内部で要求を操作された、laravelフレームワークを使用していますので、私はこれを試してみました

$signature = hash_hmac('sha256',$request->getContent(), 'secret'); 

お知らせ

しかし、まだ...私はミーニー新しい行に気づき、私はそれを掃除ので、多分これが結果を修正することができ、

$request_data = str_replace(array('.', ' ', "\n", "\t", "\r"), '', $request_data); 
と一致していません

しかしまだ一致しません。また、私はutf8でボディデータをキャストしようとし、hmacをrawに戻してbase64でエンコードするようにしましたが、成功しませんでした。

ここで間違いがありますか?サンドボックス環境で署名が動作しない可能性がありますか?誰もそれに対処していますか?

ありがとうございます!

答えて

2

最後に私は問題を見つけました。彼らは要求がであることを示していますので、長さが違うので、テストしてみてください!今すぐ署名が一致します!

+0

のような何かをしたいhttps://developer.gocardless.com/getting-started/api/staying-up-to-date-with-webhooks/?lang=php#building-a-webhook-handler

でウェブフック署名の上の検証例を見つけることができますが、あなたがunminifiedによって何を意味するのか明確にしてくださいもらえますか?たぶん、例が役に立つかもしれません。 – guival

+0

私はgoocardless webhookをコピーして、postmanに送信したオブジェクトをコピーしてエンドポイントに送信し、webhooksを受信するようにシミュレーションしました。異なっている、彼らは白いスペースを意味していない縮小された要求を送る! –

+1

ありがとう、ありがとう。私は、改行などがあることを意味していると思いました。しかし、白いスペースは全くないはずです。 – guival

1

当社は、開発者向けドキュメントを更新しました、あなたはあなたが

<?php 
// We recommend storing your webhook endpoint secret in an environment variable 
// for security, but you could include it as a string directly in your code 
$token = getenv("GC_WEBHOOK_SECRET"); 

$raw_payload = file_get_contents('php://input'); 

$headers = getallheaders(); 
$provided_signature = $headers["Webhook-Signature"]; 

$calculated_signature = hash_hmac("sha256", $raw_payload, $token); 

if ($provided_signature == $calculated_signature) { 
    // Process the events 

    header("HTTP/1.1 200 OK"); 
} else { 
    header("HTTP/1.1 498 Invalid Token"); 
} 
関連する問題