Tipos de MFA disponíveis
- TOTP (Time-based One-Time Password): app autenticador (Google Authenticator, Authy). Recomendado para admins. Não requer número de telefone.
- SMS OTP: código enviado por SMS. Requer número de telefone verificado. Disponível nos planos Pro e Scale.
- Email OTP: código enviado por email. Menor fricção, mas menos seguro que TOTP. Disponível em todos os planos.
Enforcement por role
Você pode exigir MFA apenas para usuários com determinadas roles — por exemplo, admin — sem obrigar usuários comuns. Isso é feito via a configuração security.mfa_required_roles do projeto.
Via Admin UI
- Acesse Auth → Security no projeto desejado.
- Em MFA Enforcement, ative a opção Exigir MFA por role.
- Adicione as roles que devem ter MFA obrigatório (ex:
admin,finance). - Clique em Salvar.
Via API
bash — configurar MFA obrigatório para role "admin"
curl -X PATCH https://superdb.com.br/platform/v1/projects/meu-projeto/security \
-H "Authorization: Bearer $PLATFORM_ADMIN_JWT" \
-H "Content-Type: application/json" \
-d '{
"mfa_required_roles": ["admin"],
"mfa_allowed_methods": ["totp", "email_otp"]
}'
Fluxo do usuário com MFA obrigatório
- Usuário faz login com email/senha ou OAuth normalmente.
- O sistema verifica se a role do usuário exige MFA.
- Se sim e o usuário ainda não tem MFA configurado, é redirecionado para o fluxo de enroll.
- Após enroll, o usuário insere o código TOTP ou OTP.
- Sessão é criada com
aal(Authentication Assurance Level) =aal2.
Troubleshooting
Usuário bloqueado sem dispositivo MFA
Se o usuário perdeu o dispositivo TOTP e não tem recovery codes, um platform_admin pode resetar o MFA manualmente:
bash — resetar MFA de um usuário
curl -X DELETE \
https://superdb.com.br/platform/v1/projects/meu-projeto/users/{user_id}/mfa \
-H "Authorization: Bearer $PLATFORM_ADMIN_JWT"
Após o reset, o usuário poderá fazer login normalmente e será solicitado a reconfigurer o MFA.
MFA não está sendo exigido mesmo configurado
Verifique se a role do usuário está exatamente como definido em mfa_required_roles. Roles são case-sensitive. Use o SQL Editor para verificar: SELECT role FROM proj_<slug>.user_roles WHERE user_id = '...';
Essa página ajudou?