testes/src_2/utils/jwtUtils.js

91 lines
2.4 KiB
JavaScript

/**
* 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
};
};