Otimizando a Autenticação no Android com Passkeys e Credential Manager

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:

  1. 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.
  2. 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.
  3. Alinhamento dos Dados do Cliente: A equipe ajustou a codificação e decodificação do campo clientDataJson para 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.

Tags: passkeys android Credential Manager FIDO2 WebAuthn

Publicado em 7-29 22:00