WebAuthn:无法创建 public 密钥。承诺被拒绝
WebAuthn: Can't create public key. Promise is rejected
我正在尝试在我们的登录页面上设置 WebAuthn。我到了需要使用 navigator.credentials.create()
制作 public 键的部分。在 Chrome,我不断收到以下错误:Uncaught (in promise) DOMException: The operation either timed out or was not allowed. See: https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client.
相关代码如下:
if (isAvailable) {
// Get challenge from server
fetch("WebAuthn/WebAuthn.ashx", {
method: "POST"
})
.then(res => res.json())
.then(res => {
const publicKeyCredentialCreationOptions = {
challenge: Uint8Array.from(
res.data, c => c.charCodeAt(0)),
rp: {
id: "localhost",
name: "Company Name"
},
authenticatorSelection: {
authenticatorAttachment: "platform",
userVerification: "discouraged"
},
pubKeyCredParams: [{alg: -7, type: "public-key"}],
user: {
id: Uint8Array.from(
"UZSL85T9AFC", c => c.charCodeAt(0)),
displayName: "User",
name: document.getElementById("tbUser").value // taken from aspx form
}
};
const credential = navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
});
}
一些可能有用的附加信息:
- 服务器尚未处理此信息,但我认为这无关紧要,因为需要在发送凭据之前创建凭据
- 目前正在 https://localhost 上测试
- 这发生在用户登录之前的登录页面上。想法是在用户点击提交后提示用户
首先,您可以在 Chrome 上使用虚拟身份验证器进行测试,请参见下图。
在 windows 上,您可以将 Windows Hello 设置为身份验证器,稍后再进行测试。
现在针对您的问题做一些说明
- localhost 不需要 https
- 如果仅使用 http,则指定预期来源,如果不是 80,则可以是 http://localhost<:port>
- 需要检查发送的格式,是不是arraybyte
我已经成功运行了...您可以尝试查看我的示例代码并使用它们,只有 2 个文件
- 前端:https://github.com/ais-one/cookbook/blob/develop/js-node/expressjs/public/demo-express/fido.html
- Express 后端(使用 fido2-lib):https://github.com/ais-one/cookbook/blob/develop/js-node/expressjs/router/fido.js
我仍在清理它以使其成为生产代码(例如,在前端和后端之间传递信息时使用 JWT/会话。
如果还有问题,我们可以在这里讨论...https://github.com/ais-one/cookbook/discussions
我正在尝试在我们的登录页面上设置 WebAuthn。我到了需要使用 navigator.credentials.create()
制作 public 键的部分。在 Chrome,我不断收到以下错误:Uncaught (in promise) DOMException: The operation either timed out or was not allowed. See: https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client.
相关代码如下:
if (isAvailable) {
// Get challenge from server
fetch("WebAuthn/WebAuthn.ashx", {
method: "POST"
})
.then(res => res.json())
.then(res => {
const publicKeyCredentialCreationOptions = {
challenge: Uint8Array.from(
res.data, c => c.charCodeAt(0)),
rp: {
id: "localhost",
name: "Company Name"
},
authenticatorSelection: {
authenticatorAttachment: "platform",
userVerification: "discouraged"
},
pubKeyCredParams: [{alg: -7, type: "public-key"}],
user: {
id: Uint8Array.from(
"UZSL85T9AFC", c => c.charCodeAt(0)),
displayName: "User",
name: document.getElementById("tbUser").value // taken from aspx form
}
};
const credential = navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
});
}
一些可能有用的附加信息:
- 服务器尚未处理此信息,但我认为这无关紧要,因为需要在发送凭据之前创建凭据
- 目前正在 https://localhost 上测试
- 这发生在用户登录之前的登录页面上。想法是在用户点击提交后提示用户
首先,您可以在 Chrome 上使用虚拟身份验证器进行测试,请参见下图。
在 windows 上,您可以将 Windows Hello 设置为身份验证器,稍后再进行测试。
现在针对您的问题做一些说明
- localhost 不需要 https
- 如果仅使用 http,则指定预期来源,如果不是 80,则可以是 http://localhost<:port>
- 需要检查发送的格式,是不是arraybyte
我已经成功运行了...您可以尝试查看我的示例代码并使用它们,只有 2 个文件
- 前端:https://github.com/ais-one/cookbook/blob/develop/js-node/expressjs/public/demo-express/fido.html
- Express 后端(使用 fido2-lib):https://github.com/ais-one/cookbook/blob/develop/js-node/expressjs/router/fido.js
我仍在清理它以使其成为生产代码(例如,在前端和后端之间传递信息时使用 JWT/会话。
如果还有问题,我们可以在这里讨论...https://github.com/ais-one/cookbook/discussions