我目前正在为Django构建AJAX注册端点,以允许FIDO2身份验证(物理硬件密钥登录)。这来自Yubico's official fido2 python library的示例/文档。
唯一的依存关系是cbor.js
和js-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...
我不知道这一点。你知道怎么了吗谢谢!
答案 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,
...