Не могу понять ошибку API WebAuthn из JavaScript

В настоящее время я создаю конечную точку регистрации AJAX для Django, чтобы разрешить аутентификацию FIDO2 (вход с физическим аппаратным ключом). Это взято из следования примеру / документации из официальной библиотеки Python fido2 от Yubico .

Единственные зависимости - cbor.js и js-cookie. На данный момент все серверные части работают, однако я продолжаю получать эту ошибку JavaScript при вызове метода navigator.credentials.create.

TypeError: Failed to execute 'create' on 
'CredentialsContainer': The provided value is not of 
type '(ArrayBuffer or ArrayBufferView)'

Код:

var csrftoken = Cookies.get('csrftoken');
fetch('/register/begin', {
    method: 'POST',
    headers: {
        'X-CSRFToken': csrftoken
    }
}).then(function(response) {
    if(response.ok) {
        return response.arrayBuffer();
    }
    throw new Error('Error getting registration data!');

}).then(CBOR.decode).then(function(options) {
    console.log(options)
    //This line is not working
    return navigator.credentials.create(options);
//More code... complete registration...

Я не могу понять этого. Вы знаете, что не так? Спасибо!


person Cody Cline    schedule 27.12.2018    source источник


Ответы (2)


У меня была та же проблема, и причина заключалась в том, что некоторые фрагменты данных, отправленные с сервера в ответ от / register / begin, должны быть отформатированы как байтовые строки, а не как строки Unicode. В частности, я обнаружил, что user_id и идентификаторы учетных данных должны быть байтовыми строками - при условии, что вы также следуете примеру Yubico на сервере, реализованном на python 3.

Также следует отметить, что в этом случае я обнаружил, что сообщения об ошибках Firefox намного более полезны, чем сообщения chome.

person Enrique Pérez Arnaud    schedule 25.01.2019
comment
Ага ???? это так. Спасибо за ответ, несколько недель назад я решил эту проблему. Эта надоедливая буква b перед user_id меня сбила с толку. Кстати, я также оставлю эту проблему GitHub, которая касается того, как хранить данные аутентификатора в базе данных здесь github.com/Yubico/python-fido2/issues/31 - person Cody Cline; 26.01.2019

У меня тоже была эта проблема. В итоге я использовал класс TextEncoder для кодирования задачи и идентификатора пользователя ...

        const enc = new TextEncoder();     
        const createCredentialOptions: CredentialCreationOptions = {
        publicKey: {
          rp: rp,
          challenge: enc.encode(challenge),
          user: {
            id: enc.encode(user.id),
            name: user.name,
            displayName: user.displayName
          },
          pubKeyCredParams: pubKeyCredParams,
          ...
person tjgrist    schedule 24.03.2021