feat: adiciona testes e melhorias de segurança

- Adiciona testes para auth service (createToken, createTokenPair, logout, refreshAccessToken)
- Adiciona testes para rate-limiting guard
- Adiciona testes para jwt strategy
- Remove arquivos SDK obsoletos
- Melhora validações e tratamento de erros em vários serviços
This commit is contained in:
joelson brito
2025-11-07 10:47:42 -03:00
parent a6cf4893cc
commit de4465ed60
23 changed files with 6209 additions and 4530 deletions

View File

@@ -11,11 +11,6 @@ export class TokenBlacklistService {
private readonly jwtService: JwtService,
) {}
/**
* Adiciona um token à blacklist
* @param token Token JWT a ser invalidado
* @param expiresIn Tempo de expiração do token em segundos
*/
async addToBlacklist(token: string, expiresIn?: number): Promise<void> {
try {
const decoded = this.jwtService.decode(token) as JwtPayload;
@@ -32,11 +27,6 @@ export class TokenBlacklistService {
}
}
/**
* Verifica se um token está na blacklist
* @param token Token JWT a ser verificado
* @returns true se o token estiver blacklistado
*/
async isBlacklisted(token: string): Promise<boolean> {
try {
const blacklistKey = this.buildBlacklistKey(token);
@@ -47,19 +37,11 @@ export class TokenBlacklistService {
}
}
/**
* Remove um token da blacklist (útil para testes)
* @param token Token JWT a ser removido
*/
async removeFromBlacklist(token: string): Promise<void> {
const blacklistKey = this.buildBlacklistKey(token);
await this.redis.del(blacklistKey);
}
/**
* Limpa todos os tokens blacklistados de um usuário
* @param userId ID do usuário
*/
async clearUserBlacklist(userId: number): Promise<void> {
const pattern = `auth:blacklist:${userId}:*`;
const keys = await this.redis.keys(pattern);
@@ -69,33 +51,18 @@ export class TokenBlacklistService {
}
}
/**
* Constrói a chave para armazenar o token na blacklist
* @param token Token JWT
* @returns Chave para o Redis
*/
private buildBlacklistKey(token: string): string {
const decoded = this.jwtService.decode(token) as JwtPayload;
const tokenHash = this.hashToken(token);
return `auth:blacklist:${decoded.id}:${tokenHash}`;
}
/**
* Calcula o TTL do token baseado na expiração
* @param payload Payload do JWT
* @returns TTL em segundos
*/
private calculateTokenTTL(payload: JwtPayload): number {
const now = Math.floor(Date.now() / 1000);
const exp = payload.exp || (now + 8 * 60 * 60); // 8h padrão
const exp = payload.exp || (now + 8 * 60 * 60);
return Math.max(0, exp - now);
}
/**
* Gera um hash do token para usar como identificador único
* @param token Token JWT
* @returns Hash do token
*/
private hashToken(token: string): string {
const crypto = require('crypto');
return crypto.createHash('sha256').update(token).digest('hex').substring(0, 16);