如何在移动设备上使用 FIDO 凭据与 WebAuthn



我已经使用Firefox内置和chrome-with-javascript U2F API实现了基于桌面浏览器的U2F。我遵循了这里的基本配方:

https://github.com/castle/ruby-u2f

对于每个物理设备,我有 4 个属性:

  • 证书
  • key_handle
  • public_key
  • 计数器

我相信,但我不确定,在收集了有关此物理设备的这些信息后,我现在可以在移动设备上呈现完全相同的网页以实现WebAuthn时重新调整其用途,而不是呈现网页供用户进行身份验证,而是呈现移动操作系统本机界面以请求NFC身份验证(如果设备具有NFC(。

我正在尝试使用上面的 4 个属性来使用 nav.credentials.get 渲染 javascript,但我被卡住了。

我不清楚以下哪一项是正确的

A( 您可以使用在桌面网络上的 U2F 设备注册过程中收集和验证的凭据/信息,以便在移动设备上使用 Web authn 进行身份验证

B(如果您希望在移动设备上使用Web authn,以便它可以触发本机移动NFC身份验证过程,除了常规的U2F流程外,您还必须秘密处理webauthn注册("秘密"并不意味着您故意不告诉用户他们正在这样做,而是用户不知道A和B之间的区别(。

按照上面链接的示例,他们的javascript是这样的:

var appId = <%= @app_id.to_json.html_safe %>
var registerRequests = <%= @registration_requests.to_json.html_safe %>;
var signRequests = <%= @sign_requests.as_json.to_json.html_safe %>;
u2f.register(appId, registerRequests, signRequests, function(registerResponse) {
var form, reg;
if (registerResponse.errorCode) {
return alert("Registration error: " + registerResponse.errorCode);
}
form = document.forms[0];
response = document.querySelector('[name=response]');
response.value = JSON.stringify(registerResponse);
form.submit();
});

在这里使用 Mozilla 示例:

https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialRequestOptions

我试图将其改编成这样的东西:

var appId = <%= @app_id.to_json.html_safe %>
var registerRequests = <%= @registration_requests.to_json.html_safe %>;
var signRequests = <%= @sign_requests.as_json.to_json.html_safe %>;

var options = {
challenge: new Uint8Array([/* bytes sent from the server */]),
rpId: "example.com" /* will only work if the current domain
is something like foo.example.com */
userVerification: "preferred",
timeout: 60000,     // Wait for a minute
allowCredentials: [
{
transports: "usb",
type: "public-key",
id: new Uint8Array(26) // actually provided by the server
},
{
transports: "internal",
type: "public-key",
id: new Uint8Array(26) // actually provided by the server
}
],
extensions: {
uvm: true,  // RP wants to know how the user was verified
loc: false,
txAuthSimple: "Could you please verify yourself?"
}
};
navigator.credentials.get({ "publicKey": options })
.then(function (credentialInfoAssertion) {
// send assertion response back to the server
// to proceed with the control of the credential
// update the hidden form input then
form.submit();
}).catch(function (err) {
console.error(err);
});

但是不清楚如何将U2F属性映射到webauthn属性。 我似乎找不到这种工作的具体示例,但我确信它确实有效,因为 GitHub 和 DropBox 都有这个确切的流程 - 您在桌面网络上注册 U2F 设备,然后 NFC 设备可以在本机移动设备上使用。

顺便说一下,我想实现这一点的原因是,用户在本机移动设备上永远不必离开您的 Web 应用程序,本机 NFC 界面被渲染,并且它们被神奇地带回您的 Web 应用程序。 我目前的情况是,如果检测到移动设备,则呈现OTP界面,这需要用户切换到像Authy这样的身份验证器应用程序,然后复制OTP并返回移动Web。 拉出我们的钥匙并嗡嗡作响会更好。

感谢您的任何帮助, 凯文

使用 navigator.credentials.get(( 时,请确保设置扩展名:{appid: u2f_appid},即 u2f.register 调用期间的 U2F appId 参数。就我而言,我使用了origins.json trustedfacet list URL。

https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialRequestOptions/extensions

您需要设置 extensions.appid 参数的原因是,如果 WebAuthn rpId 失败,它将使用 extensions.appid 参数回退到较旧的 U2F

相关内容

  • 没有找到相关文章

最新更新