@getpassage/react-native
Version:
Passage React Native SDK for mobile authentication
81 lines (80 loc) • 2.45 kB
JavaScript
import { logger } from "./logger";
// Cache for JWT decoding to avoid repeated parsing of the same token
let cachedToken = null;
let cachedDecoded = null;
/**
* Decode a JWT token and extract its payload
*/
export function decodeJWT(token) {
if (!token)
return null;
// Return cached result if token hasn't changed
if (cachedToken === token && cachedDecoded) {
return cachedDecoded;
}
try {
const parts = token.split(".");
if (parts.length !== 3) {
logger.debug("[JWT_UTILS] Invalid JWT format - not 3 parts");
return null;
}
let payload = parts[1];
// Add padding if needed
while (payload.length % 4 !== 0) {
payload += "=";
}
const decodedBytes = atob(payload);
const decodedPayload = JSON.parse(decodedBytes);
// Cache the result
cachedToken = token;
cachedDecoded = decodedPayload;
logger.debug("[JWT_UTILS] JWT decoded successfully", {
hasSessionId: !!decodedPayload.sessionId,
recordFlag: decodedPayload.record,
debugFlag: decodedPayload.debug,
clearCookiesFlag: decodedPayload.clearCookies,
});
return decodedPayload;
}
catch (error) {
logger.debug("[JWT_UTILS] Failed to decode JWT", error);
cachedToken = null;
cachedDecoded = null;
return null;
}
}
/**
* Extract session ID from JWT token
*/
export function extractSessionId(token) {
const decoded = decodeJWT(token);
return (decoded === null || decoded === void 0 ? void 0 : decoded.sessionId) || null;
}
/**
* Extract record flag from JWT token
*/
export function extractRecordFlag(token) {
const decoded = decodeJWT(token);
return (decoded === null || decoded === void 0 ? void 0 : decoded.record) === true;
}
/**
* Extract debug flag from JWT token
*/
export function extractDebugFlag(token) {
const decoded = decodeJWT(token);
return (decoded === null || decoded === void 0 ? void 0 : decoded.debug) === true;
}
/**
* Extract clearCookies flag from JWT token
*/
export function extractClearCookiesFlag(token) {
const decoded = decodeJWT(token);
return (decoded === null || decoded === void 0 ? void 0 : decoded.clearCookies) === true;
}
/**
* Clear cached token data
*/
export function clearJWTCache() {
cachedToken = null;
cachedDecoded = null;
}