无法理解来自 JavaScript 的 WebAuthn API 错误

Can't understand WebAuthn API error from JavaScript

我目前正在为 Django 构建一个 AJAX 注册端点以允许 FIDO2 身份验证(物理硬件密钥登录)。这是来自 Yubico's official fido2 python library 中的 example/documentation。

唯一的依赖项是 cbor.jsjs-cookie。服务器端现在一切正常,但是,我在调用 navigator.credentials.create 方法

时不断收到此 JavaScript 错误
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...

我想不通。你知道怎么了吗?谢谢!

我遇到了同样的问题,原因是在/register/begin的响应中从服务器发送的一些数据必须格式化为字节字符串而不是unicode字符串。特别是,我发现 user_id 和凭证 ID 必须是字节字符串 - 假设您也在服务器中遵循 Yubico 的示例,在 python 3.

中实现

另外值得注意的是,在这种情况下,我发现 Firefox 的错误消息比 chome 的更有帮助。

我也遇到了这个问题。我最终使用 TextEncoder class 对挑战和用户 ID 进行编码...

        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,
          ...