---
url: 'https://www.corbado.com/pt/blog/implementacao-servidor-webauthn'
title: '9 bibliotecas de implementação de servidor WebAuthn comparadas'
description: 'Esta postagem ajuda você a encontrar a biblioteca de servidor WebAuthn certa para oferecer chaves de acesso. 9 bibliotecas são comparadas e uma estratégia é apresentada.'
lang: 'pt'
author: 'Nicolai'
date: '2026-07-27T08:26:41.818Z'
lastModified: '2026-07-27T08:27:38.228Z'
keywords: 'implementação de servidor webauthn, biblioteca de servidor webauthn, passkeys, chaves de acesso, fido2, autenticação'
category: 'Passkeys Implementation'
---

# 9 bibliotecas de implementação de servidor WebAuthn comparadas

## Key Facts

- **SimpleWebAuthn** (TypeScript, 1.000 estrelas no GitHub) é classificada como a mais intuitiva e oferece de forma exclusiva uma biblioteca de servidor e uma biblioteca de navegador frontend para a implementação de chaves de acesso.
- A autenticação por chave de acesso requer pelo menos **quatro endpoints de API de backend** em comparação com um para autenticação por senha, tornando uma biblioteca de servidor WebAuthn essencial para lidar com a complexidade criptográfica.
- **py_webauthn** (Python) é ideal para testes rápidos: as opções de autenticação são geradas com uma única chamada de método e não requerem configuração de framework.
- **webauthn-framework** (PHP/Symfony, 347 estrelas) fornece a documentação conceitual mais extensa, sendo a melhor opção para desenvolvedores que estão aprendendo os fundamentos das chaves de acesso do zero.
- Quando nenhuma biblioteca corresponder à sua linguagem, **go-webauthn** ou SimpleWebAuthn são os fallbacks recomendados devido à mais ampla adoção em projetos comerciais e de código aberto.

## 1. Introdução: implementação do servidor WebAuthn

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.

