Desenvolvedores Android buscam constantemente maneiras de aprimorar a segurança, aprimorar a experiência do usuário e simplificar o desenvolvimento. O Zoho, uma suíte integrada de softwares em nuvem focada em segurança e experiência fluida, alcançou melhorias significativas ao adotar passkeys em seu aplicativo OneAuth para Android.
Desde a integração em 2024, o Zoho acelerou os tempos de login em até 6x em comparação com métodos anteriores, enquanto a taxa de adoção mensal de passkeys cresceu 31%.
Este estudo de caso explora como o Zoho resolveu desafios de autenticação ao adotar passkeys e a API Credential Manager do Android, detalhando a implementação técnica e seus resultados notáveis.
Enfrentando os Desafios da Autenticação
O Zoho emprega diversos métodos de autenticação, incluindo sua solução de autenticação multifator (MFA) proprietária, Zoho OneAuth, que suporta login com base em senha e sem senha via notificações push, QR codes e senhas únicas baseadas em tempo (TOTP). A plataforma também oferece login federado via SAML e outros provedores.
O Problema
Assim como muitas empresas, o Zoho buscava melhorar a segurança da autenticação, a experiência do usuário e reduzir a carga operacional. Os principais desafios incluíam:
- Falhas de Segurança: Métodos tradicionais baseados em senha expunham usuários a ataques de phishing e violações de credenciais.
- Frustação do Usuário: A "fadiga de senha" levava a esquecimentos, frustração e processos onerosos de recuperação.
- Ineficiência Operacional: Suporte para redefinições de senha e problemas de MFA gerava custos elevados.
- Escalabilidade: Uma base de usuários em crescimento exigia soluções de autenticação mais seguras e eficientes.
Por que Adotar Passkeys?
Para resolver esses problemas, o Zoho implementou passkeys, oferecendo um método sem senha que melhora significativamente a segurança e a experiência do usuário. A solução emprega autenticação reisstente a phishing, credenciais sincronizadas na nuvem para acesso fácil entre dispositivos, e usa biometria (como impressão digital ou reconhecimento facial), PIN ou padrão para login seguro, reduzindo as vulnerabilidades e inconveniências das senhas tradicionais.
Ao adotar passkeys e o Credential Manager, o Zoho reduziu os tempos de login em até 6x, diminuiu os custos de suporte relacionados a senhas e alcançou uma adoção massiva pelos usuários, com o número de logins via passkey dobrando em apenas 4 meses e um crescimento mensal contínuo de 31%.
Integração com o Credential Manager no Android
O segredo por trás desses resultados foi o uso da API Credential Manager do Android, a biblioteca Jetpack recomendada para implementar autenticação na plataforma.
O Credential Manager fornece uma API unificada que simplifica o tratamento de vários métodos de autenticação. Com uma única interface, não é necessário chamar APIs diferentes para senhas, passkeys e login federado (como o Login com Google).
A implementação do passkey no Zoho exigiu ajustes no cliente e no servidor. A seguir, os detalhes do processo de criação, login e implementação do lado do servidor.
Criação da Passkey
Para criar uma passkey, o aplicativo primeiro recupera detalhes de configuração do servidor do Zoho. O processo inclui uma verificação única, como impressão digital ou reconhecimento facial. O aplicativo então constrói uma CreatePublicKeyCredentialRequest usando os dados de verificação. Em seguida, chama o método credentialManager.createCredential, que solictia ao usuário que se autentique usando o bloqueio de tela do dispositivo (biometria, PIN, etc.).
Após a confirmação bem-sucedida, o aplicativo recebe os dados da nova credencial de passkey e os envia de volta ao servidor do Zoho para validação e armazenamento, associando a passkey à conta do usuário.
Login com Passkey
O aplicativo Android do Zoho inicia o fluxo de login com passkey solicitando opções de login (incluindo um challenge único) ao backend. O aplicativo então constrói um GetCredentialRequest indicando que usará uma passkey para autenticação e chama a API Android CredentialManager.getCredential(). Isso aciona a interface nativa do Android, solicitando ao usuário que selecione sua conta (se houver múltiplas passkeys) e se autentique com o bloqueio de tela. Após a autenticação, o Credential Manager retorna uma asserção assinada (prova de login) ao aplicativo, que a encaminha ao servidor para validação e conclusão do login seguro.
Implementação no Servidor
A transição suave para passkeys foi facilitada pelo fato de que os sistemas de backend do Zoho já eram compatíveis com o padrão FIDO WebAuthn. No entanto, foram necessárias modificações específicas.
O desafio central foi ajustar o sistema de armazenamento de credenciais. Os métodos de autenticação existentes, baseados em senha e chaves de segurança FIDO, requeriam técnicas de armazenamento diferentes das passkeys baseadas em chave pública criptográfica. O Zoho implementou um novo esquema de banco de dados para armazenar com segurança as chaves públicas das passkeys e os dados associados, incluindo um mecanismo de lookup para verificação e recuperação.
Outro ajuste no servidor foi capacitar o sistema a lidar com solicitações originadas de dispositivos Android. As passkeys do Android usam um formato de origem único (android:apk-key-hash:example), diferente do formato baseado em URI usado na web. O servidor foi atualizado para analisar corretamente esse formato, extrair o hash SHA-256 do certificado de assinatura do aplicativo e validá-lo contra uma lista pré-registrada, garantindo que as solicitações se originem legítimamente do aplicativo Zoho.
O trecho de código a seguir demonstra como o servidor verifica o formato de origem específico do Android e valida o hash do certificado:
fun validateOrigin(originString: String): Boolean {
if (!originString.startsWith("android:apk-key-hash:")) return false
val components = originString.split(":")
if (components.size < 4) return false
val providedHash = try {
Base64.decode(components[3], Base64.DEFAULT)
} catch (e: IllegalArgumentException) {
return false
}
return providedHash.contentEquals(expectedAppCertificateHash)
}
Tratamento de Erros
O Zoho implementou um sistema robusto de tratamento de erros para gerenciar falhas que afetam usuários e desenvolvedores. Um erro comum é a exceção CreateCredentialCancellationException, quando o usuário cancela manualmente a configuração da passkey. A empresa monitora a frequência desses erros para avaliar possíveis melhorias na experiência do usuário e segue as diretrizes de UX do Android para educar os usuários sobre a disponibilidade das passkeys.
O exemplo de código a seguir mostra como o Zoho trata as exceções mais comuns na criação de passkeys:
fun handleCreationException(exception: CreateCredentialException) {
when (exception) {
is CreateCredentialCancellationException -> {
logAnalyticsEvent("PASSKEY_CREATION_USER_CANCELLED")
showErrorToUser("Operação cancelada pelo usuário.")
}
is CreateCredentialInterruptedException -> {
logAnalyticsEvent("PASSKEY_CREATION_INTERRUPTED")
showErrorToUser("Configuração interrompida. Tente novamente.")
}
is CreatePublicKeyCredentialDomException -> {
logAnalyticsEvent("PASSKEY_DOM_ERROR", exception.domError.message)
showErrorToUser("Erro na configuração: ${exception.domError}")
}
else -> {
logAnalyticsEvent("PASSKEY_CREATION_FAILED", exception.javaClass.simpleName)
showErrorToUser("Ocorreu um erro inesperado.")
}
}
}
Testes em Ambientes Internos
Ao testar passkeys em um ambiente interno restrito, o Zoho encontrou seu primeiro desafio: o processo de validação do Google Password Manager requer acesso a um domínio público para verificar o Relying Party (RP). Como o ambiente de teste interno carecia de tal acesso público, a validação falhava. A solução foi criar um ambiente de teste público acessível, incluindo um servidor temporário com um arquivo de declaração de associação de ativos (assetlinks.json) e verificação de domínio.
O exemplo a seguir, do arquivo assetlinks.json do ambiente de teste público do Zoho, demonstra como associar o domínio do RP a um aplicativo Android específico para verificação de passkeys:
[
{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "android_app",
"package_name": "com.zoho.accounts.oneauth",
"sha256_cert_fingerprints": ["SEU_HASH_SHA256_AQUI"]
}
}
]
Integração com Servidores FIDO Existentes
O sistema de passkeys do Android utiliza o padrão moderno FIDO2 WebAuthn, que exige que todas as solicitações usem um formato JSON específico, mantendo a consistência entre aplicativos nativos e plataformas web. Para suportar passkeys no Android, o Zoho realizou ajustes sutis de compatibilidade e estrutura para gerar e processar corretamente as solicitações no formato FIDO2 JSON.
As atualizações do servidor incluíram ajustes técnicos específicos:
- Conversão de Codificação: O servidor converte a codificação Base64 URL (comum no WebAuthn) para Base64 padrão antes de armazenar dados relevantes.
- Formato da Lista de Transporte: A lógica do servidor garante que a lista de mecanismos de transporte (como USB, NFC, Bluetooth) seja formatada como um array JSON para consistência no processamento.
- Alinhamento dos Dados do Cliente: A equipe ajustou a codificação e decodificação do campo
clientDataJsonpara garantir que a estrutura dos dados se alinhe perfeitamente com as expectativas das APIs internas existentes do Zoho.
Orientações ao Usuário e Preferências de Autenticação
Uma parte central da estratégia de passkeys do Zoho é incentivar a adoção, oferecendo flexibilidade para atender às necessidades de diferentes equipes e organizações.
Por meio do painel administrativo do Zoho Directory, os administradores podem tornar as passkeys o método de autenticação padrão obrigatório para toda a organização. Se a organização não habilitar a imposição, os usuários individuais mantêm controle total sobre seu método de login preferido.
Para tornar as passkeys atraentes e fáceis de adotar, o Zoho implementou recursos como:
- Configuração Fácil: A configuração da passkey está integrada diretamente no aplicativo móvel Zoho OneAuth (para Android e iOS).
- Acesso Consistente: O suporte a passkeys está disponível em todos os principais pontos de contato do usuário, incluindo o aplicativo móvel OneAuth e as páginas de conta da web.
Essa abordagem garante que, independentemente da política organizacional, o processo de configuração e uso de passkeys seja acessível e integrado nas plataformas que os usuários já utilizam.
Impacto na Velocidade de Desenvolvimento e Eficiência
O Credential Manager, como API unificada, também aumentou a produtividade dos desenvolvedores. Ele reduziu a complexidade de lidar com múltiplos métodos e APIs de autenticação, encurtando o tempo de integração de meses para semanas e minimizando erros de implementação.
Ao integrar passkeys usando o Credential Manager, o Zoho alcançou melhorias mensuráveis:
- Velocidade Aumentada: Login até 6x mais rápido em comparação com fluxos que exigem nome de usuário, senha e OTP.
- Redução de Custos de Suporte: Diminuição nas solicitações de suporte relacionadas a senhas e no custo de SMS para 2FA.
- Alta Adoção e Segurança Aprimorada: Número de logins via passkey dobrou em 4 meses, com adoção mensal crescente de 31%, protegendo usuários contra phishing e outras vulnerabilidades.
Recomendações e Melhores Práticas
Para uma implementação bem-sucedida de passkeys no Android, os desenvolvedores devem considerar:
- Utilizar o Credential Manager do Android: Simplifica a recuperação de credenciais e unifica o tratamento de senhas, passkeys e login federado.
- Garantir Consistência na Migração: Ao migrar de outras soluções FIDO, assegurar que o formato de entrada/saída dos dados seja consistente.
- Otimizar o Tratamento de Erros: Implementar mecanismos robustos e mensagens de erro localizadas para uma experiência de usuário contínua.
- Educar os Usuários sobre Recuperação: Informar proativamente sobre opções de recuperação para evitar bloqueio de contas.
- Monitorar Métricas: Acompanhar taxas de adoção, sucesso de login e feedback do usuário para otimizar continuamente a experiência.
A combinação de passkeys com a API Credential Manager do Android oferece uma solução de autenticação poderosa e unificada, aprimorando a segurança enquanto simplifica a experiência do usuário.