Login sem senha com código pelo WhatsApp: como implementar
Elimine senhas esquecidas e reduza o suporte: veja como funciona o login sem senha (passwordless) com código de uso único pelo WhatsApp e como implementar com segurança.
"Esqueci minha senha" é um dos pedidos mais comuns de suporte em qualquer produto digital. E senhas fracas ou repetidas continuam sendo uma das principais portas de entrada para invasões. Uma saída cada vez mais adotada é o login sem senha (passwordless).
Neste artigo você vai ver como funciona o login sem senha com código pelo WhatsApp, quando ele faz sentido e como implementar com segurança.
Como funciona o login sem senha por código
- A pessoa informa o número de telefone.
- O sistema envia um código de uso único pelo WhatsApp.
- A pessoa digita o código e entra.
Não há senha para lembrar, vazar ou reutilizar. A posse do telefone vira a prova de identidade.
Vantagens
- Menos atrito: login em segundos, sem "esqueci minha senha".
- Menos suporte: acabam os tickets de redefinição de senha.
- Sem senhas para vazar: não há banco de senhas para proteger.
- Telefone verificado de graça: todo usuário logado tem um número confirmado.
Quando usar (e quando não)
O login por código funciona muito bem para apps de consumo, marketplaces, delivery, clubes de assinatura e áreas do cliente.
Para operações de alto risco (movimentar dinheiro, por exemplo), combine com outro fator: biometria do aparelho, passkey ou confirmação adicional em ações sensíveis. Veja o guia de autenticação de dois fatores.
Implementação
Passo 1: pedir o código
app.post("/login/codigo", async (req, res) => {
const { telefone } = req.body;
const r = await fetch("https://api.aut2fa.com/v1/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AUT2FA_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({ to: telefone, locale: "pt-BR" }),
});
if (r.status === 429) {
return res.status(429).json({ tentarEm: Number(r.headers.get("retry-after")) });
}
const envio = await r.json();
req.session.login = { telefone, sendId: envio.id };
// Mesma resposta exista ou não a conta
res.json({ enviado: true });
});
Passo 2: validar e criar a sessão
app.post("/login/verificar", async (req, res) => {
const pendente = req.session.login;
if (!pendente) return res.status(400).json({ erro: "Peça um código primeiro" });
const r = await fetch(
`https://api.aut2fa.com/v1/send/${pendente.sendId}/verify`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AUT2FA_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ code: req.body.codigo }),
}
);
const resultado = await r.json();
if (!resultado.valid) {
return res.status(401).json({ tentativasRestantes: resultado.attempts_left });
}
const usuario = await buscarOuCriarUsuario(pendente.telefone);
req.session.regenerate(() => {
req.session.userId = usuario.id;
res.json({ ok: true });
});
});
Cuidados de segurança
- Não revele se a conta existe. Responda igual para números cadastrados ou não, para evitar enumeração de usuários.
- Regenere a sessão depois do login, para evitar session fixation.
- Limite tentativas e envios. A aut2fa bloqueia o envio depois de 5 códigos errados, expira o código em 10 minutos e permite limites por minuto e por destinatário por hora, respondendo HTTP 429 antes de enviar.
- Use idempotência. O header
Idempotency-Keyevita que um retry mande dois códigos. - Proteja o formulário público contra bots, para não virar alvo de SMS pumping.
- Sessões longas com revogação. Como o login fica fácil, use sessões duradouras em dispositivos confiáveis e permita encerrar sessões pelo painel do usuário.
E o custo?
Cada login gera um código. Com a aut2fa você paga o preço do canal somente quando o código é entregue, de um saldo pré-pago em reais, sem mensalidade. Veja os preços atualizados.
Conclusão
Login sem senha por WhatsApp reduz atrito, corta tickets de suporte e elimina o risco de senhas vazadas. Com uma API de OTP, a implementação cabe em duas rotas.
Crie sua conta grátis na aut2fa, use a chave ak_test_ (código sempre 000000 no modo de teste) e coloque o login sem senha no ar hoje.