Files

48 lines
1.1 KiB
TypeScript

interface JWTHeader {
alg: string;
typ?: string;
[key: string]: unknown;
}
interface JWTPayload {
[key: string]: unknown;
}
const base64UrlDecode = (str: string): string => {
// Replace characters according to Base64Url standard
str = str.replace(/-/g, '+').replace(/_/g, '/');
// Add padding '=' characters for correct decoding
const pad = str.length % 4;
if (pad) {
str += '='.repeat(4 - pad);
}
// Decode from Base64 to string
const decodedStr = atob(str);
return decodedStr;
};
export default function decodeJWT(token: string): { header: JWTHeader; payload: JWTPayload; signature: string } | null {
try {
const parts = token.split('.');
if (parts.length !== 3) {
throw new Error('Invalid JWT format');
}
const [ encodedHeader, encodedPayload, signature ] = parts;
const headerJson = base64UrlDecode(encodedHeader);
const payloadJson = base64UrlDecode(encodedPayload);
const header = JSON.parse(headerJson) as JWTHeader;
const payload = JSON.parse(payloadJson) as JWTPayload;
return { header, payload, signature };
} catch (error) {
return null;
}
}