aut2fa/ blog

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.

Tela de login sem senha pedindo apenas o número de WhatsApp do usuário

"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

  1. A pessoa informa o número de telefone.
  2. O sistema envia um código de uso único pelo WhatsApp.
  3. 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-Key evita 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.

Continue lendo