SMS e TOTP no mesmo serviço. TOTP usa códigos de 6 dígitos que mudam a cada 30 segundos e não consome créditos SMS. Configura o relógio do telemóvel automaticamente.
Prefixo: /authenticator/v1/applications/:app/subjects/:subject. Todas as chamadas usam X-API-Key no servidor. A chave API nunca vai para o navegador.
Adicionar TOTP quando já existe um fator exige proof de login fresca e o mesmo contexto. Para substituir um TOTP perdido: /recovery/check, depois /totp/enrollments com recovery: true, proof e o mesmo contexto. O antigo permanece ativo até confirmares o novo. Depois revoga sessões e gera novos códigos de recuperação.
Códigos de recuperação: inicia /totp/challenges com purpose: recovery_codes, valida e envia a proof para /recovery-codes. As provas são separadas por finalidade. Cancelar: /totp/challenges/:id/cancel com context_id.
Desafio: 5 minutos, até 5 tentativas; prova: 2 minutos e uso único. Cada código TOTP aceite só pode ser usado uma vez; aguarda o próximo código para uma nova operação. A tolerância de relógio é de um intervalo antes/depois.