![Arquitetura do servidor WebAuthn](https://www.corbado.com/website-assets/657d793ffb87095054194ebb_webauthn_server_architecture_e9ba5ad00c.png)_Fonte:
[Yubico](https://developers.yubico.com/java-webauthn-server/)_

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.

## 2. Como posso implementar chaves de acesso por conta própria?

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:

1. Usar uma solução de chaves de acesso de terceiros (por exemplo, Corbado)
2. Implementar chaves de acesso por conta própria usando uma das bibliotecas de servidor WebAuthn abaixo

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.

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:

1. O **frontend (o navegador) inicia** uma solicitação de inscrição ou login e **chama um endpoint da API do backend**.
2. O **backend gera os parâmetros** de inscrição ou login do **WebAuthn**. Eles são chamados de PublicKeyCredentialCreationOptions e PublicKeyCredentialRequestOptions, respectivamente. Uma das partes mais importantes desses parâmetros WebAuthn é o desafio (challenge). Os parâmetros WebAuthn são então **enviados de volta ao frontend**.
3. O **frontend** recebe esses parâmetros WebAuthn e os utiliza para **verificar a identidade do usuário** usando o sistema de autenticação do dispositivo local (por exemplo, via Face ID, Touch ID, Windows Hello). Em processos de inscrição, um novo par de chaves pública-privada é criado, a chave privada é armazenada localmente, enquanto a chave pública é enviada ao servidor. Em processos de login, o **desafio é assinado** usando a chave privada da chave de acesso e enviado para outro endpoint da API do backend.
4. Nos processos de inscrição, o backend **recebe a chave pública** e a armazena. Em logins, o backend **recebe o desafio assinado e verifica sua integridade** usando o servidor WebAuthn.

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.

Se 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](http://ttps://www.corbado.com/blog/passkey-tutorial-how-to-implement-passkeys).

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:

- Gerenciamento de dispositivos
- Fluxos de login entre plataformas e entre dispositivos
- Gerenciamento de usuários
- Gerenciamento de sessões
- Detecção de dispositivo pronto para chaves de acesso
- Educação do usuário
- Opções de autenticação de fallback
- Mecanismos de recuperação
- Opções de compartilhamento de conta
- Fluxos de criação de chave de acesso otimizados e fluxos de login com chave de acesso para alta adoção

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ê.

## 3. Bibliotecas de backend de servidor WebAuthn: uma comparação

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:

- **Critérios de seleção do autenticador:** Como você pode definir preferências para determinados comportamentos e recursos de segurança (por exemplo, forçar a criação de resident keys)?
- **Configurações globais:** O quanto você pode centralizar a configuração necessária?
- **Documentação:** Quão bem a biblioteca de servidor WebAuthn está documentada e fácil de seguir?
- **Exemplos:** Existem exemplos de implementação que você possa tomar como referência?

As seguintes bibliotecas de servidor WebAuthn foram analisadas (ordenadas em número decrescente de estrelas no GitHub em dezembro de 2023):

### 3.1 TypeScript: SimpleWebAuthn

![SimpleWebAuthn](https://www.corbado.com/website-assets/657d796db359dbc15ca87b17_webauthn_server_simplewebauthn_458503b246.png)

- **Linguagem de programação:** TypeScript
- **Framework:** Node.js
- **Autor:** Matthew Miller (Duo Security / Cisco)
- **Estrelas:** 1000
- **Utilizado por:** 781
- **Contribuidores:** 19
- **Conformidade FIDO:** Sim
- **Configurações globais:** Não
- **Critérios de seleção do autenticador:** Conforme [sugerido pela W3C](https://www.w3.org/TR/webauthn-2/#dictionary-authenticatorSelection) (deve conter as variáveis authenticatorAttachment, residentKey, requireResidentKey e userVerification, que também são explicadas na página da W3C)
- **Documentação:** Muito bem estruturada, com foco em configuração rápida e facilidade de uso, inclui conhecimento sobre chaves de acesso, por exemplo, explica o que são as chaves de acesso e como funcionam
- **Exemplos:** Projeto de exemplo disponível nos [docs](https://simplewebauthn.dev/docs/advanced/example-project)
- **Estruturas de dados recomendadas:**

```json
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[];
};
```

- **Outras características:** Ótimo [Depurador WebAuthn para respostas WebAuthn](https://debugger.simplewebauthn.dev/) e não oferece apenas uma biblioteca de backend/servidor, mas também uma biblioteca para o frontend (basicamente envolvendo algumas das APIs de Web Authentication do cliente)
- **Avaliação pessoal:** A configuração mais intuitiva vista até agora e muito direta. Além disso, é uma das poucas bibliotecas que também oferece uma biblioteca de navegador para ajudar com implementações de cliente, o que a torna bastante notável. O autor da biblioteca é muito ativo na comunidade WebAuthn / chaves de acesso.
- **Link do GitHub:** [https://github.com/MasterKale/SimpleWebAuthn](https://github.com/MasterKale/SimpleWebAuthn)

![Captura de tela do SimpleWebAuthn](https://www.corbado.com/website-assets/657d797be263ba3262fff816_webauthn_server_simplewebauthn_screenshot_527317d6be.png)

### 3.2 .NET: fido2-net-lib

![fido2-net-lib](https://www.corbado.com/website-assets/657d79968cef2987ff7c9c21_webauthn_server_fido2_net_lib_6727019f82.png)

- **Linguagem de programação:** C#
- **Framework:** .NET
- **Autores:** Anders Åberg, Alex Seigler
- **Estrelas:** 962
- **Utilizado por:** 200
- **Contribuidores:** 40
- **Conformidade FIDO:** Sim
- **Configurações globais:** Sim
- **Critérios de seleção do autenticador:** Conforme sugerido pela W3C
- **Documentação:** Apenas o Readme com alguns exemplos, alguma [inteligência de chaves de acesso](https://docs.corbado.com/corbado-connect/features/passkey-intelligence) no [site](https://fido2-net-lib.passwordless.dev/) da biblioteca
- **Exemplos:** Controlador de demonstração e repositório de credenciais de exemplo disponíveis para mostrar um exemplo de integração
- **Estrutura de dados recomendada:**

```json
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; }
}
```

- **Outras características:** Utilizado pela Bitwarden (a startup passwordless.dev foi adquirida pela Bitwarden)
- **Avaliação pessoal:** Biblioteca amigável para desenvolvedores com uma boa quantidade de material complementar
- **Link do GitHub:** [https://github.com/passwordless-lib/fido2-net-lib](https://github.com/passwordless-lib/fido2-net-lib)

![Captura de tela do fido2-net-lib](https://www.corbado.com/website-assets/657d79aefc6fa186be1a722e_webauthn_server_fido2_net_lib_screenshot_a624ecd3d2.png)

### 3.3 Python: py_webauthn

![py_webauthn](https://www.corbado.com/website-assets/657d79c9b1ac103f4c903ec1_webauthn_server_py_webauthn_416b6eae90.jpg)

- **Linguagem de programação:** Python
- **Framework:** nenhum específico
- **Autor:** Duo Labs
- **Estrelas:** 727
- **Utilizado por:** 912
- **Contribuidores:** 23
- **Conformidade FIDO:** N/A
- **Configurações globais:** Não
- **Critérios de seleção do autenticador:** Conforme sugerido pela W3C
- **Documentação:** Pouca a nenhuma, conhecimento prévio de chaves de acesso é necessário
- **Exemplos:** Pequenos trechos de código para inscrição e login estão incluídos
- **Estrutura de dados recomendada:** N/A
- **Outras características:** Requer Python >= 3.8
- **Avaliação pessoal:** Biblioteca comparativamente compacta com pouca quantidade de arquivos, você pode obter uma visão geral em pouco tempo.
- **Link do GitHub:** [https://github.com/duo-labs/py_webauthn](https://github.com/duo-labs/py_webauthn)

![Captura de tela do py_webauthn](https://www.corbado.com/website-assets/657d79da1eee1bef26c8ef4b_webauthn_server_py_webauthn_screenshot_5292be32e1.png)

### 3.4 Ruby: webauthn-ruby

![webauthn-ruby](https://www.corbado.com/website-assets/657d79ef3b5153896eb8fd4c_webauthn_server_webauthn_ruby_4fc3b288bd.png)

- **Linguagem de programação:** Ruby
- **Framework:** Ruby on Rails
- **Autor:** Cedarcode
- **Estrelas:** 580
- **Utilizado por:** 679
- **Downloads do Gem:** 18 milhões
- **Contribuidores:** 27
- **Conformidade FIDO:** Sim
- **Configurações globais:** Sim
- **Critérios de seleção do autenticador:** Conforme sugerido pela W3C
- **Documentação:** O Readme é a única fonte de documentação
- **Exemplos:** N/A
- **Estrutura de dados recomendada:** N/A
- **Outras características:** Wrappers para esta biblioteca também estão disponíveis ([warden-webauthn](https://github.com/ruby-passkeys/warden-webauthn), [devise-passkeys](https://github.com/ruby-passkeys/devise-passkeys))
- **Avaliação pessoal:** Como o material complementar é bastante limitado, recomendaríamos esta biblioteca apenas se você estiver familiarizado com Ruby e chaves de acesso
- **Link do GitHub:** [https://github.com/cedarcode/webauthn-ruby](https://github.com/cedarcode/webauthn-ruby)

![Captura de tela do webauthn-ruby](https://www.corbado.com/website-assets/657d79fd54838aafd2274e4e_webauthn_server_webauthn_ruby_screenshot_7fb391a360.png)

### 3.5 Go: go-webauthn

![go-webauthn](https://www.corbado.com/website-assets/657d7a13b1ac103f4c908c60_webauthn_server_go_webauthn_f4f8db52ec.png)

- **Linguagem de programação:** Go
- **Framework:** Frameworks baseados em Go, como Gin, Echo,...
- **Autor:** Originalmente por Duo Labs / continuado por James Elliott
- **Estrelas:** 480
- **Utilizado por:** 280
- **Contribuidores:** 18
- **Conformidade FIDO:** Sim
- **Configurações globais:** Sim
- **Critérios de seleção do autenticador:** Conforme sugerido pela W3C
- **Documentação:** O Readme com alguns exemplos é a única fonte de documentação
- **Exemplos:** [Repositório de exemplo](https://github.com/ruby-passkeys/devise-passkeys) disponível
- **Estrutura de dados recomendada:** N/A
- **Outras características:** Grande número de arquivos, ter uma visão geral leva algum tempo
- **Avaliação pessoal:** Biblioteca popular que é fácil de usar depois que você se familiariza com ela, no entanto, recomendamos adquirir algum conhecimento sobre chaves de acesso (como elas funcionam, como são os procedimentos, etc.) com antecedência.
- **Link do GitHub:** [https://github.com/go-webauthn/webauthn](https://github.com/go-webauthn/webauthn)

![Captura de tela do go-webauthn](https://www.corbado.com/website-assets/657d7a266276ea8bd12bb480_webauthn_server_go_webauthn_screenshot_4bf908cdfd.png)

### 3.6 Java: java-webauthn-server

![java-webauthn-server](https://www.corbado.com/website-assets/657d7a49ac1b2446296c4e2b_webauthn_server_java_webauthn_server_368503276e.png)

- **Linguagem de programação:** Java
- **Framework:** Maven / Gradle
- **Autor:** Yubico
- **Estrelas:** 391
- **Utilizado por:** N/A
- **Contribuidores:** 27
- **Conformidade FIDO:** N/A
- **Configurações globais:** Sim
- **Critérios de seleção do autenticador:** Conforme sugerido pela W3C.
- **Documentação:** O Readme é a única documentação, mas bastante detalhada
- **Exemplos:** N/A
- **Estrutura de dados recomendada:** N/A
- **Outras características:** Vem com uma interface de repositório de credenciais, fornecendo orientação clara sobre os métodos de recuperação de banco de dados necessários.
- **Avaliação pessoal:** Embora você precise gerenciar o banco de dados por conta própria, o repositório de credenciais ajuda significativamente no processo de design do banco de dados. Naturalmente, as implementações Java vêm com um grande número de arquivos, pois cada atributo precisa de uma classe que normalmente é armazenada em seu próprio arquivo. Isso torna a obtenção de uma visão geral uma tarefa mais demorada.
- **Link do GitHub:** [https://github.com/Yubico/java-webauthn-server](https://github.com/Yubico/java-webauthn-server)

![Captura de tela do java-webauthn-server](https://www.corbado.com/website-assets/657d7a5aeac136d96d1bb459_webauthn_server_java_webauthn_server_screenshot_0cc89ca1ab.png)

### 3.7 Rust: webauthn-rs

![webauthn-rs](https://www.corbado.com/website-assets/657d7a6dd61bd50a76f5d9ca_webauthn_server_webauthn_rs_1be32ca83b.png)

- **Linguagem de programação:** Rust
- **Framework:** Baseado em Rust (Rocket, Axum, ...)
- **Autor:** Kanidm Identity Management Project
- **Estrelas:** 351
- **Utilizado por:** 617
- **Contribuidores:** 25
- **Conformidade FIDO:** N/A
- **Configurações globais:** Sim
- **Critérios de seleção do autenticador:** Possibilidades de configuração muito limitadas. As outras bibliotecas são implementadas exatamente de acordo com o Padrão W3C, exibindo maior capacidade de configuração
- **Documentação:** Existe uma documentação técnica gerada automaticamente, mas não muito detalhada
- **Exemplos:** [Repositório de tutorial](https://github.com/kanidm/webauthn-rs/tree/master/tutorial) com exemplos para 3 web frameworks diferentes está disponível
- **Estrutura de dados recomendada:** N/A
- **Outras características:** A biblioteca foi aprovada em uma auditoria de segurança executada pela segurança de produto da SUSE.
- **Avaliação pessoal:** Devido à configurabilidade e documentação limitadas, recomendaríamos esta biblioteca apenas se o seu framework principal for baseado em Rust e você souber como as chaves de acesso funcionam
- **Link do GitHub:** [https://github.com/kanidm/webauthn-rs](https://github.com/kanidm/webauthn-rs)

![Captura de tela do webauthn-rs](https://www.corbado.com/website-assets/657d7a7db359dbc15ca91760_webauthn_server_webauthn_rs_screenshot_cc92cc955d.png)

### 3.8 PHP: webauthn-framework

![webauthn-framework](https://www.corbado.com/website-assets/657d7bd762d48bffd4a9b34d_webauthn_server_webauthn_framework_07cf99330e.png)

- **Linguagem de programação:** PHP
- **Framework:** Symfony
- **Autor:** Florent Morselli
- **Estrelas:** 347
- **Utilizado por:** N/A
- **Contribuidores:** 18
- **Conformidade FIDO:** Sim
- **Configurações globais:** Sim
- **Critérios de seleção do autenticador:** Conforme sugerido pela W3C.
- **Documentação:** Documentação extensa, incluindo detalhes técnicos, mas também explicando as chaves de acesso desde o início
- **Exemplos:** [Repositório de exemplo](https://github.com/web-auth/symfony-webauthn-demo) disponível
- **Estrutura de dados recomendada:**

```php
<?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;
    }
}
```

- **Outras características:** N/A
- **Avaliação pessoal:** Bom para pessoas que desejam entrar no mundo das chaves de acesso, mas não têm conhecimento prévio
- **Link do GitHub:** [https://github.com/web-auth/webauthn-framework](https://github.com/web-auth/webauthn-framework)

![Captura de tela do webauthn-framework](https://www.corbado.com/website-assets/657d7be96276ea8bd12cb5fd_webauthn_server_webauthn_framework_screenshot_9c1e9a3dd8.png)

### 3.9 Java: webauthn4j

![webauthn4j](https://www.corbado.com/website-assets/657d7c00fe6a1b80f0f03fd6_webauthn_server_webauthn4j_d8c4d2a9de.png)

- **Linguagem de programação:** Java
- **Framework:** Maven
- **Autor:** WebAuthn4j
- **Estrelas:** 342
- **Utilizado por:** N/A
- **Contribuidores:** 19
- **Conformidade FIDO:** Sim
- **Configurações globais:** Sim
- **Critérios de seleção do autenticador:** Em vez do parâmetro UserVerificationRequirement sugerido pela W3C com valores desencorajados, preferidos ou exigidos, webauthn4j oferece verificationRequired e userPresenceRequired como variáveis booleanas
- **Documentação:** Documentação seca, mas extensa, com alguns exemplos de código disponíveis
- **Exemplos:** [Repositório de exemplo](https://github.com/webauthn4j/webauthn4j-spring-security) disponível
- **Estrutura de dados recomendada:** N/A
- **Outras características:** N/A
- **Avaliação pessoal:** A leitura da documentação se torna entediante e complexa rapidamente, pois é apenas uma grande página que se concentra exclusivamente na funcionalidade, não no conceito por trás das chaves de acesso.
- **Link do GitHub:** [https://github.com/webauthn4j/webauthn4j](https://github.com/webauthn4j/webauthn4j)

![Captura de tela do webauthn4j](https://www.corbado.com/website-assets/657d7c7fb359dbc15caa2007_webauthn_server_webauthn4j_screenshot_3d7616a5e5.png)

A tabela a seguir fornece uma visão geral das bibliotecas do servidor WebAuthn:

![Visão geral do servidor WebAuthn](https://www.corbado.com/website-assets/657d7c8fffd0b1429fd8d276_webauthn_server_implementation_overview_92a55c2e0f.png)

## 4. Recomendações: navegando pelo cenário de bibliotecas WebAuthn

### 4.1 Etapa 1: escolha sua biblioteca WebAuthn

Como a maioria das bibliotecas é igualmente poderosa e implementa o padrão WebAuthn, recomendamos a seguinte árvore de decisão:

- **Uma biblioteca de servidor WebAuthn em seu framework e linguagem de programação está disponível:** Não listamos as bibliotecas de framework que dependem de uma das bibliotecas acima (por exemplo, existem personalizações de PHP disponíveis para Symfony e Laravel). Caso exista uma implementação de framework, escolha esta, pois permite implementar as chamadas de API WebAuthn nativamente na sua estrutura de framework atual e usar sua abstração de banco de dados para implementar o armazenamento.
- **Uma biblioteca de servidor WebAuthn em sua linguagem de programação está disponível:** Como você precisa de endpoints de API de backend, escolha a biblioteca de servidor WebAuthn na sua linguagem de programação nativa para que ela possa ser incorporada nativamente em seus endpoints de API atuais.
- **Não há nenhuma biblioteca de servidor WebAuthn disponível em sua linguagem de programação:** Nesse caso, você deve considerar o uso de uma solução de chave de acesso gerenciada como o Corbado. Se isso não for uma opção, recomendamos o uso de go-webauthn ou SimpleWebAuthn, pois eles têm a maior adoção, são leves e também são usados por muitos projetos comerciais e de código aberto.

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 testes rápidos:** O pacote _py_webauthn_ oferece implementação instantânea com [trechos de código](https://github.com/duo-labs/py_webauthn/blob/master/examples/registration.py) prontos para uso. Com apenas uma chamada de método, você pode gerar as opções de que precisa para a autenticação. Como você não precisa incorporar a biblioteca em um framework e configurá-la, ela é ideal para testes rápidos.
- **Para uma implementação intuitiva:** O pacote _SimpleWebAuthn_ escrito em TypeScript é direto e fácil para o desenvolvedor. Assim como o _py_webauthn_, a implementação é muito minimalista, mas vem adicionalmente com documentação que o orienta pelo processo de autenticação. Em contraste com o _py_webauthn_, no entanto, o _SimpleWebAuthn_ não vem com um exemplo claro que seja executado sem modificações.
- **Para uma compreensão profunda:** A biblioteca _webauthn-framework_ para PHP se destaca por sua [documentação](http://Link) extensa e estruturada, com foco em conceitos de chaves de acesso. As principais diferenças em relação a outras bibliotecas com uma boa quantidade de documentação, como _webauthn4j_, são o design e a vivacidade dos documentos.

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 r[egistro de uma nova credencial (7.1)](https://www.w3.org/TR/webauthn-2/#sctn-registering-a-new-credential) e [verificação de uma afirmação de autenticação (7.2)](https://www.w3.org/TR/webauthn-2/#sctn-verifying-assertion).

### 4.2 Etapa 2: defina as opções do seu servidor WebAuthn

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.

### 4.3 Etapa 3: defina a estrutura do banco de dados

Para todas as bibliotecas de servidor WebAuthn, você precisará fornecer a estrutura de banco de dados apropriada para persistir / acessar as seguintes informações:

- Credenciais
- Usuários
- Desafios
- Autenticadores

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](https://github.com/passkeydeveloper/passkey-authenticator-aaguids). 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](https://fidoalliance.org/metadata/).

### 4.4 Etapa 4: teste nos dispositivos de seus usuários

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](https://state-of-passkeys.io/) 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.

## 5. Conclusão

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](https://docs.corbado.com/corbado-connect/features/passkey-intelligence), 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](https://app.corbado.com/signin#register).

## Perguntas frequentes (FAQ)

### Como escolho a biblioteca de servidor WebAuthn certa para o meu projeto?

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.

### Quais dados preciso armazenar no meu banco de dados ao criar um servidor WebAuthn?

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.

### Por que não posso simplesmente implementar a verificação do lado do servidor WebAuthn do zero sem uma biblioteca?

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.

### Quais sistemas operacionais têm o pior suporte para chaves de acesso e precisam de tratamento extra em uma implementação WebAuthn?

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.
