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
ценность. Но это так, если я правильно понимаю ваш пример.
Поэтому я считаю, что вы имеете дело с полем, которое зарезервировано для будущих целей или других потоков, кроме того, которое вам нужно в данный момент.