Berikut adalah solusi yang lebih kaya fitur yang baru saya buat setelah mempelajari pertanyaan ini:
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.',
};
}
};
Berikut beberapa contoh penggunaan:
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
}
Saya tidak dapat membuat runnable itu di alat snippet kode StackOverflow, tapi di sini kira-kira apa yang akan Anda lihat jika Anda menjalankan kode itu:
Saya membuat parseJwt
fungsi selalu mengembalikan objek (pada tingkat tertentu karena alasan mengetik statis).
Ini memungkinkan Anda untuk menggunakan sintaksis seperti:
const { decodedToken, error } = parseJwt(token);
Kemudian Anda dapat menguji pada waktu berjalan untuk jenis kesalahan tertentu dan menghindari tabrakan penamaan.
Jika ada yang bisa memikirkan upaya rendah, perubahan bernilai tinggi pada kode ini, jangan ragu untuk mengedit jawaban saya untuk kepentingan next(person)
.