node.jsのJWTの検証
-
28-10-2019 - |
質問
このサンプルに基づいてnode.jsでJWTトークンを解析して検証しようとしています(.NETで作成): https://github.com/liveservices/livesdk/blob/master/samples/asp.net/authenticationtokensample/jsonwebtoken.cs
トークンを検証するノードJS JavaScriptは次のとおりです。
var validateSignature = function(key, claims, envelope, signature) {
var hasher = crypto.createHash('sha256');
hasher.update(key + "JWTSig");
var key = hasher.digest('binary');
var hmac = crypto.createHmac('sha256', key);
hmac.update(envelope + '.' + claims);
var out = hmac.digest('base64');
console.log(out);
console.log(signature);
console.log(out === signature);
}
今、非常に奇妙なことは - それはほとんど機能します。 3つのConsole.logステートメントの出力は次のとおりです。
pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
+ - /_ =を除いて、ハッシュが両方とも同じであることは疑わしいようです
誰かが私の間違いを見つけますか?私のbase64エンコーディングと関係があります。
アップデート
私はもう少しプレイしましたが、ここでBase64エンコードでファンキーなことが起こっているようです。ノードJSの次のコード:
console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
利回り:
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
どちらが非常に奇妙に思えますよね?
解決
私を正しい方向にコメントして押してくれたTimothy Meadeに感謝します。
ノードのバッファタイプは、 +、 / and =で標準のbase64を生成します
ここに記載されているように、URL SAFE BASE64エンコードがあります: http://en.wikipedia.org/wiki/base64
+を - 、 / _と= =に置き換えます。 QueryString(D'UH)に渡されるトークンは、URL安全なバージョンです。したがって、違い。
コードは単純なものによって修正されました:
out = out.replace('+','-').replace('/','_').replace('=','');
他のヒント
私はこのライブラリを少し前に書きましたが、コードの一部を使用できると思います。 node.jsと最新のブラウザの両方で実行されることになっています。