/** * Utilitários para manipulação de tokens JWT. */ /** * Decodifica um token JWT sem validar a assinatura. * ATENÇÃO: Esta função apenas decodifica o payload, não valida a autenticidade do token. * * @param {string} token - Token JWT a ser decodificado * @returns {Object|null} Payload decodificado ou null se inválido * * @example * const payload = decodeJWT(token); * console.log(payload.email); // "usuario@exemplo.com" */ export const decodeJWT = (token) => { try { if (!token || typeof token !== 'string') { return null; } // JWT tem 3 partes separadas por ponto: header.payload.signature const parts = token.split('.'); if (parts.length !== 3) { console.warn('Token JWT inválido: formato incorreto'); return null; } // O payload é a segunda parte (índice 1) const payload = parts[1]; // Decodifica de Base64URL para string JSON const base64 = payload.replace(/-/g, '+').replace(/_/g, '/'); const jsonPayload = decodeURIComponent( atob(base64) .split('') .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)) .join('') ); return JSON.parse(jsonPayload); } catch (error) { console.error('Erro ao decodificar JWT:', error); return null; } }; /** * Verifica se um token JWT está expirado. * * @param {string} token - Token JWT a ser verificado * @returns {boolean} True se o token está expirado */ export const isTokenExpired = (token) => { const payload = decodeJWT(token); if (!payload || !payload.exp) { return true; // Se não conseguir decodificar ou não tiver exp, considera expirado } // exp está em segundos, Date.now() está em milissegundos const expirationTime = payload.exp * 1000; const currentTime = Date.now(); return currentTime >= expirationTime; }; /** * Extrai informações do usuário de um token JWT. * * @param {string} token - Token JWT * @returns {Object|null} Objeto com informações do usuário ou null */ export const extractUserFromToken = (token) => { const payload = decodeJWT(token); if (!payload) { return null; } // Extrai campos comuns de JWT return { email: payload.email || null, database: payload.database || null, exp: payload.exp || null, iat: payload.iat || null, // Adicione outros campos conforme necessário }; };