JavaScriptを使用してJWTのペイロードをどのようにデコードできますか?ライブラリなし。したがって、トークンは、私のフロントエンドアプリが使用できるペイロードオブジェクトを返すだけです。
トークンの例: xxxxxxxxx.XXXXXXXX.xxxxxxxx
そして結果はペイロードです:
{exp: 10012016 name: john doe, scope:['admin']}
JavaScriptを使用してJWTのペイロードをどのようにデコードできますか?ライブラリなし。したがって、トークンは、私のフロントエンドアプリが使用できるペイロードオブジェクトを返すだけです。
トークンの例: xxxxxxxxx.XXXXXXXX.xxxxxxxx
そして結果はペイロードです:
{exp: 10012016 name: john doe, scope:['admin']}
回答:
機能するユニコードテキストJWTパーサー関数:
function parseJwt (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
};
JSON.parse(window.atob(base64))
て機能させる必要がありました。ただ、return JSON.parse(atob(base64));
その後、postman.setEnvironmentVariable("userId", parseJwt(jsonData.access_token));
「access_tokenはは」(あなたのケースでは異なる場合があります)私の場合には、応答でのトークン値のキーです。
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
jwt-decode
モジュールは小さいので使用する方が良いですが、処理が少し良くなります。
try-catchを使用した単純な関数
const parseJwt = (token) => {
try {
return JSON.parse(atob(token.split('.')[1]));
} catch (e) {
return null;
}
};
ありがとう!
atob
には、Unicodeの
jwt-decodeを使用できるため、次のように記述できます。
import jwt_decode from 'jwt-decode';
var token = 'eyJ0eXAiO.../// jwt token';
var decoded = jwt_decode(token);
console.log(decoded);
/*{exp: 10012016 name: john doe, scope:['admin']}*/
純粋なJavaScript atob()
関数を使用して、トークンを文字列にデコードできます。
atob(token.split('.')[1]);
またはjsonオブジェクトに直接解析します。
JSON.parse(atob(token.split('.')[1]));
読んatob()
とbtoa()
ビルトインのJavaScript機能をBase64エンコードとデコード-ウェブのAPI | MDN。
@Pehejeは機能しますが、Unicodeで問題が発生します。これを修正するには、https://stackoverflow.com/a/30106551/5277071のコードを使用します。
let b64DecodeUnicode = str =>
decodeURIComponent(
Array.prototype.map.call(atob(str), c =>
'%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
).join(''))
let parseJwt = token =>
JSON.parse(
b64DecodeUnicode(
token.split('.')[1].replace('-', '+').replace('_', '/')
)
)
let form = document.getElementById("form")
form.addEventListener("submit", (e) => {
form.out.value = JSON.stringify(
parseJwt(form.jwt.value)
)
e.preventDefault();
})
textarea{width:300px; height:60px; display:block}
<form id="form" action="parse">
<textarea name="jwt">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkrDtGhuIETDs8OoIiwiYWRtaW4iOnRydWV9.469tBeJmYLERjlKi9u6gylb-2NsjHLC_6kZNdtoOGsA</textarea>
<textarea name="out"></textarea>
<input type="submit" value="parse" />
</form>
「ウィンドウ」オブジェクトはnodejs環境に存在しないため、次のコード行を使用できます。
let base64Url = token.split('.')[1]; // token you get
let base64 = base64Url.replace('-', '+').replace('_', '/');
let decodedData = JSON.parse(Buffer.from(base64, 'base64').toString('binary'));
それは完全に私のために働いています。それが役に立てば幸い。
function parseJwt(token) {
var base64Payload = token.split('.')[1];
var payload = Buffer.from(base64Payload, 'base64');
return JSON.parse(payload.tostring());
}
let payload= parseJwt("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c");
console.log("payload:- ", payload);
ノードを使用する場合は、バッファーパッケージを使用する必要がある場合があります。
npm install buffer
var Buffer = require('buffer/').Buffer
この関数を使用して、この回答に基づいてペイロード、ヘッダー、exp(有効期限)、iat(発行時刻)を取得します
function parseJwt(token) {
try {
// Get Token Header
const base64HeaderUrl = token.split('.')[0];
const base64Header = base64HeaderUrl.replace('-', '+').replace('_', '/');
const headerData = JSON.parse(window.atob(base64Header));
// Get Token payload and date's
const base64Url = token.split('.')[1];
const base64 = base64Url.replace('-', '+').replace('_', '/');
const dataJWT = JSON.parse(window.atob(base64));
dataJWT.header = headerData;
// TODO: add expiration at check ...
return dataJWT;
} catch (err) {
return false;
}
}
const jwtDecoded = parseJwt('YOUR_TOKEN') ;
if(jwtDecoded)
{
console.log(jwtDecoded)
}
jwt.ioのすべての機能がすべての言語をサポートしているわけではありません。NodeJで使用できる
var decoded = jwt.decode(token);
このコードはjwt.ioで見つかりました。
//this is used to parse base64
function url_base64_decode(str) {
var output = str.replace(/-/g, '+').replace(/_/g, '/');
switch (output.length % 4) {
case 0:
break;
case 2:
output += '==';
break;
case 3:
output += '=';
break;
default:
throw 'Illegal base64url string!';
}
var result = window.atob(output); //polifyll https://github.com/davidchambers/Base64.js
try{
return decodeURIComponent(escape(result));
} catch (err) {
return result;
}
}
場合によっては(特定の開発プラットフォーム)、
最善の答え(現時点では)が無効なbase64の長さの問題に直面しています。
それで、もっと安定した方法が必要でした。
お役に立てれば幸いです。
GuyとPehejeの両方がすでに質問に回答しました。私のような完全な初心者にとっては、例で定義されているインポート行も持つと役に立ちました。
また、トークンがポストバックされる資格情報の完全なセットであることを理解するのに数分かかりました(そのidToken部分だけでなく、JWTトークン全体)。あなたがそれを知ったら、簡単です。
import jwt_decode from 'jwt-decode';
var token = 'eyJ0eXAiO.../// jwt token';
var decoded = jwt_decode(token);
/*{exp: 10012016 name: john doe, scope:['admin']}*/
JSON Web Token(JWT)をデコードするためのシンプルなNodeJSソリューション
function decodeTokenComponent(value) {
const buff = new Buffer(value, 'base64')
const text = buff.toString('ascii')
return JSON.parse(text)
}
const token = 'xxxxxxxxx.XXXXXXXX.xxxxxxxx'
const [headerEncoded, payloadEncoded, signature] = token.split('.')
const [header, payload] = [headerEncoded, payloadEncoded].map(decodeTokenComponent)
console.log(`header: ${header}`)
console.log(`payload: ${payload}`)
console.log(`signature: ${signature}`)
GitHub-auth0 / jwt-decodeからの回答。トークン全体を渡すことができるように、文字列分割と戻りオブジェクト{ヘッダー、ペイロード、署名}を含むように入出力を変更しました。
var jwtDecode = function (jwt) {
function b64DecodeUnicode(str) {
return decodeURIComponent(atob(str).replace(/(.)/g, function (m, p) {
var code = p.charCodeAt(0).toString(16).toUpperCase();
if (code.length < 2) {
code = '0' + code;
}
return '%' + code;
}));
}
function decode(str) {
var output = str.replace(/-/g, "+").replace(/_/g, "/");
switch (output.length % 4) {
case 0:
break;
case 2:
output += "==";
break;
case 3:
output += "=";
break;
default:
throw "Illegal base64url string!";
}
try {
return b64DecodeUnicode(output);
} catch (err) {
return atob(output);
}
}
var jwtArray = jwt.split('.');
return {
header: decode(jwtArray[0]),
payload: decode(jwtArray[1]),
signature: decode(jwtArray[2])
};
};
これは、私がこの質問を研究した直後に作成したより機能豊富なソリューションです。
const parseJwt = (token) => {
try {
if (!token) {
throw new Error('parseJwt# Token is required.');
}
const base64Payload = token.split('.')[1];
let payload = new Uint8Array();
try {
payload = Buffer.from(base64Payload, 'base64');
} catch (err) {
throw new Error(`parseJwt# Malformed token: ${err}`);
}
return {
decodedToken: JSON.parse(payload),
};
} catch (err) {
console.log(`Bonus logging: ${err}`);
return {
error: 'Unable to decode token.',
};
}
};
以下に使用例をいくつか示します。
const unhappy_path1 = parseJwt('sk4u7vgbis4ewku7gvtybrose4ui7gvtmalformedtoken');
console.log('unhappy_path1', unhappy_path1);
const unhappy_path2 = parseJwt('sk4u7vgbis4ewku7gvtybrose4ui7gvt.malformedtoken');
console.log('unhappy_path2', unhappy_path2);
const unhappy_path3 = parseJwt();
console.log('unhappy_path3', unhappy_path3);
const { error, decodedToken } = parseJwt('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c');
if (!decodedToken.exp) {
console.log('almost_happy_path: token has illegal claims (missing expires_at timestamp)', decodedToken);
// note: exp, iat, iss, jti, nbf, prv, sub
}
StackOverflowコードスニペットツールで実行可能にすることはできませんでしたが、そのコードを実行した場合のおおよその表示は次のとおりです。
私はparseJwt
関数が常にオブジェクトを返すようにしました(静的型付けの理由からある程度)。
これにより、次のような構文を利用できます。
const { decodedToken, error } = parseJwt(token);
次に、実行時に特定のタイプのエラーをテストし、名前の衝突を回避できます。
誰かがこのコードへの少しの努力、高い価値の変更について考えることができるなら、の利益のために私の答えを自由に編集してnext(person)
ください。
こことここの答えに基づいて:
const dashRE = /-/g;
const lodashRE = /_/g;
module.exports = function jwtDecode(tokenStr) {
const base64Url = tokenStr.split('.')[1];
if (base64Url === undefined) return null;
const base64 = base64Url.replace(dashRE, '+').replace(lodashRE, '/');
const jsonStr = Buffer.from(base64, 'base64').toString();
return JSON.parse(jsonStr);
};
Javascript node.js expressを実行するには、まず次のようにパッケージをインストールする必要がありました。
npm install jwt-decode --save
次に、私のapp.jsコードでパッケージを取得します。
const jwt_decode = require('jwt-decode');
次に、コードを実行します。
let jwt_decoded = jwt_decode(jwt_source);
次に魔法:
console.log('sub:',jwt_decoded.sub);