Análise detalhada de userverification

Este documento discute o que userVerification é no WebAuthn e os comportamentos do navegador que ocorrem quando userVerification é especificado durante a criação ou autenticação da chave de acesso.

O que é a "verificação de usuário" no WebAuthn?

As chaves de acesso são criadas com base na criptografia de chave pública. Ao criar uma chave de acesso, um par de chaves públicas/privadas é gerado, a privada é armazenada pelo provedor da chave de acesso e a chave pública é retornada ao servidor da parte confiável (RP) para armazenamento. O servidor pode autenticar um usuário verificando uma assinatura assinada pela mesma chave de acesso usando a chave pública pareada. O "usuário presente" (UP) em uma credencial de chave pública prova que alguém interagiu com o dispositivo durante a autenticação.

A verificação do usuário é uma camada opcional de segurança que busca declarar que a pessoa correta estava presente durante a autenticação, não apenas uma pessoa, como declara a presença do usuário. Em smartphones, isso geralmente é feito com um mecanismo de bloqueio de tela, seja ele biométrico, PIN ou senha. Se a verificação do usuário foi realizada, isso é informado no "UV" flag que é retornada nos dados do autenticador durante o registro e a autenticação da chave de acesso

Captura de tela de uma caixa de diálogo de verificação do usuário nas Chaves do iCloud no macOS. A caixa de diálogo solicita que o usuário faça login usando o Touch ID, exibindo a origem da solicitação de autenticação e o nome de usuário. No canto superior direito da caixa de diálogo, há o botão "Cancelar".
Caixa de diálogo de verificação do usuário nas Chaves do iCloud no macOS.
.
Captura de tela de uma caixa de diálogo de verificação de usuário no Chrome para Android. A caixa de diálogo solicita que o usuário verifique a identidade usando reconhecimento facial ou detecção de impressão digital e mostra a origem que solicita a autenticação. No canto inferior esquerdo, há uma opção para fazer a verificação usando um PIN.
Caixa de diálogo de verificação do usuário no Chrome para Android.

Como UP e UV são validados no servidor

As sinalizações de presença do usuário (UP) e booleanas (UV) são sinalizadas para o servidor no campo de dados do autenticador. Durante a autenticação, o conteúdo do campo de dados do autenticador pode ser validado verificando a assinatura usando a chave pública armazenada. Se a assinatura for válida, o servidor poderá considerar as sinalizações verdadeiras.

Uma representação da estrutura de dados de autenticação. Da esquerda para a direita, cada seção da estrutura de dados mostra "RP ID HASH" (32 bytes), "FLAGS" (1 byte), "COUNTER" (4 bytes, big-endian uint32), 'ATTESTE CRED. DADOS (comprimento variável, se houver) e "EXTENSÕES" (comprimento variável se presente (CBOR)). As "FLAGS" é expandida para mostrar uma lista de possíveis sinalizações, identificadas da esquerda para a direita: "ED", "AT", "0", "BS", "BE", "UV", "0" e "UP".
Campos de dados do Authenticator em uma credencial de chave pública.

No registro e na autenticação da chave de acesso, o servidor precisa examinar se a flag UP é true e se a flag UV é true ou false, dependendo do requisito.

Como especificar o parâmetro userVerification

De acordo com a especificação da WebAuthn, a parte restrita pode solicitar uma verificação do usuário com um parâmetro userVerification na criação e na declaração de credenciais. Ele aceita 'preferred', 'required' ou 'discouraged', o que significa, respectivamente:

  • 'preferred' (padrão): é preferível usar um método de verificação do usuário no dispositivo, mas ele poderá ser ignorado se não estiver disponível. A credencial de resposta vai conter um valor de sinalização UV de true se a verificação do usuário tiver sido realizada e false se a verificação não tiver sido realizada.
  • 'required': é necessário invocar um método de verificação do usuário disponível no dispositivo. Se não houver uma disponível, a solicitação falhará localmente. Isso significa que a credencial de resposta sempre retorna com a sinalização UV definida como true.
  • 'discouraged': o uso de um método de verificação do usuário não é recomendado. No entanto, dependendo do dispositivo, a verificação do usuário poderá ser realizada mesmo assim, e a sinalização UV poderá conter true ou false.

Exemplo de código para criação de chaves de acesso:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

Exemplo de código para autenticação da chave de acesso:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

Qual opção você deve escolher para userVerification?

O valor userVerification que você precisa usar depende dos requisitos do seu aplicativo e das necessidades de experiência do usuário.

Quando usar userVerification='preferred'

Use userVerification='preferred' se você priorizar a experiência do usuário em vez da proteção.

Há ambientes em que a verificação do usuário tem mais atrito do que a proteção. Por exemplo, no macOS em que o Touch ID não está disponível (porque o dispositivo não tem suporte, está desativado ou o dispositivo está no modo flip), o usuário precisa digitar a senha do sistema. Isso causa atrito e o usuário pode abandonar a autenticação por completo. Se a eliminação do atrito for mais importante para você, use userVerification='preferred'.

Uma captura de tela de uma caixa de diálogo de chave de acesso no macOS que aparece quando o Touch ID não está disponível. A caixa de diálogo contém informações como a origem da solicitação de autenticação e o nome de usuário. No canto superior direito da caixa de diálogo, há o botão "Cancelar".
Uma caixa de diálogo de chave de acesso exibida no macOS quando o Touch ID não está disponível.

Com userVerification='preferred', a sinalização UV será true se a verificação do usuário for realizada e false se ela for ignorada. Por exemplo, no macOS em que o Touch ID não está disponível, ele pede que o usuário clique em um botão para pular a verificação do usuário, e a credencial de chave pública inclui uma sinalização UV false.

Dessa forma, a sinalização UV poderá ser um sinal na sua análise de risco. Se a tentativa de login parecer arriscada devido a outros fatores, apresente outros desafios de login ao usuário caso a verificação não tenha sido realizada.

Quando usar userVerification='required'

Use userVerification='required' se você achar que UP e UV são absolutamente necessários.

Uma desvantagem dessa opção é que o usuário pode ter mais atrito ao fazer login. Por exemplo, no macOS em que o Touch ID não está disponível, o usuário precisa digitar a senha do sistema.

Com userVerification='required', é possível garantir que a verificação do usuário seja realizada no dispositivo. Verificar se o servidor verifica se a sinalização UV é true.

Conclusão

Ao usar a verificação do usuário, as partes que dependem da chave de acesso podem avaliar a probabilidade de o proprietário do dispositivo fazer login. O cliente decide se quer exigir a verificação do usuário ou torná-la opcional, dependendo da importância do mecanismo de login substituto no fluxo do usuário. Verifique se o servidor verifica as sinalizações UP e UV para a autenticação do usuário da chave de acesso.