2011-12-18 8 views
3

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"出力と全く同じではありませんか?それが正しい場合は、それを呼び出す正しい方法は何ですか?

答えて

0

私はTesserexのパートナーです。答えは、Tesserexの自己回答とJuicy Scripterの回答の両方の組み合わせだったと思います。私たちはまだノードverを使用していました。 0.4.7。 Tesserexが言及したバグはhttps://github.com/joyent/node/issues/324で見つけることができます。私はこのバグが私たちに影響を与えているかどうかは完全には分かっていませんが、それは良い可能性のようです。 Nodeをver 0.6.5にアップデートし、Juicy Scripterのソリューションを適用しました。ありがとうございました。

既存のライブラリを使用することの提案についての注意として。既存の図書館のほとんどは特急を必要としていますが、これはアプリケーションの仕様のいくつかを避けようとしているものです。また、既存の図書館では、node.jsをWebサーバーのように使用し、一度に単一のユーザーの要求に答えると仮定しています。私たちはウェブソケットとの永続的な接続を使用しています。私たちのFacebookクライアントは複数のユーザーのセッションデータを同時に処理します。最終的に私たちのFacebookクライアントを私たちのようなアプリケーション用のオープンソースにしたいと考えています。

+0

ちょっとチェックして、私が提供したコードは[v0.4.7](https://github.com/joyent/node)で完全に動作します。 /コミット/ c85455a954411b38232e79752d4abb61bb75031b)... –

0

が実際digestに問題がないあなたが使用している場合、b64url.decodeの結果は、(第2パラメータで指定することができる)、デフォルトでutf8エンコーディングである:ダイジェストの

var sig = b64url.decode(signedRequest[0], 'binary'); 
var expected = crypto.createHmac('sha256', 'secret').update(signedRequest[1]).digest(); 
// sig === expected 

署名及び結果は次のようになります同じ。

またutf8エンコードされた文字列にdigest結果を回すことによってこれを確認可能性があります。また、あなたが名前を付けるために、仕事のようなものを行うには、既存のライブラリを使用して(そしておそらくそれ以上)を検討して

var sig = b64url.decode(signedRequest[0]); 
var expected = crypto.createHmac('sha256', 'secret').update(signedRequest[1]).digest(); 
var expected_buffer = new Buffer(expected_sig.digest(), 'binary'); 
// sig === expected_buffer.toString() 

数:

1

これは実際に暗号ライブラリのバグであり、githubに記録された既知の問題であることが判明しました。私たちはアップグレードして修正プログラムを入手する必要があります。

+0

あなたはこの問題へのリンクを知っていますか?... –

関連する問題