无法从JavaScript中了解WebAuthn API错误

时间:2018-12-27 23:24:15

标签: javascript django yubico cbor webauthn

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

唯一的依存关系是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...

我不知道这一点。你知道怎么了吗谢谢!

2 个答案:

答案 0 :(得分:1)

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

还要注意的是,在这种情况下,我发现Firefox的错误消息比chome的错误消息有用得多。

答案 1 :(得分:1)

我也遇到了这个问题。我最终使用 TextEncoder 类对挑战和用户 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,
          ...