YubiKey + Webauth: userHandle всегда имеет значение null

Когда я проверяю подлинность с помощью WebAuthn и своего YubiKey, свойство response.userHandle всегда имеет значение null. Это идентификатор пользователя и displayName, с которыми я зарегистрировал учетные данные, не возвращается. Это из-за того, что я что-то делаю неправильно во время процесса регистрации / аутентификации:

async function register() {
  const publicKeyCredentialCreationOptions = {
    challenge: Uint8Array.from("this-is-a-test", (c) => c.charCodeAt(0)),
    rp: {
      name: "Webauthn Test",
      id: "localhost",
    },
    user: {
      id: Uint8Array.from("a1b2c3d4e5f6", (c) => c.charCodeAt(0)),
      name: "just-a-test",
      displayName: "MrUser",
    },
    pubKeyCredParams: [{ alg: -7, type: "public-key" }],
    authenticatorSelection: {
      authenticatorAttachment: "cross-platform",
    },
    timeout: 60000,
    attestation: "direct",
  };

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

Это код, который я использую для аутентификации:

async function authenticate() {
  const publicKeyCredentialRequestOptions = {
    challenge: Uint8Array.from("test", (c) => c.charCodeAt(0)),
    allowCredentials: [
      {
        id: credentialId,
        type: "public-key",
        transports: ["usb", "ble", "nfc"],
      },
    ],
    timeout: 60000,
  };

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

  console.log(assertion);
}

В итоге я получаю:

{
  rawId: ArrayBuffer(64),
  id: "U-nitqhlORmmdltp7TLO3i18KNoWsSebFyrtc3OIRvcktvwlz-dJZCA1_1gxXrNHzqReU7xGAHdfVP75N2aJSw", 
  response: {
    authenticatorData: ArrayBuffer(37) {}
    clientDataJSON: ArrayBuffer(101) {}
    signature: ArrayBuffer(71) {}
    userHandle: null
  }
  type: "public-key"
}

As you can see: userHandle is null.  Can anyone tell me why?

2 ответа

Решение

В userHandle может иметь значение NULL в зависимости от того, какой тип учетных данных WebAuthn запрашивала проверяющая сторона.

Поведение WebAuthn по умолчанию создает учетные данные, недоступные для обнаружения, и userHandleвозвращенный в утверждении будет нулевым. В аутентификаторе для этого типа учетных данных не хранятся данные, поэтому возвращать нечего.

Чтобы создать открываемые учетные данные на стороне клиента WebAuthn, также называемые резидентным ключом, необходимо установить requireResidentKey член true. Это сохранит учетные данные на аутентификаторе и вернетuserHandleв утверждении. Обратитесь к AuthenticatorSelectionCriteria в спецификации W3C WebAuthn для получения подробной информации.

Вот пример:

authenticatorSelection: {
  authenticatorAttachment: "cross-platform",
  requireResidentKey: true
},

См . Руководство Yubico WebAuthn Dev, чтобы узнать больше о резидентных ключах и userHandle.

Я пытался понять, с чем вы имеете дело. Я поиграл с https://u2f.bin.coffee/, чтобы почувствовать поток данных. В результате аутентификации я получил такой ответ:

Got response:
{
  "keyHandle": "F74UNCdNv1d43zw7hqxYgkjR3O6dcevopiSb3jrcB3rMFRUM486LbsVExJD0R3ESC5MCb3zeFGdxvS3ksZ7sCA",
  "clientData": "eyJ0eXAiOiJuYXZpZ2F0b3IuaWQuZ2V0QXNzZXJ0aW9uIiwiY2hhbGxlbmdlIjoiTXpPTjhXRHpvSDlhZHU0bTk5YWF0ZyIsIm9yaWdpbiI6Imh0dHBzOi8vdTJmLmJpbi5jb2ZmZWUiLCJjcm9zc09yaWdpbiI6ZmFsc2UsImV4dHJhX2tleXNfbWF5X2JlX2FkZGVkX2hlcmUiOiJkbyBub3QgY29tcGFyZSBjbGllbnREYXRhSlNPTiBhZ2FpbnN0IGEgdGVtcGxhdGUuIFNlZSBodHRwczovL2dvby5nbC95YWJQZXgifQ",
  "signatureData": "AQAAAAUwRAIgEqi5POKKUraU97W3vbfn34DSWqXwiZwEi5g9QPPtS6MCIBbLYW1_b3aRjHQivSRZQUAfBobx6CZnQ0_VVvuu1LJJ"
}

Теперь я предполагаю keyHandle вот твой authenticatorData, то clientData вот твой clientDataJSON и это signatureData твой signature. Что бы это ни былоuserHandle если вы пропали, это не кажется обязательным.

Посмотрите и на эту картинку:

Если userHandle были handle, аутентификация не будет работать с nullценность. Но это так, если я правильно понимаю ваш пример.

Поэтому я считаю, что вы имеете дело с полем, которое зарезервировано для будущих целей или других потоков, кроме того, которое вам нужно в данный момент.

Другие вопросы по тегам