質問

このサンプルに基づいて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と最新のブラウザの両方で実行されることになっています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top