Práticas recomendadas para formulários de OTP por SMS

Saiba como otimizar seu formulário de OTP por SMS e melhorar a experiência do usuário.

Pedir ao usuário para fornecer a senha única (OTP, na sigla em inglês) entregue por SMS é algo comum para confirmar o número de telefone de um usuário. Existem alguns casos de uso para OTP por SMS:

  • Autenticação de dois fatores. Além do nome de usuário e da senha, a OTP por SMS pode ser usado como um forte indicador de que a conta pertence à pessoa que recebeu o OTP por SMS.
  • Confirmação do número de telefone. Alguns serviços usam um número de telefone como identificador principal. Nesses serviços, os usuários podem inserir seu número de telefone e o OTP recebida por SMS para comprovar a identidade. Às vezes, ele é combinado com um PIN para constituir a autenticação de dois fatores.
  • Recuperação de conta. Quando um usuário perde o acesso à conta, é necessário para recuperá-los. Enviando um e-mail para o endereço de e-mail registrado ou uma OTP por SMS ao número de telefone são métodos comuns de recuperação de conta.
  • Confirmação de pagamento Em sistemas de pagamento, alguns bancos ou cartão de crédito os emissores solicitam autenticação adicional do pagador por motivos de segurança. A OTP por SMS costuma ser usada para essa finalidade.

Esta postagem explica as práticas recomendadas para criar um formulário de OTP por SMS para o uso acima. casos de uso diferentes.

Lista de verificação

Para oferecer a melhor experiência ao usuário com a OTP por SMS, siga estas etapas:

  • Use o elemento <input> com:
    • type="text"
    • inputmode="numeric"
    • autocomplete="one-time-code"
  • Use @BOUND_DOMAIN #OTP_CODE como a última linha da mensagem SMS de OTP.
  • Use a API WebOTP.

Usar o elemento <input>

Usar um formulário com um elemento <input> é a prática recomendada mais importante. pode seguir porque funciona em todos os navegadores. Mesmo que outras sugestões esta postagem não funcionar em algum navegador, o usuário ainda poderá inserir e enviar a OTP manualmente.

<form action="/verify-otp" method="POST">
  <input type="text"
         inputmode="numeric"
         autocomplete="one-time-code"
         pattern="\d{6}"
         required>
</form>

Confira a seguir algumas ideias para garantir que um campo de entrada aproveite ao máximo funcionalidade do navegador.

type="text"

Como as OTPs geralmente são números de cinco ou seis dígitos, O type="number" para um campo de entrada pode parecer intuitivo porque ele muda a configuração apenas números. Isso não é recomendado porque o navegador espera uma campo de entrada seja um número contável em vez de uma sequência de vários números, o que pode causar um comportamento inesperado. O uso de type="number" causa o aumento e a diminuição botões a serem exibidos ao lado do campo de entrada. ao pressionar esses botões aumenta ou diminui o número e pode remover zeros anteriores.

Use type="text" Isso não transforma o teclado do dispositivo móvel em números mas isso não é um problema, porque a próxima dica para usar inputmode="numeric" esse trabalho.

inputmode="numeric"

Usar inputmode="numeric" para alterar o teclado móvel para apenas números.

Alguns sites usam type="tel" nos campos de entrada da OTP, já que ela também transforma o teclado móvel em apenas números (incluindo * e #) quando focada. Esta invasão já foi usada quando inputmode="numeric" não era amplamente suportado. Desde que o Firefox começou a oferecer suporte a inputmode="numeric", não há necessidade de usar a invasão de type="tel" semanticamente incorreta.

autocomplete="one-time-code"

autocomplete permite que os desenvolvedores especifiquem qual permissão o navegador precisa fornecer assistência de preenchimento automático e informar o navegador sobre a o tipo das informações esperadas no campo.

Com autocomplete="one-time-code", sempre que um usuário recebe uma mensagem SMS enquanto um estiver aberto, o sistema operacional analisará a OTP de forma heurística e o teclado vai sugerir a OTP para o usuário inserir. Ele funciona apenas no Safari 12 e mais tarde no iOS, iPadOS e macOS, mas é altamente recomendável usá-lo, porque é uma uma maneira fácil de melhorar a experiência de OTP por SMS nessas plataformas.

`Autocomplete="one-time-code"` em ação.

O autocomplete="one-time-code" melhora a experiência do usuário, mas você tem muito mais pode fazer garantindo que a mensagem SMS esteja em conformidade com a mensagem formato.

Formatar o texto SMS

Melhore a experiência do usuário ao inserir uma OTP alinhada ao códigos de uso único vinculados à origem entregues por SMS especificação.

A regra de formatação é simples: conclua a mensagem SMS com o domínio do destinatário precedido por @ e a OTP precedida por #.

Exemplo:

Your OTP is 123456

@web-otp.glitch.me #123456

Usar um formato padrão para mensagens OTP facilita a extração de códigos mais fácil e confiável. Como associar códigos OTP a nos sites, é mais difícil enganar os usuários para que eles forneçam um código a sites maliciosos.

O uso desse formato oferece alguns benefícios:

  • A OTP será vinculada ao domínio. Se o usuário estiver em domínios que não sejam a que está especificada na mensagem SMS, a sugestão de OTP não será exibida. Isso também reduz o risco de ataques de phishing e possíveis invasões de conta.
  • O navegador agora poderá extrair a OTP de forma confiável sem depender heurística misteriosa e instável.

Quando um site usa o autocomplete="one-time-code", o Safari com o iOS 14 ou mais recente vai sugerir a OTP seguindo as regras acima.

Esse formato de mensagem SMS também é útil para outros navegadores além do Safari. Chrome, Opera e e Vivaldi no Android também oferecem suporte à regra de códigos únicos ligados à origem, com pela API WebOTP, mas não pelo autocomplete="one-time-code".

Usar a API WebOTP

A API WebOTP fornece acesso à OTP. recebidas em uma mensagem SMS. Ligando para navigator.credentials.get() com o tipo otp (OTPCredential), em que transport inclui sms, o site aguardará um SMS compatível com os códigos de uso único vinculados à origem ser fornecido e concedido acesso pelo usuário. Depois que a OTP for passada para o JavaScript, o site pode usá-lo em um formulário ou POST diretamente para o servidor.

.
navigator.credentials.get({
  otp: {transport:['sms']}
})
.then(otp => input.value = otp.code);
API WebOTP em ação.

Saiba como usar a API WebOTP em detalhes em Verificar números de telefone na Web. com a API WebOTP ou copie e cole o snippet a seguir. (Fazer se o elemento <form> tem os atributos action e method definidos corretamente.

// Feature detection
if ('OTPCredential' in window) {
  window.addEventListener('DOMContentLoaded', e => {
    const input = document.querySelector('input[autocomplete="one-time-code"]');
    if (!input) return;
    // Cancel the WebOTP API if the form is submitted manually.
    const ac = new AbortController();
    const form = input.closest('form');
    if (form) {
      form.addEventListener('submit', e => {
        // Cancel the WebOTP API.
        ac.abort();
      });
    }
    // Invoke the WebOTP API
    navigator.credentials.get({
      otp: { transport:['sms'] },
      signal: ac.signal
    }).then(otp => {
      input.value = otp.code;
      // Automatically submit the form when an OTP is obtained.
      if (form) form.submit();
    }).catch(err => {
      console.log(err);
    });
  });
}

Foto de Jason Leung em Abrir a página.