Hier ist eine funktionsreichere Lösung, die ich gerade nach dem Studium dieser Frage gemacht habe:
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.',
};
}
};
Hier sind einige Anwendungsbeispiele:
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
}
Ich war nicht in der Lage, dies im StackOverflow-Code-Snippet-Tool ausführbar zu machen, aber hier ist ungefähr das, was Sie sehen würden, wenn Sie diesen Code ausführen würden:
Ich habe das gemacht parseJwt
Funktion immer ein Objekt zurückgibt (bis zu einem gewissen Grad aus Gründen der statischen Typisierung).
Auf diese Weise können Sie folgende Syntax verwenden:
const { decodedToken, error } = parseJwt(token);
Anschließend können Sie zur Laufzeit auf bestimmte Fehlertypen testen und Namenskollisionen vermeiden.
Wenn sich jemand Änderungen mit geringem Aufwand und hohem Wert für diesen Code vorstellen kann, können Sie meine Antwort zum Nutzen von bearbeiten next(person)
.