2016-05-11 14 views
1

ここJWTガイド - - https://scotch.io/tutorials/the-anatomy-of-a-json-web-token#headerは、彼らがこれにbase64urlを実行すると言う不適切base64url

var b64u = require("base64url") 
var rez = b64u(JSON.stringify({ 
     "typ": "JWT", 
     "alg": "HS256" 
})); 
var shouldbe = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'; 
console.log(rez); 
console.log(shouldbe); 
console.log(rez == shouldbe); 
:私はこのコードを試してみてください

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 

オンラインテストではこちらをご覧ください: https://tonicdev.com/56c5484d7a4ea10d0002c623/5733af59234d9d1200d8c818

ただし、一致しません。

誰か簡単な問題はありますか?

+1

私はその例が間違っていると思います。 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9'も取得します。サイドノートでは、base64エンコードのための 'base64url'モジュールは必要ありません。 'new Buffer(str).toString( 'base64');を実行してください。ここで' str'は文字列化されたJSONです。 – dvlsg

+1

興味深いことに、ありがとう@dvlsg – Noitidart

+1

あなたが知っているのは、 'JSON.stringify'が' alg'と 'typ'キーの順序を入れ替えているのだろうかと思います。私はscotch.ioチュートリアルにアルファベット順ではないことに気付きました。 – dvlsg

答えて

1

Base64出力は、JSON.stringifyコールからの文字列内で受信するキーの順序に依存します。

参考までに、あらかじめ作成されたJSON文字列を使用した作業例を示します。

let expected = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'; 

let str1 = '{"alg":"HS256","typ":"JWT"}'; 
let str2 = '{"typ":"JWT","alg":"HS256"}'; 

// note that you don't need a library to Base64 encode strings in node 
let base64str1 = new Buffer(str1).toString('base64'); 
let base64str2 = new Buffer(str2).toString('base64'); 

console.log(base64str1); // 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' 
console.log(base64str2); // 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9' 
console.log('base64str1 equals expected?', base64str1 === expected); // true 
console.log('base64str2 equals expected?', base64str2 === expected); // false 
+0

ああ、うわー!彼らはこれを明確にしなければなりません! – Noitidart

+0

私は、多くの時間ライブラリ/ガイドが、オブジェクトキーがどのような方法でもソートされることが保証されていないという事実を間違いなく受け入れていると思います。より詳細な別の良い[stackoverflow質問](http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order)です。 – dvlsg