概要
JavaScriptで、正確にはNode.jsで、IDトークンのペイロード部分をサクッとデコードしたかった・・・・んだけど、しょうもないところででハマッたので、メモ。
以下を目的とする。
- Node.jsの標準ライブラリの範囲で、JWTのペイロード部分を日本語を含めてデコードする
なお、「標準のライブラリで」のこだわりが無ければ、jsonwebtokenとかjwt-decodeとかのライブラリを使うのが吉。
検証環境
Node.js - v10.16.0
JWTペイロード部分(クレームセット)をデコードするスクリプト
var atob = (base64) => {
var buffer = Buffer.from( base64, 'base64' );
var utf8 = buffer.toString('utf8'); // Not "ascii"
return utf8;
};
var decodeJwt = (token) => {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var encodeURI = encodeURIComponent(atob(base64));
var decodeString = decodeURIComponent(encodeURI);
return JSON.parse(decodeString);
};
引数に与えてコマンドラインから変換するなら次のようにする。引数「JST_STRINGS」に入れるべきは、例えばOpenID ConnectでのトークンEndPointから取得したJSONのid_tokenキーに格納された文字列など。
decode_jst.js
var atob = (base64) => {
var buffer = Buffer.from( base64, 'base64' );
var utf8 = buffer.toString('utf8'); // Not "ascii"
return utf8;
};
var decodeJwt = (token) => {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var encodeURI = encodeURIComponent(atob(base64));
var decodeString = decodeURIComponent(encodeURI);
return JSON.parse(decodeString);
};
var main = (argv) => {
if( argv.length < 3 ){
console.log("\n [USAGE] node decode_jst.js JST_STRINGS\n");
return;
}
var jsonObj = decodeJwt(argv[2]);
console.log(jsonObj);
return;
};
main(process.argv);
※encodeURIComponent()は要らんかも?あとで仕様をちゃんと確認しよう【ToDo】
補足
ブラウザのJavaScript環境でデコードする場合は、windowsオブジェクト(配下のatob関数)を用いて、以下の記事の方法で出来る。
参考サイト
-
IDトークンが分かれば OpenID Connect が分かる>IDトークン
-
JSON Web Token (JWT) - OpenID Foundation Japan>3.1. JWTの例