Preencher formulários OTP em iframes de origem cruzada com a API WebOTP

A API WebOTP agora pode receber OTPs de iframes.

As OTPs (senhas de uso único) por SMS são usadas com frequência para verificar números de telefone, por exemplo, como uma segunda etapa na autenticação ou para verificar pagamentos na Web. No entanto, alternar entre o navegador e o app de SMS para copiar e colar ou inserir manualmente a OTP facilita erros e adiciona atrito à experiência do usuário.

A API WebOTP permite que os sites recebam de forma programática a senha única de uma mensagem SMS e a insiram automaticamente no formulário para os usuários com apenas um toque, sem trocar de app. O SMS é formatado de maneira especial e vinculado à origem, o que reduz as chances de sites de phishing roubarem a senha única.

Um caso de uso que ainda não era compatível com a WebOTP era segmentar uma origem dentro de um iframe. Isso geralmente é usado para confirmação de pagamento, especialmente com o 3D Secure. Com o formato comum para oferecer suporte a iframes entre origens, a API WebOTP agora oferece OTPs vinculadas a origens aninhadas a partir do Chrome 91.

Como a API WebOTP funciona

A API WebOTP é simples:

…
  const otp = await navigator.credentials.get({
    otp: { transport:['sms'] }
  });
…

A mensagem SMS precisa ser formatada com os códigos de uso único vinculados à origem.

Your OTP is: 123456.

@web-otp.example.com #12345

Observe que, na última linha, ela contém a origem a ser vinculada precedida por um @ seguido pela OTP precedida por um #.

Quando a mensagem de texto chega, uma barra de informações aparece e solicita que o usuário verifique o número de telefone. Depois que o usuário clica no botão Verify, o navegador encaminha automaticamente a OTP para o site e resolve o navigator.credentials.get(). O site pode extrair a OTP e concluir o processo de verificação.

Aprenda os conceitos básicos do uso da WebOTP em Verificar números de telefone na Web com a API WebOTP.

Casos de uso de iframes entre origens

Inserir uma OTP em um formulário dentro de um iframe entre origens é comum em cenários de pagamento. Alguns emissores de cartão de crédito exigem uma etapa de verificação adicional para verificar a autenticidade do pagador. Isso é chamado de 3D Secure, e o formulário geralmente é exposto em um iframe na mesma página, como se fizesse parte do fluxo de pagamento.

Exemplo:

  • Um usuário acessa shop.example para comprar um par de sapatos com um cartão de crédito.
  • Depois de inserir o número do cartão de crédito, o provedor de pagamento integrado mostra um formulário de bank.example em um iframe pedindo que o usuário verifique o número de telefone para uma finalização de compra rápida.
  • O bank.example envia um SMS com uma OTP para o usuário, que pode inseri-la para verificar a identidade.

Como usar a API WebOTP de um iframe entre origens

Para usar a API WebOTP em um iframe entre origens, você precisa fazer duas coisas:

  • Anote a origem do frame superior e do iframe na mensagem de texto SMS.
  • Configure a política de permissões para permitir que o iframe entre origens receba a OTP diretamente do usuário.
API WebOTP em um iframe em ação.

Teste a demonstração em https://web-otp-iframe-demo.stackblitz.io.

Anotar origens vinculadas à mensagem de texto SMS

Quando a API WebOTP é chamada de dentro de um iframe, a mensagem de texto SMS precisa incluir a origem do frame superior precedida por @, seguida pela OTP precedida por # e pela origem do iframe precedida por @.

@shop.example #123456 @bank.exmple

Configurar a política de permissões

Para usar a WebOTP em um iframe entre origens, o incorporador precisa conceder acesso a essa API pela política de permissões de otp-credentials para evitar comportamentos indesejados. Em geral, há duas maneiras de atingir essa meta:

  • pelo cabeçalho HTTP:
Permissions-Policy: otp-credentials=(self "https://bank.example")
  • pelo atributo allow do iframe:
<iframe src="https://bank.example/…" allow="otp-credentials"></iframe>

Confira mais exemplos de como especificar uma política de permissões.

Advertências

Níveis de aninhamento

No momento, o Chrome só aceita chamadas da API WebOTP de iframes de origem cruzada que tenham no máximo uma origem exclusiva na cadeia de ancestrais. Nos seguintes cenários:

  • a.com -> b.com
  • a.com -> b.com -> b.com
  • a.com -> a.com -> b.com
  • a.com -> b.com -> c.com

o uso da WebOTP em b.com é permitido, mas em c.com não.

O cenário a seguir também não é compatível devido à falta de demanda e às complexidades da UX.

  • a.com -> b.com -> a.com (chama a API WebOTP)

Interoperabilidade

Embora os mecanismos de navegador que não sejam o Chromium não implementem a API WebOTP, o Safari compartilha o mesmo formato de SMS com o suporte a input[autocomplete="one-time-code"]. No Safari, assim que um SMS com um formato de código de uso único vinculado à origem chega com a origem correspondente, o teclado sugere inserir a OTP no campo de entrada.

Desde abril de 2021, o Safari é compatível com iframe com um formato de SMS exclusivo usando %. No entanto, como a discussão sobre a especificação concluiu que o @ é a melhor opção, esperamos que a implementação do formato de SMS compatível seja convergente.

Feedback

Seu feedback é muito importante para melhorar a API WebOTP. Teste-a e conte para nós o que achou.

Recursos