4
1

More than 3 years have passed since last update.

JWTクレーム・セット部分のデコード方法

Posted at

概要

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関数)を用いて、以下の記事の方法で出来る。

参考サイト

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1