Status: Aceito Data: 2026-03-17
O contrato abstrato JwtService acumulava três responsabilidades distintas:
sign, verify, decodegenerateRefreshToken, hashRefreshTokenrefreshToken (rotação completa de tokens com detecção de replay)Refresh tokens não são JWTs — são tokens opacos (strings aleatórias com hash). Agrupar sua geração junto com operações JWT viola o Princípio da Responsabilidade Única. Além disso, a lógica de rotação de tokens (validar, detectar replay, revogar, gerar novo par) é um caso de uso da aplicação, não uma responsabilidade de um serviço de criptografia.
Separar em três contratos com responsabilidades bem definidas:
JwtServiceResponsável exclusivamente por operações sobre JSON Web Tokens:
sign(payload) — assinar um JWTverify(token) — verificar e decodificar um JWT validando assinatura e expiraçãodecode(token) — decodificar um JWT sem verificar assinaturaJwtTokenGeneratorResponsável pela geração e hash de tokens opacos:
generateRefreshToken() — gerar string aleatória segurahashRefreshToken(token) — gerar hash do token para armazenamentoRefreshTokenUseCaseA lógica de rotação de tokens (validar token atual, detectar replay, revogar tokens comprometidos, gerar novo par access/refresh) foi movida para um use case, onde pertence na camada de aplicação.
UseCaseProps (ex: RegisterUseCase depende de JwtService e JwtTokenGenerator, não de um serviço monolítico)JwtTokenGenerator sem acoplar a JWT