O WebAuthn4J verifica as respostas de registro e de autenticação — declarações de atestado de todos os formatos, chaves COSE, flags, contadores e assinaturas — e deixa a montagem das opções a cargo da parte confiável. O Spring Security e o Keycloak o usam internamente. A versão 0.31.11 depende do Jackson 3 (tools.jackson.*), o que importa quando sua aplicação ainda usa o com.fasterxml.jackson do Jackson 2 para o próprio JSON, e a API da biblioteca traz anotações @NotNull da JetBrains: compilar com o launcher java de arquivo único falhou enquanto org.jetbrains:annotations não estava no classpath.
Não existe uma política padrão de verificação do usuário que você possa esquecer: RegistrationParameters e AuthenticationParameters recebem userVerificationRequired e userPresenceRequired como argumentos obrigatórios. No teste, um registro e uma asserção com a flag UV desligada foram verificados quando se passou false e falharam com UserNotVerifiedException quando se passou true. Mantenha o valor coerente com o userVerification que você envia nas opções, como mostra o exemplo.
As assinaturas precisam estar em ASN.1 DER: uma assinatura de asserção r‖s bruta de 64 bytes falhou com BadSignatureException: Assertion signature is not valid., e uma assinatura DER high-S foi verificada. Um contador menor que o armazenado faz o login falhar com MaliciousCounterValueException: Malicious counter value is detected. Cloned authenticators exist in parallel., enquanto um contador que sempre foi 0, como informam as chaves de acesso sincronizadas, passa. Credenciais Ed25519 foram verificadas de ponta a ponta.
createNonStrictWebAuthnManager() aceita qualquer declaração de atestado sem conferi-la com âncoras de confiança, o que é correto quando você pede o atestado none e errado quando o atestado é uma decisão de política; nesse caso, configure âncoras de confiança e use um gerenciador estrito.
O inspetor de WebAuthn decodifica o que os navegadores enviam, e a consulta de AAGUID identifica modelos de autenticador para políticas de atestado.