Uma análise aprofundada da mediação imediata do WebAuthn. Descubra como ela cria um único botão de login, evita códigos QR confusos e constrói um fluxo de login mais inteligente.

Vincent
Created: August 8, 2025
Updated: November 11, 2025

See the original blog version in English here.
60-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
A transição para passkeys está a criar um "paradoxo das passkeys": alguns utilizadores têm passkeys, enquanto muitos ainda usam as tradicionais passwords. Isto leva a ecrãs de login sobrecarregados com múltiplos botões: "Entrar com Password", "Entrar com Google" e "Entrar com Passkey". Esta fragmentação causa fricção. Um utilizador pode clicar em "Entrar com Passkey" num novo dispositivo apenas para se deparar com um confuso pedido de código QR, porque a sua passkey não está disponível localmente. O problema central é a incapacidade do site de conhecer o contexto do utilizador antes de iniciar um fluxo de autenticação.
Uma solução é adotar uma abordagem que prioriza o identificador e determina o melhor método de login para o utilizador. Outra solução potencial é um único botão de "Entrar" inteligente que orquestra o fluxo mais simples para cada utilizador. Deveria solicitar diretamente uma passkey se houver uma disponível no dispositivo, ou recorrer de forma elegante a outros métodos, caso contrário.
Foi anunciada uma nova funcionalidade do WebAuthn que pode tornar isto possível: Mediação
Imediata (mediation: 'immediate'). Ao definir esta propriedade numa chamada à API
WebAuthn, os programadores podem construir uma experiência de login inteligente e
unificada que resolve o paradoxo das passkeys. Este artigo fornece uma análise focada para
programadores sobre mediation: 'immediate', explorando o que é, como funciona e como
implementá-la.
Para entender a Mediação Imediata, é útil conhecer primeiro as outras opções. A mediação do utilizador no WebAuthn é a forma como o navegador gere a interação entre o seu site (a Relying Party) e o autenticador do utilizador (por exemplo, Face ID, YubiKey).
Este é o fluxo clássico e explícito do WebAuthn. Quando uma
Relying Party chama navigator.credentials.get() sem
especificar uma preferência de mediation, o navegador sempre apresenta uma caixa de
diálogo modal. Esta caixa de diálogo sobrepõe-se ao conteúdo da página, exigindo a atenção
imediata do utilizador e pausando toda a outra interação com o site.
mediation: 'conditional'#Introduzido para ajudar os utilizadores na
transição para passkeys, este modo é
mais subtil. Com mediation: 'conditional', o pedido WebAuthn é anexado a um campo de
entrada (por exemplo, nome de utilizador) com o atributo autocomplete="webauthn". Quando
o utilizador clica no campo, a interface de preenchimento automático do navegador sugere
quaisquer passkeys disponíveis.
mediation: 'immediate' é a solução para o problema do "botão de
login único". Fornece uma forma fiável para um site
verificar a disponibilidade de uma passkey antes de mostrar qualquer interface.
Em vez de mandar o utilizador autenticar-se com uma passkey através de um modal, a
mediação immediate pergunta ao navegador: "Existe uma passkey prontamente disponível
para este utilizador neste dispositivo agora mesmo?"
Crucialmente, esta consulta verifica apenas credenciais disponíveis localmente (por exemplo, autenticadores no dispositivo como o Windows Hello ou passkeys sincronizadas através de um gestor de passwords). Foi concebida para evitar acionar o fluxo de código QR entre dispositivos, que é um ponto de fricção comum.
O poder desta funcionalidade reside no seu resultado claro e binário. A promise retornada
por navigator.credentials.get() terá sucesso ou falhará, dando ao programador um sinal
claro.
PublicKeyCredential.navigator.credentials.get() é imediatamente rejeitada com uma
DOMException chamada NotAllowedError.O NotAllowedError não é um bug. É mais como uma funcionalidade. É um sinal fiável e
instantâneo de que o site deve prosseguir com um método de
autenticação de fallback. Isto permite que os programadores
usem um simples bloco try...catch: o bloco try tenta o fluxo de passkey simplificado,
e o bloco catch escuta por NotAllowedError para renderizar um formulário de login
tradicional. Resolve elegantemente o problema do botão de
login único, criando um ponto de entrada que se
adapta inteligentemente ao contexto do utilizador.
Escolher o modo de mediação correto é uma decisão crítica de UX. Esta tabela fornece uma comparação lado a lado.
| Funcionalidade / Comportamento | Modal (Padrão) | UI Condicional (conditional) | Imediata (immediate) |
|---|---|---|---|
| Chamada à API | navigator.credentials.get() | navigator.credentials.get({ mediation: 'conditional' }) | navigator.credentials.get({ mediation: 'immediate' }) |
| Gatilho | Ação explícita do utilizador (ex: clique no botão) | Carregamento da página; UI ao focar no campo de entrada | Ação explícita do utilizador (ex: clique no botão) |
| Apresentação da UI | Sempre mostra uma caixa de diálogo modal imediatamente. | Mostra uma UI não modal, estilo preenchimento automático. | Apenas se for encontrada uma credencial local, mostra uma caixa de diálogo modal. |
| Comportamento se Não Houver Credencial Local | Mostra UI para fluxos entre dispositivos (ex: código QR). | A promise permanece pendente, nunca é resolvida, nenhum erro é lançado. | A promise é imediatamente rejeitada com NotAllowedError. |
| Conhecimento do Site | Não aprende nada até o utilizador completar o fluxo. | Não aprende nada se o utilizador não interagir. Privacidade máxima. | Aprende uma informação: se existe uma credencial local. |
| Caso de Uso Principal | Botão dedicado "Entrar com Passkey". 2FA explícito. | Formulários unificados de login/registo. Melhoria progressiva de formulários de password. | Um único botão principal de "Entrar" para uma base de utilizadores mista. |
| Ação do Programador | Lidar com sucesso ou cancelamento do utilizador. | Lidar com sucesso. Nenhum sinal de falha para agir. | Lidar com sucesso ou NotAllowedError para acionar uma UI de fallback. |
Aqui está um guia prático, passo a passo, para implementar mediation: 'immediate'.
Como mediation: 'immediate' é uma nova funcionalidade, a deteção robusta da
funcionalidade é crucial.
// A deteção da funcionalidade é essencial para a melhoria progressiva. let immediateMediationAvailable = false; if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) { try { const capabilities = await PublicKeyCredential.getClientCapabilities(); // A capacidade 'immediateGet' sinaliza o suporte do navegador. immediateMediationAvailable = capabilities.immediateGet === true; } catch (e) { console.error("Error getting client capabilities:", e); } }
navigator.credentials.get()#Esta chamada deve ser acionada por um gesto do utilizador, como o clique num botão.
// Esta função deve ser o manipulador de eventos para o seu botão principal de "Entrar". async function handleSignInClick() { if (!immediateMediationAvailable) { // Recorrer a mostrar um formulário de login legado se a funcionalidade não for suportada. showLegacyLoginForm(); return; } try { // Obtenha um desafio novo e aleatório do seu servidor para cada tentativa. const challenge = await fetchChallengeFromServer(); const publicKeyCredentialRequestOptions = { challenge: challenge, // O desafio fornecido pelo servidor como um Uint8Array rpId: "example.com", // A lista allowCredentials DEVE estar vazia para a mediação imediata // para proteger a privacidade do utilizador. allowCredentials: [], }; const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, // Esta é a chave que ativa o fluxo de mediação imediata. mediation: "immediate", }); // Se a promise for resolvida, envie a credencial para o seu servidor para verificação. await verifyCredentialOnServer(credential); } catch (error) { // O bloco catch é uma parte crítica do fluxo de controlo. handleAuthError(error); } }
NotAllowedError para um Fallback Elegante#O bloco catch é onde a "inteligência" do botão de
login único é realizada.
// Lidar com o NotAllowedError é a chave para o mecanismo de fallback. function handleAuthError(error) { // Verifique a propriedade 'name' da DOMException. if (error.name === "NotAllowedError") { // Este é o sinal esperado para mostrar o formulário de login tradicional. console.log( "Nenhuma passkey local encontrada. A mostrar formulário de login legado.", ); showLegacyLoginForm(); } else { // Isto lida com outros erros potenciais, como o utilizador dispensar o pedido. console.error("Erro de autenticação:", error); } }
Para a experiência mais integrada, pode pedir ao navegador para procurar tanto por
passkeys como por passwords guardadas no mesmo pedido, adicionando password: true.
// Combinar passkeys e passwords para uma experiência de login verdadeiramente unificada. const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, password: true, // Peça ao navegador para incluir passwords guardadas. mediation: "immediate", }); // O objeto 'credential' retornado será um PublicKeyCredential // ou um PasswordCredential. A sua lógica do lado do servidor deve lidar com ambos.
conditional pendente (muitas vezes
iniciado no carregamento da página) pode bloquear um novo pedido immediate. Considere
usar um AbortController para cancelar quaisquer pedidos pendentes antes de iniciar um
novo.allowCredentials: O array allowCredentials deve estar vazio.
Fornecer IDs de credenciais fará com que a chamada falhe. Esta é uma salvaguarda de
privacidade crucial para impedir que os sites verifiquem utilizadores específicos e
conhecidos.mediation: 'immediate' foi concebida com uma clara compreensão das suas contrapartidas
de segurança e privacidade.
A principal contrapartida é um "vazamento de um bit". Ao cronometrar a resolução da promise, uma Relying Party pode inferir uma informação: se a promise foi rejeitada instantaneamente (nenhuma credencial local) ou foi atrasada (um pedido na UI foi mostrado porque uma credencial local foi encontrada). O propósito deste vazamento é permitir uma melhor UX.
Os criadores anteciparam o potencial de abuso (por exemplo, rastreamento de utilizadores) e integraram várias salvaguardas não negociáveis:
allowCredentials Proibida: O array allowCredentials deve estar vazio.
Isto impede que um site use esta funcionalidade para verificar se um utilizador
específico e conhecido está a visitar.iframe de outra origem) para impedir o rastreamento entre
sites.Estas mitigações garantem que as garantias de segurança centrais do WebAuthn permanecem intactas. A cerimónia de autenticação em si não é alterada e permanece resistente a phishing.
mediation: 'immediate' é uma funcionalidade avançada da
especificação WebAuthn Nível 3, e o seu lançamento está
em curso. A partir de meados de 2025, uma estratégia de melhoria progressiva é essencial.
| Navegador | Estado | Notas e Fonte |
|---|---|---|
| Chrome | Em teste para programadores | Disponível através da flag experimental-web-platform-features. Bug de acompanhamento. |
| Edge | Em Desenvolvimento (Esperado) | Como um navegador Chromium, o suporte deve seguir o do Chrome. |
| Safari (WebKit) | Em Consideração | Posições de Padrões do WebKit. Sem compromisso público. |
| Firefox (Gecko) | Em Consideração | Posições de Padrões da Mozilla. Sem compromisso público. |
Embora mediation: 'immediate' forneça uma ótima ferramenta de baixo nível para um botão
de login mais inteligente, é importante distingui-la de uma solução mais ampla de
"Passkey Intelligence",
como a oferecida pela Corbado. Ambas visam resolver o paradoxo das passkeys e aumentar a
adoção, mas fazem-no de maneiras diferentes.
| Funcionalidade | mediation: 'immediate' | Passkey Intelligence (ex: Corbado) |
|---|---|---|
| Como Funciona | Uma chamada à API nativa do navegador que verifica a existência de passkeys disponíveis localmente no dispositivo atual. | Um serviço de backend que recolhe e analisa dados sobre dispositivos de utilizadores, autenticadores e histórico de logins entre sessões. |
| Sinal Fornecido | Um sinal simples e binário: uma passkey local existe (pedido na UI) ou não existe (NotAllowedError). | Insights ricos e contextuais, por exemplo, "Este utilizador acabou de fazer login com uma password num dispositivo compatível com passkeys que usa frequentemente." |
| Vantagem Chave | Verificação nativa muito rápida com sobrecarga de rede mínima. | Disponibilidade universal, independente do suporte do navegador/SO para novas funcionalidades WebAuthn. Insights mais profundos para uma UX mais personalizada. |
| Dependência Principal | Requer suporte atualizado do navegador e do SO, que ainda não é universal. | Integração com um serviço de backend. |
Passkey Intelligence vai um passo além, recolhendo e avaliando dados ao longo do tempo. Isto permite intervenções mais sofisticadas e oportunas junto do utilizador. Por exemplo, um backend de Passkey Intelligence pode detetar:
Esta abordagem orientada por dados é independente do suporte do navegador para
mediation: 'immediate', o que significa que pode fornecer um fluxo de login mais
inteligente para todos os seus utilizadores, agora mesmo.
O Melhor de Dois Mundos
Em última análise, estas duas abordagens não são mutuamente exclusivas; são complementares. A solução ideal combina-as:
mediation: 'immediate' como um dos seus sinais em
navegadores suportados para realizar uma verificação inicial rápida.Ao combinar a velocidade nativa de mediation: 'immediate' com os insights profundos de
um backend de
Passkey Intelligence,
pode fornecer a experiência de login mais integrada, adaptativa e eficaz possível, guiando
suavemente cada utilizador em direção a um futuro sem passwords.
A Mediação Imediata é uma grande melhoria na experiência de login. Fornece a inteligência necessária para eliminar pontos comuns de fricção e confusão para os utilizadores durante a transição para passkeys.
immediate remove a carga cognitiva para o utilizador. Eles já não precisam de se
lembrar qual o método de autenticação que configuraram ou escolher de uma lista
sobrecarregada de opções. O processo de login torna-se mais simples e intuitivo.mediation: 'immediate' apenas procura por credenciais locais, evita completamente este
estado confuso. Em vez de o utilizador abandonar o fluxo, a aplicação recebe um sinal
claro (NotAllowedError) para recorrer elegantemente a outro método, resultando numa
jornada mais suave.A Mediação Imediata é uma nova funcionalidade do WebAuthn que resolve a experiência de login fragmentada do período de transição para passkeys. Permite a criação de um único botão de "Entrar" inteligente que se adapta ao contexto do utilizador, eliminando confusão e fricção. Embora introduza uma contrapartida de privacidade calculada, inclui salvaguardas robustas para mitigar riscos sem comprometer a segurança central do WebAuthn.
Para os programadores, o caminho a seguir é a melhoria progressiva. Construa uma
experiência de base sólida e adicione a mediação immediate por cima para os navegadores
suportados. Adotar esta funcionalidade é um movimento estratégico para acelerar a
adoção de passkeys, aumentar a segurança,
reduzir os custos operacionais e melhorar a conversão.
Implementar estes fluxos de autenticação avançados pode ser complexo. A Plataforma de
Passkeys Empresarial da Corbado abstrai esta complexidade. A nossa
infraestrutura lida com a orquestração ótima do
fluxo — incluindo mediação condicional e immediate, permitindo que a sua equipa
implemente uma experiência de autenticação de ponta e sem fricção com confiança.
Related Articles
Table of Contents