นี่เป็นโซลูชันที่มีคุณสมบัติหลากหลายมากขึ้นที่ฉันทำหลังจากศึกษาคำถามนี้:
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
}
ฉันไม่สามารถทำให้ runnable นั้นในเครื่องมือข้อมูลโค้ด StackOverflow แต่นี่คือสิ่งที่คุณจะเห็นถ้าคุณใช้รหัสนั้น:
ฉันทำให้parseJwt
ฟังก์ชันส่งคืนวัตถุเสมอ (ในระดับหนึ่งสำหรับเหตุผลการพิมพ์แบบคงที่)
สิ่งนี้ทำให้คุณสามารถใช้ประโยชน์จากไวยากรณ์เช่น:
const { decodedToken, error } = parseJwt(token);
จากนั้นคุณสามารถทดสอบ ณ เวลาทำงานเพื่อหาข้อผิดพลาดบางประเภทและหลีกเลี่ยงการชนกันของชื่อ
หากทุกคนสามารถคิดของความพยายามต่ำใด ๆ next(person)
ที่มีมูลค่าสูงเปลี่ยนแปลงรหัสนี้รู้สึกอิสระที่จะแก้ไขคำตอบของฉันเพื่อประโยชน์ของ