Este artigo explica como implementar passkeys em aplicativos nativos (iOS + Android). Você aprenderá qual tipo de WebView é recomendado para autenticação com passkeys.

Vincent
Created: June 20, 2025
Updated: November 13, 2025

Passkeys Series: Native Apps
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
| Abordagem | Adoção | Criar Passkeys | Usar Passkeys | Gerir Passkeys | Complexidade Técnica | Suporte OAuth |
|---|---|---|---|---|---|---|
| Implementação Nativa | 🟢🟢🟢 | Alta adoção, melhor UX, biometria integrada | Autenticação instantânea e silenciosa | Controlo nativo total | Média-Alta | Requer fluxo separado |
| WebView do Sistema | 🟢🟢 | Boa adoção, experiência tipo browser | UX padrão do browser, keychain partilhado | Gestão baseada no browser | Baixa | Excelente |
| WebView Incorporada | 🟢 | Menor adoção, requer mais configuração | Suporte nativo iOS & Android (WebKit 1.12.1+), sem UI Condicional | Controlo limitado | Média-Alta | N/A |
Nota: As WebViews de Sistema e Incorporada são frequentemente combinadas, onde a WebView de Sistema trata do login (com partilha automática de credenciais) e, em seguida, a WebView Incorporada renderiza a gestão de passkeys nas definições.
Fatores Chave de Decisão:
As plataformas móveis modernas oferecem três abordagens distintas para integrar passkeys na sua aplicação nativa, cada uma com diferentes compromissos em termos de experiência do utilizador, complexidade técnica e compatibilidade com OAuth:
Implementação Nativa: Construa fluxos de passkeys diretamente na sua aplicação usando APIs da plataforma (AuthenticationServices do iOS, Credential Manager do Android). Proporciona a melhor experiência de utilizador com autenticação biométrica fluida, mas requer um esforço de implementação técnica médio a alto.
WebView do Sistema: Use o componente de browser da plataforma (ASWebAuthenticationSession / SFSafariViewController do iOS, Chrome Custom Tabs do Android) para gerir a autenticação. Excelente para fluxos de login baseados em OAuth e partilha credenciais com o browser do sistema.
WebView Incorporada: Incorpore uma visualização web personalizável (WKWebView do iOS, WebView do Android) dentro da sua aplicação para reutilizar a autenticação web com um esqueleto de aplicação nativa. Proporciona uma aparência semelhante à nativa, sem barras de URL, e controlo total sobre a UI da WebView. Requer configuração adicional, incluindo permissões e entitlements (iOS), e configuração da WebView com AndroidX WebKit 1.12.1+ (Android) para ativar a funcionalidade de passkeys.
A escolha certa depende da arquitetura de autenticação da sua aplicação, se usa fornecedores OAuth, quanto controlo precisa sobre a UI e se está a construir uma aplicação primariamente nativa ou a reutilizar componentes web.
Uma implementação nativa de passkeys proporciona a experiência de utilizador ideal, com fluxos de autenticação construídos diretamente na UI da sua aplicação, usando APIs específicas da plataforma. Os utilizadores beneficiam de diálogos nativos da plataforma, verificação biométrica fluida e os tempos de login mais rápidos possíveis.
Quando escolher a Implementação Nativa:
preferImmediatelyAvailableCredentials para
exibir automaticamente um overlay de passkeys
quando estas estão disponíveis, proporcionando a experiência de login mais rápida sem
exigir a inserção de um identificadorVantagem Chave: preferImmediatelyAvailableCredentials()
As implementações nativas podem tirar partido do preferImmediatelyAvailableCredentials()
para criar um
overlay automático de passkey
que aparece imediatamente no arranque da aplicação quando existem passkeys disponíveis.
Este fluxo sem nome de utilizador proporciona a experiência de login mais rápida possível
— os utilizadores veem as suas passkeys instantaneamente sem primeiro inserirem um
identificador. Esta capacidade é exclusiva das implementações nativas e não está
disponível nas variantes com WebView.
Embora as implementações com WebView possam usar a UI Condicional (sugestões de passkey em campos de entrada), o overlay automático da implementação nativa proporciona uma UX superior com taxas de utilização de passkeys mais elevadas, uma vez que a autenticação começa imediatamente após o lançamento da aplicação.
Visão Geral dos Requisitos Técnicos:
A integração nativa de passkeys requer uma confiança criptográfica entre a sua aplicação e o domínio web. Sem ela, o sistema operativo rejeitará todas as operações WebAuthn. Requisitos chave:
/.well-known/O maior benefício: as passkeys criadas no seu site funcionam perfeitamente na sua aplicação e vice-versa.
A implementação nativa de passkeys no iOS envolve a framework AuthenticationServices da Apple, que fornece uma API para operações WebAuthn:
Componentes Chave:
ASAuthorizationController: Gere o fluxo de autenticaçãoASAuthorizationPlatformPublicKeyCredentialProvider: Cria pedidos de passkeyDicas de Desenvolvimento
?mode=developer ao URL do seu AASA para forçar novas
obtenções.A implementação nativa de passkeys do Android utiliza a API Credential Manager (ou a API mais antiga FIDO2 para retrocompatibilidade):
Componentes Chave:
CredentialManager: API central para todas as operações de credenciaisCreatePublicKeyCredentialRequest: Para registo de passkeysGetCredentialRequest: Para autenticação com passkeyNota: Atualmente, o Android não possui as sugestões de teclado da UI Condicional do iOS em aplicações nativas (embora a UI Condicional funcione em aplicações web).
A implementação nativa de passkeys apresenta desafios e lições importantes: a integração ao nível do sistema operativo pode revelar problemas em diferentes dispositivos e versões do SO.
Embora seja possível implementar passkeys usando as APIs nativas da plataforma, SDKs especializados aceleram significativamente o desenvolvimento ao lidar com a complexidade do WebAuthn, casos de exceção e ao fornecer telemetria integrada. Os SDKs também oferecem interfaces simuláveis para testes unitários (crucial, uma vez que não se pode testar biometria em simuladores).
Recomendação: Para implementações nativas, recomendamos o uso dos SDKs da Corbado (SDK de Passkey para iOS em Swift, SDK de Passkey para Android em Kotlin), que lidam com os inúmeros casos de exceção descobertos através de implementações em produção, fornecem telemetria e testes adicionais.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
Corbado proved to be a trusted partner. Their hands-on, 24/7 support and on-site assistance enabled a seamless integration into VicRoads' complex systems, offering passkeys to 5 million users.
Passkeys que milhões adotam, rapidamente. Comece com a Plataforma de Adoção da Corbado.
Comece o Teste GratuitoAs WebViews do Sistema usam o componente de browser nativo da plataforma para gerir a autenticação dentro da sua aplicação. Ao contrário das implementações totalmente nativas, as WebViews do Sistema exibem conteúdo web usando o próprio browser do sistema (Safari no iOS, Chrome no Android), mantendo cookies partilhados, credenciais guardadas e os indicadores de segurança familiares do browser.
Quando escolher a WebView do Sistema:
Vantagens Chave:
Componentes da Plataforma:
ASWebAuthenticationSession (recomendado para fluxos de autenticação) ou
SFSafariViewController (navegação geral).Grandes empresas como a Google e o GitHub adotaram esta abordagem para adicionar o login com passkey às suas aplicações móveis através de overlays de WebView sobre as páginas de autenticação web existentes. Isto funciona bem quando a reconstrução de uma autenticação totalmente nativa não é imediatamente viável.
O iOS fornece dois componentes principais de WebView do Sistema para autenticação:
ASWebAuthenticationSession (Recomendado para Autenticação):
SFSafariViewController (Navegação Geral):
| Funcionalidade | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Caso de Uso Principal | Fluxos de autenticação | Navegação web geral |
| OAuth/OIDC | Excelente | Bom |
| Suporte a Passkey | Sim | Sim |
| Personalização | Limitada | Mínima |
Se a sua aplicação usa login baseado em OAuth, ASWebAuthenticationSession é a
escolha recomendada, pois foi especificamente desenhado para cenários de autenticação e
oferece o melhor equilíbrio entre segurança e experiência do utilizador.
Os Chrome Custom Tabs (CCT) proporcionam uma experiência de autenticação baseada no Chrome dentro da sua aplicação:
Funcionalidades Chave:
Integração OAuth: Os Chrome Custom Tabs são o equivalente no Android ao ASWebAuthenticationSession do iOS, proporcionando um excelente suporte a OAuth enquanto mantêm o acesso a passkeys armazenadas.
As WebViews Incorporadas proporcionam controlo total sobre a renderização do conteúdo web dentro da sua aplicação, permitindo a manipulação direta de cookies, sessões e navegação sem a barra de URL. No entanto, este controlo vem com requisitos técnicos adicionais para ativar a funcionalidade de passkeys.
Quando escolher a WebView Incorporada:
Contexto Importante:
Muitas aplicações usam uma abordagem híbrida: a WebView do Sistema gere a autenticação OAuth inicial (onde as passkeys funcionam perfeitamente), e depois mudam para a WebView Incorporada para o pós-autenticação, a fim de gerir as passkeys nas definições. Os desafios surgem ao tentar usar passkeys diretamente dentro de WebViews Incorporadas.
Requisitos Técnicos:
As WebViews Incorporadas requerem configuração adicional em comparação com as WebViews do Sistema:
Componentes da Plataforma:
WKWebViewandroid.webkit.WebViewCompromissos:
Ao implementar passkeys através de WebViews, é crucial entender a distinção entre WebViews de Sistema e WebViews Incorporadas. As três abordagens descritas acima (Implementação Nativa, WebView de Sistema e WebView Incorporada) servem casos de uso diferentes.
No iOS, tem múltiplas opções para exibir conteúdo web na aplicação:
No Android, as principais escolhas são:
android.webkit.WebView), que é
essencialmente um mini browser que pode ser incorporado nas suas atividades. É altamente
personalizável, mas corre no processo da sua aplicação.Nas secções seguintes, vamos aprofundar um pouco mais estes tipos de WebView para iOS e Android, e discutir qual pode ser o mais adequado para fluxos de autenticação com passkeys.
A plataforma da Apple fornece as três opções de WebView listadas acima. A sua escolha afetará a fluidez com que as passkeys podem ser usadas dentro da aplicação:
Para testar o comportamento das diferentes WebViews no iOS, recomendamos a aplicação WebView - WKWebView and UIWebView rendering.
WKWebView é um componente de WebView versátil para iOS. Os programadores podem incorporar uma WKWebView para renderizar conteúdo web com um alto grau de controlo sobre a UI e o comportamento. A WKWebView utiliza o mesmo motor de renderização do Safari, pelo que é muito performante e suporta funcionalidades web modernas. Em teoria, a WKWebView pode lidar com WebAuthn (e, portanto, passkeys) se configurada corretamente, mas note que algumas funcionalidades avançadas do browser podem ser restringidas por segurança. Uma coisa a ter em atenção é que a WKWebView, por defeito, não partilha cookies ou dados do keychain com o Safari Mobile. Os utilizadores podem ter de fazer login novamente porque a sua sessão na WebView está isolada da sessão do Safari. Além disso, como o conteúdo da WKWebView pode ser totalmente personalizado pela aplicação, o utilizador não vê uma barra de endereço ou a UI do Safari – o que é ótimo para a marca, mas significa que o utilizador tem menos pistas para verificar a legitimidade da página (uma preocupação para anti-phishing). Algumas aplicações até abusaram da WKWebView para injetar scripts ou alterar conteúdo (por exemplo, foi notado que o TikTok injetava JS de rastreamento através do seu browser na aplicação), pelo que se deve ter cuidado ao usar a WKWebView de uma forma segura e que inspire confiança no utilizador.
SFSafariViewController proporciona uma experiência Safari dentro da aplicação. Quando abre um URL com o SFSafariViewController, é quase como abri-lo no browser Safari real, exceto que o utilizador permanece dentro da UI da sua aplicação. A vantagem para as passkeys é significativa: como é essencialmente o Safari, o Chaves do iCloud do utilizador e as passkeys guardadas estão acessíveis. Note que os cookies não são partilhados no iOS 11+. Isto significa que, se o utilizador já tiver uma passkey para o seu site, o Safari pode encontrá-la e até exibir o preenchimento automático da UI Condicional para um login fácil. O SFSafariViewController é menos personalizável (não pode alterar muito a sua barra de ferramentas), mas trata automaticamente de muitas funcionalidades de segurança e privacidade. A barra de URL é mostrada, completa com o ícone do cadeado para HTTPS, o que dá aos utilizadores a confiança de que estão no domínio correto. Em geral, o SFSafariViewController é considerado mais seguro do que uma WKWebView pura e é mais simples de implementar (a Apple fornece-o como um componente pronto a usar). O principal compromisso é que sacrifica algum controlo sobre a aparência e o comportamento. Para um fluxo de autenticação, isso é geralmente aceitável. A prioridade aqui é a segurança e a facilidade de login, nas quais o SFSafariViewController se destaca ao usar o contexto do Safari.
| WKWebView | SFSafariViewController | |
|---|---|---|
| Experiência do utilizador | - Sensação nativa: Os utilizadores podem sentir que o conteúdo web é uma parte nativa da aplicação porque os programadores podem personalizar a aparência para corresponder ao design da aplicação. - Preenchimento automático: O preenchimento automático com dados do Safari é possível | - Fluida: Experiência de utilizador fluida usando as definições do Safari do utilizador, garantindo uma navegação web consistente entre a aplicação nativa e o browser. |
| Experiência do programador | - Altamente personalizável: Ampla personalização e configuração disponíveis - Flexível: Muitas APIs para interagir com o conteúdo web | - Personalização média: Opções de personalização limitadas, especialmente em comparação com a WKWebView - Simples: Mais simples de implementar em comparação com a WKWebView |
| Desempenho | - Relativamente lento: Dependendo da implementação e do conteúdo web, as velocidades de carregamento podem ser otimizadas, mas ainda podem ser mais lentas em comparação com o SFSafariViewController devido ao processamento adicional de funcionalidades e interações personalizadas. | - Relativamente rápido: Tipicamente oferece melhor desempenho, pois aproveita o motor do Safari, que é otimizado para velocidade e eficiência, proporcionando tempos de carregamento rápidos para páginas web. |
| Confiança e reconhecimento | - Exibição de URL não obrigatória: A WKWebView muitas vezes não mostra o URL, tornando mais difícil para os utilizadores verificarem a página web. Potencial para aplicações maliciosas imitarem este comportamento e fazerem phishing de credenciais. | - Experiência tipo browser: Renderiza páginas web usando o Safari, proporcionando uma experiência "tipo browser". Os utilizadores podem ver o URL e aceder às funcionalidades de preenchimento automático do Safari, potencialmente inspirando mais confiança devido à interface familiar. |
| Isolamento | - Separado: Cookies e sessões são separados do Safari; os utilizadores não terão login automático numa WKWebView. | - Separado: Cookies e sessões são separados do Safari; os utilizadores também não terão login automático no SFSafariViewController. |
| Vulnerabilidades | - Seguro: Intrinsecamente seguro devido ao sandboxing da aplicação da Apple, mas o comportamento e a segurança dependem da implementação da aplicação. Vulnerabilidades potenciais se não for implementado corretamente. | - Mais Seguro: Beneficia das funcionalidades de segurança integradas do Safari, incluindo avisos anti-phishing e de sites maliciosos. Geralmente considerado mais seguro para exibir conteúdo web do que a WKWebView devido a estas funcionalidades e à familiaridade do utilizador com o Safari. |
| Outros | - Funcionalidades não disponíveis: Algumas funcionalidades do browser (ex: WebAuthn) podem não estar totalmente acessíveis devido a preocupações de segurança e ao facto de a WKWebView correr no contexto da aplicação. - Injeção de JavaScript: Algumas aplicações, ex: TikTok, injetam JavaScript de rastreamento na sua WKWebView dentro da aplicação, ou restringem o controlo do utilizador (ex: Facebook) - Questões de privacidade: Mais feedback da comunidade sobre privacidade | - Sem injeção de JavaScript: Não permite a execução de JavaScript a partir da aplicação, melhorando a segurança e a privacidade. Também não suporta alertas ou confirmações de JavaScript, o que pode impactar a experiência do utilizador em certas páginas web. - Modo de Leitura: Fornece um modo de leitura para uma versão limpa e fácil de ler de artigos. |
SFAuthenticationSession / ASWebAuthenticationSession – Estas classes (sendo a última o nome mais recente e amigável para Swift) são construídas especificamente para fluxos de login como OAuth ou OpenID Connect. Quando precisa de autenticar um utilizador através de uma página web (talvez para um IdP externo), estas sessões são a escolha recomendada no iOS. São muito semelhantes ao SFSafariViewController, na medida em que utilizam o browser Safari nos bastidores e partilham cookies/armazenamento com o Safari. A principal diferença é que a SFAuthenticationSession irá sempre avisar o utilizador de que a aplicação quer autenticar-se usando uma página web (para consciencialização do utilizador) e irá usar automaticamente a sessão existente do utilizador no Safari, se disponível.
O benefício é uma experiência de SSO fluida – se o utilizador já estiver com login feito no fornecedor no Safari, esta sessão pode usar esse cookie para evitar outro login. Para passkeys, isto é importante porque significa que qualquer credencial de passkey armazenada no Safari/Chaves do iCloud também pode ser usada aqui. A orientação oficial da Apple é usar a ASWebAuthenticationSession para tudo o que se assemelhe a um fluxo de login. Os prós são a privacidade melhorada (a sua aplicação nunca vê as credenciais ou cookies, o Safari trata disso) e o suporte integrado a SSO. O contra é que está limitado a fluxos de autenticação (não o usaria para apenas renderizar conteúdo web arbitrário na sua aplicação). Em resumo, se escolher uma abordagem de WebView no iOS, a ASWebAuthenticationSession é tipicamente a melhor escolha para implementar passkeys porque é segura, partilha o estado com o Safari e foi construída propositadamente para autenticação.
No Android, a decisão sobre a WebView é entre a WebView clássica e os Chrome Custom Tabs:
Para testar o comportamento das diferentes WebViews no Android, recomendamos a aplicação WebView vs Chrome Custom Tabs.
Android WebView (android.webkit.WebView) é um componente que lhe permite incorporar páginas web no layout da sua atividade. É semelhante à WKWebView na medida em que lhe dá controlo total: pode intercetar a navegação, injetar JavaScript, personalizar a UI, etc. Também corre dentro do processo da sua aplicação. Usar uma WebView para passkeys significa que a sua aplicação carrega a sua página de login web, e essa página pode iniciar uma cerimónia de passkey WebAuthn. A Android WebView moderna suporta WebAuthn (desde que a implementação da WebView do dispositivo esteja atualizada através da Android System WebView ou do componente Chrome). Uma grande consideração: por defeito, uma Android WebView não partilha cookies ou credenciais armazenadas com o browser Chrome do utilizador. Assim, qualquer passkey criada ou usada na WebView pode não ser conhecida pelo Chrome, e vice-versa. Este isolamento pode ser bom para a segurança (a sua aplicação não pode ler os cookies do browser), mas pode forçar os utilizadores a fazer login novamente se já se tiverem autenticado no Chrome. Outra questão é a confiança. Uma WebView simples não mostra o URL ou o ícone do cadeado SSL, pelo que os utilizadores têm de confiar completamente na sua aplicação para não serem alvo de phishing. A Google até proibiu o uso da WebView para logins OAuth da Google devido a potenciais riscos de phishing. Em termos de desempenho, as WebViews são aceitáveis, mas podem ser mais lentas ou mais intensivas em memória do que usar o browser padrão do utilizador, especialmente se carregarem páginas pesadas.
Chrome Custom Tabs (CCT) são uma abordagem híbrida. Permitem que a sua aplicação abra uma página renderizada pelo Chrome que parece fazer parte da sua aplicação. Pode personalizar a cor da barra de ferramentas, adicionar um logótipo da aplicação, etc., mas o conteúdo é renderizado pelo Chrome num processo separado. Para passkeys, os CCTs têm vários benefícios: partilham os cookies e credenciais do utilizador com o Chrome, o que significa que se o utilizador tiver uma passkey guardada através do Chrome (Gerenciador de Senhas do Google), o Custom Tab pode aceder a ela. O utilizador também verá o URL real e os indicadores de segurança, o que gera confiança. O desempenho é muitas vezes melhor – o Chrome pode ser "aquecido" em segundo plano para um carregamento mais rápido. E, importante, a segurança é forte: como é essencialmente a aplicação Chrome, coisas como o Google Safe Browsing protegem a sessão, e a sua aplicação não pode injetar scripts arbitrários na página (prevenindo certos ataques).
A desvantagem é que requer que o utilizador tenha o Chrome (ou um browser suportado) instalado e atualizado. A maioria dos utilizadores de Android tem, mas em alguns dispositivos em certas regiões, isto pode ser um problema. No geral, se optar por uma abordagem web incorporada no Android, os Chrome Custom Tabs são recomendados para fluxos de passkey, pois proporcionam um bom equilíbrio entre integração e segurança. Na verdade, são análogos ao SFSafariViewController/ASWebAuthSession do iOS de muitas formas – aproveitando o browser padrão para autenticação.
(Apartado: A WKWebView vs SFSafariViewController da Apple e a WebView vs CCT do Android têm muitos paralelos. Tanto o Safari VC como os Chrome Tabs partilham o estado do browser e proporcionam melhor segurança, enquanto a WKWebView/Android WebView dão mais controlo, mas isolam o conteúdo web. Para passkeys, a partilha de estado (cookies, armazenamentos de credenciais) é geralmente desejável para que a passkey possa ser acedida e criada de forma fluida.)
| Funcionalidade | WebView | Chrome Custom Tab |
|---|---|---|
| Experiência do utilizador | - Flexibilidade: Fornece um conjunto rico de APIs para interagir com o conteúdo web e gerir as interações do utilizador, incluindo o tratamento de diálogos JavaScript e pedidos de permissão. - Consistência: Gerir uma UX consistente, especialmente com conteúdo web variado, pode ser um desafio. | - Funcionalidades do Browser: Partilha funcionalidades como o Data Saver e o AutoComplete sincronizado entre dispositivos. - Botão de retroceder: Permite que os utilizadores regressem facilmente à aplicação com um botão de retroceder integrado. - Dependência: Depende da aplicação Chrome, que pode não estar disponível ou atualizada em todos os dispositivos dos utilizadores. - Redirecionamento para o Browser: Certas funcionalidades podem redirecionar os utilizadores para a aplicação Chrome, potencialmente interrompendo a experiência do utilizador. - Custom Tabs Parciais: Apenas uma parte do ecrã pode ser usada para o Chrome Custom Tab, enquanto o resto mostra a aplicação nativa. - Folha lateral: No modo paisagem e em dispositivos de ecrã grande, o Chrome Custom Tab é exibido apenas num lado do ecrã, enquanto o resto do ecrã mostra a aplicação nativa. |
| Experiência do programador | - Altamente Personalizável: Oferece extensas opções/necessidades de personalização. - Interatividade: Fornece inúmeras APIs para interagir com o conteúdo web e gerir as interações do utilizador. | - Personalizável: Permite a personalização da cor da barra de ferramentas, botão de ação, barra de ferramentas inferior, itens de menu personalizados e animações de entrada/saída. - Callback: Envia um callback para a aplicação após uma navegação externa. - Funcionalidades de Segurança: Fornece funcionalidades prontas a usar, eliminando a necessidade de gerir pedidos, concessões de permissão ou armazenamentos de cookies. |
| Desempenho | - Desempenho Medíocre: Pode não oferecer o mesmo nível de desempenho dos Chrome Custom Tabs (CCT). | - Pré-aquecimento: Inclui o pré-aquecimento do Browser em segundo plano e o carregamento especulativo de URLs para melhorar o tempo de carregamento da página. - Prioridade: Impede que as aplicações que lançam um Custom Tab sejam terminadas durante a sua utilização, elevando a sua importância para o nível de "primeiro plano". |
| Confiança e reconhecimento | - URL & SSL não visíveis: O URL e as informações SSL não são inerentemente visíveis numa WebView. A menos que o programador da aplicação implemente estas funcionalidades, os utilizadores não saberão se estão no site correto ou num de phishing. | - URL & SSL Visíveis: Utiliza o browser Chrome real para renderizar páginas. Os utilizadores podem ver o URL e o certificado SSL (indicando se a ligação é segura). Isto pode dar aos utilizadores a confiança de que não estão num site de phishing. |
| Isolamento | - Corre dentro do processo da aplicação: Se uma aplicação tiver uma vulnerabilidade que permita a execução de código malicioso, há o risco de a WebView poder ser comprometida. No entanto, a WebView também recebe atualizações, mas o seu comportamento e segurança podem depender mais da aplicação que a utiliza. - Sem partilha de Cookies / Sessão: Não partilha cookies ou sessões com o browser principal do dispositivo, oferecendo isolamento, mas possivelmente exigindo que os utilizadores façam login novamente. | - Corre dentro do processo do Chrome: Sendo parte do Chrome, os Custom Tabs correm no mesmo processo e têm as mesmas atualizações de segurança e funcionalidades do Chrome. - Jar de Cookies e Modelo de Permissões Partilhados: Garante que os utilizadores não tenham de fazer login novamente nos sites ou conceder permissões novamente. - Definições e Preferências do Chrome: Utiliza as definições e preferências do Chrome. |
| Vulnerabilidades | - Callbacks para Roubar Credenciais: As vulnerabilidades potenciais incluem que, por vezes, é necessário JavaScript, o que abre a porta para outras aplicações executarem código malicioso, como registar callbacks que tentam intercetar nomes de utilizador e palavras-passe. - Phishing: Adicionalmente, uma aplicação maliciosa pode abrir outra página web que imita o fluxo de Ligação numa tentativa de phishing. | - Google Safe Browsing: Emprega o Safe Browsing da Google para proteger tanto o utilizador como o dispositivo de sites perigosos. - Decoração Segura do Browser: Garante que o utilizador veja sempre o URL exato com que está a interagir e possa ver as informações do certificado do site, reduzindo o risco de phishing. Além disso, os custom tabs não permitem a injeção de JavaScript. |
| Outros | - A Google baniu as WebViews para o login de utilizadores em contas Google |
Independentemente da abordagem de implementação que escolher, certos requisitos técnicos devem ser cumpridos para ativar a funcionalidade de passkeys. Esta secção fornece orientação abrangente sobre a configuração de ficheiros de associação well-known, entitlements do iOS e configuração da WebView do Android.
Nota sobre Dispositivos Geridos: O comportamento das passkeys muda significativamente em dispositivos geridos onde as políticas de Gestão de Dispositivos Móveis (MDM) controlam o armazenamento de credenciais. Para testar passkeys em dispositivos geridos, consulte Passkeys em Dispositivos Geridos iOS & Android.
Os fluxos Nativo e de WebView Incorporada requerem ficheiros de associação para estabelecer confiança criptográfica entre a sua aplicação e o domínio web. A WebView de Sistema (ASWebAuthenticationSession) e os Chrome Custom Tabs não requerem associação da aplicação ao site.
O ficheiro AASA estabelece a ligação entre a sua aplicação iOS e o seu domínio web, permitindo que as passkeys funcionem em ambas as plataformas.
Localização do Ficheiro:
https://oseudominio.com/.well-known/apple-app-site-association
Requisitos de Configuração:
/.well-known/apple-app-site-association no seu domínioapplication/json.well-knownExemplo de Ficheiro AASA:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
Caching e Teste do AASA:
A Apple armazena agressivamente em cache os ficheiros AASA (até 24-48 horas) usando uma CDN, o que pode frustrar o desenvolvimento e os testes. Para contornar o cache durante o desenvolvimento:
?mode=developer ao seu domínio associado no Xcode⚠️ Importante: NÃO use ?mode=developer em versões de produção. Este parâmetro é
apenas para desenvolvimento — usá-lo em produção impedirá o iOS de detetar corretamente o
seu ficheiro AASA, quebrando a funcionalidade de passkeys.
Validação: Use o Validador AASA da Apple para verificar a sua configuração.
O Android usa Digital Asset Links para verificar a relação entre a sua aplicação e o seu site.
Localização do Ficheiro: https://oseudominio.com/.well-known/assetlinks.json
Requisitos de Configuração:
/.well-known/assetlinks.json no seu domínioapplication/jsonExemplo de Ficheiro assetlinks.json:
[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": [ "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99" ] } } ]
Validação: Use o Gerador de Digital Asset Links da Google para criar e verificar a sua configuração.
As aplicações iOS requerem entitlements adequados para aceder à funcionalidade de passkeys. Os requisitos diferem ligeiramente com base na sua abordagem de implementação.
O ficheiro de entitlements (muitas vezes chamado Runner.entitlements em aplicações
Flutter ou ASuaApp.entitlements em projetos nativos
iOS) define permissões e capacidades especiais concedidas pelo sistema da Apple. Para
passkeys, este ficheiro configura os Domínios Associados.
Localização do Ficheiro: Tipicamente no seu projeto Xcode em
ios/Runner/Runner.entitlements
A Implementação Nativa e a WebView Incorporada requerem a capacidade de Domínios Associados para ligar a sua aplicação ao seu domínio web. A WebView de Sistema (ASWebAuthenticationSession) não requer isto, pois corre no contexto do Safari.
Configuração no Xcode:
webcredentials:Exemplo de Configuração:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>webcredentials:oseudominio.com</string> <string>webcredentials:subdominio.oseudominio.com</string> </array> </dict> </plist>
| Abordagem | Domínios Associados Necessários | Configuração Adicional |
|---|---|---|
| Implementação Nativa | Sim | Implementação dedicada |
| WebView do Sistema | Não necessário | A configuração web padrão funciona |
| WebView Incorporada | Sim | Requer configuração do AndroidX WebKit 1.12.1+ |
Múltiplos Domínios: Se a sua aplicação precisar de funcionar com múltiplos domínios, pode precisar de Related Origin Requests (ROR).
As WebViews Incorporadas do Android ganharam suporte nativo a WebAuthn com o AndroidX WebKit 1.12, eliminando a necessidade de código de ponte JavaScript personalizado. A WebView de Sistema (Chrome Custom Tabs) não requer qualquer configuração — as credenciais funcionam automaticamente.
Requisitos:
Implementação:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Verificar se a Autenticação Web é suportada if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Ativar a Autenticação Web WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Ativar JavaScript webView.settings.javaScriptEnabled = true }
Pontos Chave:
WebViewFeature.WEB_AUTHENTICATION em tempo de execuçãomediation:"conditional" (preenchimento automático de
passkeys em campos de entrada) não funciona na WebView IncorporadaNotas de Versão:
Antes do AndroidX WebKit 1.12.0, não existia suporte nativo a WebAuthn na WebView Incorporada. As equipas tinham de:
Se precisar de suportar versões mais antigas do Android ou dispositivos sem APKs da WebView atualizados, consulte o guia de Integração da WebView do Credential Manager do Android para a abordagem de código de ponte. No entanto, recomendamos vivamente o uso da abordagem nativa do WebKit 1.12.1+ para aplicações modernas.
Recomendação: Use o suporte nativo a WebAuthn com o AndroidX WebKit 1.12.1+. Se não estiver disponível em tempo de execução, recorra aos Chrome Custom Tabs, que fornecem excelente suporte a passkeys com credenciais partilhadas.
Ao implementar passkeys em aplicações nativas, precisa de estabelecer confiança entre a sua aplicação e o(s) seu(s) domínio(s) web. Esta secção cobre como lidar com domínios únicos, múltiplos domínios relacionados (ROR) e como verificar se os seus ficheiros de associação well-known estão configurados corretamente.
Para aplicações que usam um único domínio (ex: kayak.com), precisa de:
webcredentials:kayak.comOrigens Relacionadas (ROR) é uma
funcionalidade do WebAuthn que permite que um único conjunto de passkeys funcione em
múltiplos domínios relacionados (ex: kayak.com, kayak.de, kayak.co.uk). O
ROR usa o endpoint
/.well-known/webauthn em cada site para definir
origens relacionadas,
NÃO os ficheiros AASA ou assetlinks.
Pontos Chave:
/.well-known/webauthn com a lista de
origens relacionadasExemplo de Configuração:
Se a sua aplicação funciona com kayak.com e kayak.de, ambos os domínios devem:
Antes de entrar em produção, verifique se os seus ficheiros well-known estão configurados corretamente e acessíveis. A Apple e a Google fornecem URLs de teste baseados em CDN para verificar a disponibilidade dos ficheiros:
| Domínio | Verificação AASA da Apple | Verificação Digital Asset Links da Google |
|---|---|---|
| kayak.com | Testar ficheiro AASA Verifique se a CDN da Apple consegue obter o seu ficheiro | Testar assetlinks.json Verifique se a Google consegue aceder aos seus asset links |
| kayak.de | Testar ficheiro AASA Verifique se a CDN da Apple consegue obter o seu ficheiro | Testar assetlinks.json Verifique se a Google consegue aceder aos seus asset links |
Usando Estes URLs de Teste:
?nocache=1 da Apple força uma nova obtenção, contornando o cache da CDNkayak.com ou kayak.de pelo(s) seu(s) próprio(s) domínio(s) nos padrões de
URL acimaArmadilha de Teste: Garanta que todos os domínios têm ficheiros well-known configurados corretamente. Um ficheiro em falta ou mal configurado em qualquer domínio pode quebrar a funcionalidade de passkeys para esse domínio.
Mais Informação: ID da Relying Party do WebAuthn em Aplicações Nativas
Escolher a abordagem de implementação correta depende da arquitetura de autenticação da sua aplicação, dos requisitos de OAuth e da necessidade de controlo de sessão. Use esta árvore de decisão para determinar o melhor caminho a seguir.
Comece com estas questões chave:
A sua aplicação usa login baseado em OAuth (OAuth2, OIDC, fornecedores de login social)?
ASWebAuthenticationSessionQuer reutilizar a autenticação web num shell com aspeto nativo (sem barra de URL, controlo total da UI)?
WKWebView + entitlements de Domínios AssociadosWebView + configuração do AndroidX WebKit 1.12.1+Está a construir uma nova aplicação nativa ou tem ecrãs de login nativos?
Já tem uma autenticação web que quer reutilizar?
Eis como cada abordagem se comporta em dimensões chave:
| Abordagem | Criar Passkeys | Usar Passkeys | Gerir Passkeys | Complexidade Técnica | Suporte OAuth | Tempo de Configuração |
|---|---|---|---|---|---|---|
| Implementação Nativa | Alta adoção Biometria fluida, melhor UX | Instantâneo, silenciosopreferImmediatelyAvailableCredentials ativa overlay automático no arranque da app | Controlo nativo total Integrar com as definições da app | Média-Alta APIs específicas da plataforma | Requer implementação de fluxo OAuth separado | Semanas a meses |
| WebView do Sistema | Boa adoção Experiência tipo browser, familiar | UX padrão do browser UI Condicional em campos de entrada, keychain partilhado | Baseado no browser Utilizadores gerem através do browser | Baixa Código nativo mínimo | Excelente Construído para OAuth | Dias a semanas |
| WebView Incorporada | Adoção mais baixa Requer configuração | Suporte nativo WebAuthn WebKit 1.12.1+, sem UI Condicional | Controlo limitado Sem integração nativa | Média-Alta Configuração de WebView + permissões | Requer configuração | 1-2 semanas |
Explicação das Dimensões:
Recomendado: WebView de Sistema
Se a sua aplicação se autentica via OAuth2, OIDC ou fornecedores de login social (Google, GitHub, Microsoft, etc.), a WebView de Sistema é a escolha ótima:
ASWebAuthenticationSession é construído propositadamente para fluxos OAuthExemplo: Aplicações de Viagens como kayak.com e kayak.de usam OAuth para autenticação. A WebView de Sistema permite-lhes manter a sua infraestrutura OAuth existente enquanto adicionam suporte a passkeys através das suas páginas de autenticação web.
Recomendado: Abordagem Híbrida
Use a WebView de Sistema para a autenticação OAuth inicial e, em seguida, a WebView Incorporada para sessões pós-autenticação:
Quando usar: Aplicações que se autenticam via OAuth mas que depois precisam de exibir conteúdo web autenticado onde é necessária a manipulação direta da sessão.
Recomendado: Implementação Nativa
Se está a construir de raiz ou tem ecrãs nativos? Opte por uma implementação totalmente nativa:
preferImmediatelyAvailableCredentials para exibir um
overlay automático de passkey no arranque da aplicação -
exclusivo para implementações nativas e que proporciona as mais altas
taxas de conversãoPara Novas Aplicações: Recomendo vivamente construir um login nativo desde o primeiro dia. Prepara-o para uma UX ótima e evita futuras migrações de WebView para nativo.
Recomendado: Migração Faseada
Esta abordagem faseada permite melhorias incrementais sem perturbar os utilizadores existentes.
| Requisito | Nativo | WebView de Sistema | WebView Incorporada |
|---|---|---|---|
| Ficheiros well-known (AASA/assetlinks) | Necessário | Não necessário | Necessário |
| Domínios Associados do iOS | Necessário | Não necessário | Necessário |
| Biblioteca WebKit do Android | Não aplicável | Não necessário | Necessário (1.12.1+) |
| ID da Relying Party | Deve corresponder ao domínio | Deve corresponder ao domínio | Deve corresponder ao domínio |
Consulte a Secção 5 para instruções detalhadas de configuração.
Testar passkeys em aplicações nativas requer uma abordagem estruturada e multi-camadas. Siga a pirâmide de testes: testes unitários (lógica isolada), testes de integração (cerimónia WebAuthn em simuladores/emuladores) e testes de sistema (ponta a ponta em dispositivos físicos).
Categorias de Teste Essenciais:
Para orientação de testes abrangente, incluindo estratégias de automação, particularidades específicas da plataforma e uma lista de verificação pré-lançamento completa, consulte o nosso guia dedicado: Testar Fluxos de Passkey em Aplicações Nativas iOS & Android.
Considere pedir aos utilizadores para criarem passkeys após um login tradicional bem-sucedido (palavra-passe, OAuth). Esta abordagem de conversão gradual:
Exemplo: Após o login OAuth via WebView de Sistema, mostre um prompt nativo: "Ativar login mais rápido com Face ID?" Se aceite, crie a passkey através da página web carregada na WebView de Sistema.
Decidir como implementar passkeys — através de Implementação Nativa, WebView de Sistema ou WebView Incorporada — é uma escolha de design crucial que impacta a segurança, a experiência do utilizador e a complexidade do desenvolvimento. Não há uma resposta única para todos.
Para aplicações baseadas em OAuth: A WebView de Sistema (ASWebAuthenticationSession, Chrome Custom Tabs) é o ponto de partida recomendado. Fornece um excelente suporte a OAuth, esforço de implementação mínimo e partilha automática de credenciais.
Para aplicações focadas no nativo: Opte pelo nativo mais cedo ou mais tarde. Um
login com passkey nativo oferece a UX mais
fluida com capacidades exclusivas como preferImmediatelyAvailableCredentials, que ativa
um
overlay automático de passkey no arranque da aplicação
— algo que as implementações com WebView não podem fornecer. Com o iOS e o Android a
oferecerem agora suporte de primeira classe para passkeys, os sucessos do mundo real
demonstram uma alta adoção. As ferramentas (incluindo SDKs de código aberto e bibliotecas
de plataforma) amadureceram para tornar a integração nativa alcançável em prazos
razoáveis. Embora deva estar atento às políticas de gestão de dispositivos, sincronização
entre dispositivos e fornecedores de terceiros, estes desafios podem ser geridos com
engenharia e testes cuidadosos. O resultado é um login de aplicação que encanta os
utilizadores com a sua facilidade e velocidade, enquanto melhora significativamente a
segurança.
Para requisitos de frames de WebView incorporada: A WebView Incorporada é comummente usada em dois cenários do mundo real. Primeiro, as aplicações baseadas em OAuth usam frequentemente a WebView de Sistema para o fluxo de login inicial, e depois mudam para a WebView Incorporada para renderizar opções de gestão de passkeys nos ecrãs de definições onde o controlo de sessão é necessário — embora algumas aplicações simplifiquem isto mantendo a WebView de Sistema para ambos os fluxos. Segundo, as aplicações que já incorporavam o seu fluxo de autenticação em frames de WebView antes de adotarem passkeys continuam este padrão por consistência. A WebView Incorporada com suporte nativo a WebAuthn (AndroidX WebKit 1.12.1+) requer configuração e instalação (permissões, entitlements, definições da WebView), mas já não necessita de código de ponte JavaScript personalizado. Note que a UI Condicional não é suportada na WebView Incorporada. Escolha esta abordagem quando mantiver padrões de autenticação incorporados existentes ou quando precisar de controlo de sessão/cookie para ecrãs pós-autenticação.
Em última análise, as passkeys em aplicações nativas representam um enorme salto em frente tanto na conveniência do utilizador como na segurança. Quer sejam implementadas via Nativa, WebView de Sistema ou WebView Incorporada, eliminam os riscos de phishing e os fardos da gestão de palavras-passe para os seus utilizadores. Implementações do mundo real como a integração de passkeys na aplicação nativa da VicRoads demonstram que as abordagens focadas no nativo proporcionam a maior adoção e satisfação do utilizador quando executadas corretamente com funcionalidades como overlays automáticos de passkey. Seguindo as melhores práticas para uma autenticação amigável ao utilizador e escolhendo a abordagem de implementação que corresponde à arquitetura da sua aplicação — focada no nativo para novas aplicações, WebView de Sistema para fluxos OAuth, ou WebView Incorporada para padrões incorporados existentes — pode oferecer logins sem palavra-passe e biométricos que verdadeiramente realizam a visão das passkeys: autenticação simples, segura e agradável para todos.
Se as passkeys não estiverem a funcionar na sua aplicação nativa, verifique estes problemas comuns por abordagem de implementação:
application/json.well-knownhttps://o-seu-dominio.com (não app://)webcredentials:oseudominio.comASWebAuthenticationSession (recomendado) ou SFSafariViewController?mode=developer durante o desenvolvimento (remover para produção)WebViewFeature.WEB_AUTHENTICATIONsetWebAuthenticationSupport() chamada com
WEB_AUTHENTICATION_SUPPORT_FOR_APP"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport()Nenhum prompt de passkey aparece
?mode=developer no iOS para testes,
verificar o tipo de WebViewPara uma depuração detalhada, consulte o nosso artigo sobre IDs da Relying Party em aplicações nativas.
SDKs Nativos da Corbado:
Documentação da Plataforma:
Ferramentas de Validação:
Passkeys Series: Native Apps
Related Articles
Passkey Tutorial: How to Implement Passkeys in Web Apps
Vincent - December 7, 2023
The High-Level Architecture of an Integrated Passkey Flow
Janina - December 21, 2022
Table of Contents