Facebookのライブラリをnode.jsで実装しようとしていますが、リクエストの署名が機能していません。私はPHPの例seen hereをノードに変換しています。私はそこに与えられた例でそれを試しています。秘密は文字列 "秘密"です。私のコードは次のようになります。node.js hmac.digest()の出力が間違っているようです
var signedRequest = request.signed_request.split('.');
var sig = b64url.decode(signedRequest[0]);
var expected = crypto.createHmac('sha256', 'secret').update(signedRequest[1]).digest();
console.log(sig == expected); // false
私はできませんconsole.log
デコード文字列自身、彼らは(あなたがそれを回避するための提案を持っているなら、私に知らせてください)コンソールをクリアする原因となる特殊文字を持っているので、しかし、私はそれらのb64urlエンコーディングを出力できます。
あなたはFBのドキュメント上で見ることができるように期待エンコードSIGは、エンコードされた
vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso
マイexpected
値は、
wr5Vw6DCu8KuAUBhUkLCtjRlw4JBZATCjMK9wovDkx7Dr0ZDRgzDtsK4w49Kw4o
ですなぜ私はそれが間違っていることdigest
だと思います?たぶんエラーは私の側にありますか?さて、ドキュメントにあるPHPの正確な例を実行すると、正しい結果が出てきます。最後のパラメータがfalseであるので、私はhash_hmac
コールを変更した場合、私は戻って私のjavascriptのコードに行く、と.digest("hex")
代わりのデフォルト"binary"
に私のHMACコードを変更した場合でも、六角を出力し、私は、今
YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ==
を取得し、結果のbase64エンコーディングを記録すると、私は...驚きを得る!
YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ
同じ、==以外兆候は終わりをオフに欠けているが、私はそれは、コンソールの事だと思います。私はそれが問題であるとは想像もできませんが、それは有効なbase64文字列の長さでさえありません。
したがって、ダイジェストメソッドは16進数の使用時に正しい結果を出力しますが、バイナリを使用すると間違った答えはどうなりますか?バイナリはPHP同等の "raw"出力と全く同じではありませんか?それが正しい場合は、それを呼び出す正しい方法は何ですか?
ちょっとチェックして、私が提供したコードは[v0.4.7](https://github.com/joyent/node)で完全に動作します。 /コミット/ c85455a954411b38232e79752d4abb61bb75031b)... –