Đây là một giải pháp giàu tính năng hơn mà tôi vừa thực hiện sau khi nghiên cứu câu hỏi này:
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.',
};
}
};
Dưới đây là một số mẫu sử dụng:
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
}
Tôi không thể làm cho nó có thể chạy được trong công cụ đoạn mã StackOverflow, nhưng đây là khoảng những gì bạn sẽ thấy nếu bạn chạy mã đó:
Tôi đã làm cho parseJwt
hàm luôn trả về một đối tượng (ở một mức độ nào đó vì lý do gõ tĩnh).
Điều này cho phép bạn sử dụng cú pháp như:
const { decodedToken, error } = parseJwt(token);
Sau đó, bạn có thể kiểm tra tại thời điểm chạy cho các loại lỗi cụ thể và tránh mọi xung đột đặt tên.
Nếu bất cứ ai có thể nghĩ về bất kỳ nỗ lực thấp, giá trị cao nào thay đổi mã này, vui lòng chỉnh sửa câu trả lời của tôi vì lợi ích của next(person)
.