MFA — segundo fator (TOTP)
Tela onde a pessoa confirma o código de 6 dígitos do aplicativo autenticador (Google Authenticator, Authy, etc.) para concluir o login, quando a conta tem o segundo fator (TOTP) habilitado.

Antes de começar
- Rota:
/:tenant/authorization/mfa. - Componente:
MfaLoginComponent(@pages/authentication/mfa-login). - Só se chega aqui vindo do Login: a pessoa já digitou e-mail e senha corretos, e a conta tem TOTP habilitado. Não é possível abrir esta tela diretamente sem ter passado pelo login (o desafio TOTP é emitido pela própria chamada de login).
- É preciso ter o app autenticador já configurado com o segredo TOTP da conta (isso é feito em Minha conta › Segurança, fora do escopo desta tela).
:::info SafeID usa outra experiência Quando a conta tem SafeID em vez de TOTP, o login não passa por esta tela: ele redireciona direto para a página de autorização do provedor externo SafeID. :::
Permissões e acesso
Pública — mas só é útil com um desafio de MFA válido em andamento (emitido minutos antes pelo
login). A rota está no grupo :tenant/authorization, protegida por guestGuard como as demais
telas de login.
Caminho principal
- A pessoa abre o app autenticador, lê o código de 6 dígitos do momento e digita nas seis caixas
(
p-inputotp, um dígito por caixa, aceita só números). - Clica em Validar.
- Se o código confere, o Portal cria a sessão com nível de confiança
MFAe leva a pessoa para a área logada (mesma lógica de retorno do login: volta para a URL que ela tentou acessar antes). - Se preferir, pode clicar em Voltar para o Login para recomeçar do zero.
Este fluxo foi confirmado de ponta a ponta neste levantamento: login com uma conta com TOTP
habilitado, cálculo do código de 6 dígitos a partir do segredo TOTP da conta e confirmação bem-
sucedida, chegando à área logada (/exams).
Estados e mensagens
| Estado | Quando aparece | Mensagem exibida | |
|---|---|---|---|
| Código incorreto ou expirado | O código digitado não confere, ou o desafio já expirou | Toast: "Código de verificação incorreto ou expirado." | ![]() |
Validações de frontend
| Campo | Regra | Efeito |
|---|---|---|
| Código | Obrigatório, exatamente 6 dígitos numéricos (Validators.pattern('[0-9]{6}')) | Se inválido ao clicar em Validar, mostra toast "Código de verificação inválido." sem chamar a API |
Validações e falhas de backend
| Situação | Onde é validada | Comportamento | Como se recupera |
|---|---|---|---|
| Código errado ou desafio expirado | POST /authentication/totp/verify | A tentativa é contada; ao atingir o limite, o desafio é consumido (mesma mensagem de erro, sem aviso adicional) | Solicitar um novo login para gerar outro desafio |
| Muitas tentativas em pouco tempo | Rate limit (10 requisições/60s por token) | 429 RATE_LIMIT_EXCEEDED | Aguardar e tentar novamente |
| Erro de rede | Requisição HTTP falha | Toast "LOGIN.ERRORS.NETWORK" | Verificar conexão e tentar novamente |
Regras de negócio
| ID | Regra | O que a tela reflete |
|---|---|---|
| RN-01 | O desafio TOTP tem validade curta (IDENTITY_TOTP_CHALLENGE_TTL_MINUTES, default 10 min) | Passado esse tempo, o código correto também é recusado como "incorreto ou expirado" |
| RN-02 | Código errado repetidas vezes esgota o desafio | Depois do limite de tentativas, é preciso voltar ao login para gerar um novo desafio — a mensagem de erro não muda |
Informações técnicas
Rota da tela: /:tenant/authorization/mfa · Acesso: Público, condicionado a um desafio de
MFA emitido pelo login
Rotas de API consumidas:
| Método | Rota | Quando é chamada |
|---|---|---|
| POST | /v1/authentication/totp/verify | Ao clicar em Validar |
→ Detalhe da rota: Segundo fator: TOTP e SafeID — API
Relacionado
- ⚙️ API: Segundo fator: TOTP e SafeID — API
- 🔑 Passo anterior: Login
- 📂 Módulo (back): Authentication — visão geral
