91 lines
2.4 KiB
JavaScript
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
|
|
};
|
|
};
|