Esta página foi traduzida automaticamente. Leia a versão original em inglês aqui.

Cheatsheet de Passkeys. Guias práticos, padrões de implementação e KPIs para programas de passkeys.
Fornecer uma autenticação de usuário segura e simples é essencial para empresas digitais em 2024. As chaves de acesso, como o novo padrão de login, são a solução ideal para atender a essas necessidades. No entanto, a experiência do usuário e a segurança aprimoradas das chaves de acesso para o usuário têm um preço na hora de implementá-las como desenvolvedor. A dificuldade de implementação decorre do fato de que as chaves de acesso são relativamente novas - para os usuários, mas também para os desenvolvedores - e que sua implementação pode ser bastante desafiadora em comparação com a autenticação baseada em senha. Na verdade, você precisa de pelo menos quatro endpoints de API para autenticação por chave de acesso, em comparação com um endpoint de API para autenticação por senha.
Um dos componentes principais no lado do servidor para fornecer autenticação por chave de acesso é o servidor WebAuthn (parte verde da biblioteca). Para um guia abrangente sobre como o servidor WebAuthn se encaixa na integração mais ampla da stack empresarial, consulte nosso artigo dedicado.
Fonte: Yubico
Nesta postagem do blog, comparamos várias bibliotecas/pacotes/SDKs de servidor WebAuthn, analisamos as diferenças e fornecemos uma recomendação para desenvolvedores que são novos na implementação de chaves de acesso.
Artigos recentes
📖
Chaves de acesso no Parallels: testando a autenticação entre dispositivos em uma VM Windows 11 no Mac
⚙️
9 bibliotecas de implementação de servidor WebAuthn comparadas
⚙️
Client Hints e User-Agents no Chrome, Safari e Firefox
⚙️
Guia de consulta rápida de chaves de acesso para desenvolvedores
👤
Como excluir uma chave de acesso na Apple, Windows e Android
Para entender melhor por que uma biblioteca de servidor WebAuthn é necessária em primeiro lugar, vamos ver como as chaves de acesso podem ser implementadas. Em princípio, existem duas maneiras de integrar chaves de acesso em sites e aplicativos:
Embora uma solução de chave de acesso de terceiros seja fácil de integrar e geralmente economize muito tempo de engenharia (especialmente para casos extremos, manutenção, recuperação, fallbacks e UX de chave de acesso aprimorada), alguns desenvolvedores simplesmente preferem implementar tudo por conta própria.
Teste passkeys em uma demo ao vivo.
Vamos dar uma olhada em como funciona a implementação da chave de acesso do tipo faça você mesmo. Em uma configuração muito básica, é necessário um mecanismo para registrar (inscrever-se) e autenticar (login). Ambos os processos, também chamados de cerimônias WebAuthn, são tratados de forma diferente, embora o fluxo geral siga um esquema semelhante:
Como cada processo de inscrição/login envolve essas etapas, o backend precisa acompanhar usuários, chaves de acesso e solicitações de inscrição/login.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studySe você deseja obter um conhecimento mais profundo sobre a maneira como as chaves de acesso funcionam e como é uma implementação simples (sem usar uma solução de chave de acesso de terceiros), você pode investigar nosso artigo do blog aqui.
Em cenários da vida real, ao implementar chaves de acesso por conta própria, lembre-se de que não se trata apenas de fornecer os endpoints de API necessários e a implementação básica para se inscrever e fazer login. Além disso, você precisa abordar os seguintes tópicos e casos de uso:
No entanto, para a implementação básica da chave de acesso, você só precisa aderir ao padrão WebAuthn. Implementar uma biblioteca de servidor WebAuthn conhecida e compatível geralmente é suficiente. A biblioteca gera os parâmetros do servidor WebAuthn e verifica os desafios de login, assumindo essencialmente a parte criptográfica e mais complexa para você.
Participe da nossa comunidade de passkeys para atualizações e suporte.
Todas as bibliotecas de servidor WebAuthn analisadas fornecem as funcionalidades necessárias para oferecer autenticação por chave de acesso. Portanto, prestamos atenção especial aos seguintes critérios:
As seguintes bibliotecas de servidor WebAuthn foram analisadas (ordenadas em número decrescente de estrelas no GitHub em dezembro de 2023):
Veja quantas pessoas realmente usam passkeys.
type UserModel = { id: string; username: string; currentChallenge?: string; }; /** * It is strongly advised that authenticators get their own DB * table, ideally with a foreign key to a specific UserModel. * * "SQL" tags below are suggestions for column data types and * how best to store data received during registration for use * in subsequent authentications. */ type Authenticator = { // SQL: Encode to base64url then store as `TEXT`. Index this column credentialID: Uint8Array; // SQL: Store raw bytes as `BYTEA`/`BLOB`/etc... credentialPublicKey: Uint8Array; // SQL: Consider `BIGINT` since some authenticators return atomic timestamps as counters counter: number; // SQL: `VARCHAR(32)` or similar, longest possible value is currently 12 characters // Ex: 'singleDevice' | 'multiDevice' credentialDeviceType: CredentialDeviceType; // SQL: `BOOL` or whatever similar type is supported credentialBackedUp: boolean; // SQL: `VARCHAR(255)` and store string array as a CSV string // Ex: ['usb' | 'ble' | 'nfc' | 'internal'] transports?: AuthenticatorTransport[]; };
public class StoredCredential { /// <summary> /// The Credential ID of the public key credential source. /// </summary> public byte[] Id { get; set; } /// <summary> /// The credential public key of the public key credential source. /// </summary> public byte[] PublicKey { get; set; } /// <summary> /// The latest value of the signature counter in the authenticator data from any ceremony using the public key credential source. /// </summary> public uint SignCount { get; set; } /// <summary> /// The value returned from getTransports() when the public key credential source was registered. /// </summary> public AuthenticatorTransport[] Transports { get; set; } /// <summary> /// The value of the BE flag when the public key credential source was created. /// </summary> public bool IsBackupEligible { get; set; } /// <summary> /// The latest value of the BS flag in the authenticator data from any ceremony using the public key credential source. /// </summary> public bool IsBackedUp { get; set; } /// <summary> /// The value of the attestationObject attribute when the public key credential source was registered. /// Storing this enables the Relying Party to reference the credent’al's attestation statement at a later time. /// </summary> public byte[] AttestationObject { get; set; } /// <summary> /// The value of the clientDataJSON attribute when the public key credential source was registered. /// Storing this in combination with the above attestationObject item enables the Relying Party to re-verify the attestation signature at a later time. /// </summary> public byte[] AttestationClientDataJson { get; set; } public List<byte[]> DevicePublicKeys { get; set; } public byte[] UserId { get; set; } public PublicKeyCredentialDescriptor Descriptor { get; set; } public byte[] UserHandle { get; set; } public string AttestationFormat { get; set; } public DateTimeOffset RegDate { get; set; } public Guid AaGuid { get; set; } }
<?php declare(strict_types=1); namespace App\Entity; use App\Repository\PublicKeyCredentialSourceRepository; use DateTimeImmutable; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Uid\AbstractUid; use Symfony\Component\Uid\Uuid; use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource; use Webauthn\TrustPath\TrustPath; #[ORM\Table(name: 'pk_credential_sources')] #[ORM\Entity(repositoryClass: PublicKeyCredentialSourceRepository::class)] class PublicKeyCredentialSource extends BasePublicKeyCredentialSource { #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] public readonly DateTimeImmutable $createdAt; #[ORM\Id] #[ORM\Column(type: Types::STRING, length: 255)] #[ORM\GeneratedValue(strategy: 'NONE')] private string $id; public function __construct( string $publicKeyCredentialId, string $type, array $transports, string $attestationType, TrustPath $trustPath, AbstractUid $aaguid, string $credentialPublicKey, string $userHandle, int $counter ) { $this->id = Uuid::v4()->toRfc4122(); $this->createdAt = new DateTimeImmutable(); parent::__construct($publicKeyCredentialId, $type, $transports, $attestationType, $trustPath, $aaguid, $credentialPublicKey, $userHandle, $counter); } public function getId(): string { return $this->id; } }
A tabela a seguir fornece uma visão geral das bibliotecas do servidor WebAuthn:
Assine nosso Substack de passkeys para receber as últimas novidades.
Como a maioria das bibliotecas é igualmente poderosa e implementa o padrão WebAuthn, recomendamos a seguinte árvore de decisão:
Se você quer apenas aprender mais sobre servidores WebAuthn em geral sem ter um projeto específico, podemos fazer algumas recomendações, pois existem algumas diferenças entre as bibliotecas e seus materiais complementares, como documentos e exemplos de implementações. Portanto, para desenvolvedores de software ansiosos para iniciar sua jornada de implementação de chaves de acesso, aconselhamos escolher as seguintes implementações:
Para um entendimento ainda mais profundo de como o WebAuthn funciona no lado do servidor, você pode ler a seção muito detalhada "WebAuthn Relying Party Operations" na RFC do WebAuthn, que detalha cada etapa que precisa ser implementada para o registro de uma nova credencial (7.1) e verificação de uma afirmação de autenticação (7.2).
Avalie as chaves de acesso específicas e os requisitos de WebAuthn que você tem. Nesta postagem do blog, presumimos que você deseja suportar apenas chaves de acesso como credenciais detectáveis (discoverable credentials). Leia sobre as opções PublicKeyCredentialCreationOptions e PublicKeyCredentialRequestOptions, juntamente com as chamadas de API WebAuthn client-side navigator.credentials.create() e navigator.credentials.get(), para definir os parâmetros na configuração do SDK do servidor WebAuthn corretamente para o seu caso de uso.
Para todas as bibliotecas de servidor WebAuthn, você precisará fornecer a estrutura de banco de dados apropriada para persistir / acessar as seguintes informações:
Para algumas bibliotecas, há recomendações e exemplos específicos (se os acharmos úteis, os fornecemos acima). É essencial entender completamente quais campos WebAuthn precisam ser armazenados e onde. Preste atenção especial para identificar qual valor você deseja usar para o User ID (user.id). Temos uma explicação mais detalhada aqui. Leve também em consideração o que acontece quando um usuário exclui uma chave de acesso. Além disso, você pode opcionalmente restringir o uso de determinados autenticadores. Uma lista de autenticadores válidos relacionados a chaves de acesso pode ser encontrada aqui. Caso você também queira oferecer suporte e verificar os atestados (attestations) de chaves de segurança (security keys), essa é uma história totalmente diferente. Você encontra mais informações aqui.
Identifique em quais dispositivos seus usuários usarão chaves de acesso e métodos de autenticação de fallback. Caso você não tenha certeza sobre quais dispositivos, navegadores e sistemas operacionais seus usuários usam, confira o State of Passkeys para obter os dados mais recentes sobre a prontidão de chaves de acesso em plataformas, navegadores e sistemas operacionais. Se você tiver perguntas específicas sobre a adoção de chaves de acesso e a participação da prontidão para chaves de acesso em determinados dispositivos, sinta-se à vontade para entrar em contato conosco. Teremos o maior prazer em fornecer mais insights e ajudá-lo com este tópico (veja também nossa última postagem no blog sobre prontidão para chaves de acesso). Do ponto de vista da observabilidade, mantenha as falhas de WebAuthn do lado do cliente e as rejeições de verificação do servidor como fluxos separados; para definições de buckets do lado do cliente, use os erros de WebAuthn. Além disso, você deve ter em mente que, para o Windows 10 e o Linux, precisará criar soluções dedicadas, pois esses sistemas operacionais fornecem o menor (se houver) suporte a chaves de acesso.
Veja quantas pessoas realmente usam passkeys.
Para quase todas as linguagens ou frameworks existentes, já existe uma biblioteca de servidor WebAuthn bem estabelecida hoje. Comparar bibliotecas de diferentes linguagens não mostra uma superioridade clara de certas implementações. Em vez disso, você deve usar o framework / linguagem de programação com os quais está mais familiarizado. Alternativamente, se você não quer implementar o WebAuthn sozinho e cuidar de todas as coisas que vêm com isso, você pode tentar uma solução de autenticação de chave de acesso pré-construída dedicada como o Corbado. Colocando-se como uma solução de autenticação completa centrada na chave de acesso, ele vem com grande inteligência de chaves de acesso, gerenciamento de sessão, bem como métodos de autenticação de fallback, para que você possa se concentrar no desenvolvimento do seu produto e deixar de se preocupar com a autenticação. Você pode testá-lo gratuitamente com usuários ilimitados aqui.
Corbado é a Authentication Intelligence Platform para times de CIAM que rodam autenticação consumer em escala. Mostramos o que logs de IDP e ferramentas genéricas de analytics não enxergam: quais dispositivos, versões de SO, navegadores e gerenciadores de credenciais suportam passkeys, por que os registros não viram logins, onde o fluxo WebAuthn falha e quando uma atualização de SO ou navegador quebra silenciosamente o login — tudo sem substituir Okta, Auth0, Ping, Cognito ou seu IDP interno. Dois produtos: Corbado Observe adiciona observabilidade para passkeys e qualquer outro método de login. Corbado Connect entrega passkeys gerenciados com analytics integrado (junto ao seu IDP). VicRoads roda passkeys para mais de 5M de usuários com Corbado (+80% de ativação de passkey). Fale com um especialista em Passkeys →
Primeiro verifique se existe uma biblioteca para o seu framework específico, e depois para a sua linguagem de programação. Como todas as bibliotecas listadas implementam o padrão WebAuthn igualmente, a escolha deve priorizar a familiaridade com sua stack existente em vez de diferenças de recursos entre as bibliotecas.
No mínimo, você deve persistir credenciais, usuários, desafios e autenticadores. Preste muita atenção a qual valor você atribui como o ID do usuário (userHandle), e planeje para cenários em que os usuários podem excluir uma chave de acesso de seu dispositivo.
As bibliotecas de servidor WebAuthn lidam com as operações criptográficas mais complexas: gerando parâmetros PublicKeyCredentialCreationOptions e PublicKeyCredentialRequestOptions e verificando desafios assinados. Fazer isso corretamente do zero é significativamente mais difícil do que usar uma biblioteca compatível com FIDO que já foi testada e auditada.
O Windows 10 e o Linux fornecem o menor suporte para chaves de acesso, portanto, são necessárias soluções de fallback dedicadas para usuários nessas plataformas. Monitorar falhas do lado do cliente do WebAuthn e rejeições de verificação do servidor como fluxos separados ajuda a identificar problemas específicos do sistema operacional em produção.
Veja como a Corbado se encaixa na sua implementação de passkeys e no stack de autenticação atual.
Explorar a Console
Artigos relacionados
Índice