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: August 13, 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.
Recent Articles
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.
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents