mirror of
https://github.com/luxfi/explore.git
synced 2026-09-24 00:28:18 +00:00
48 lines
1.1 KiB
TypeScript
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;
|
|
}
|
|
}
|