0

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

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

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

  • 证书
  • 关键句柄
  • 公钥
  • 柜台

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

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

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

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

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 并返回移动网络。只需拉出我们的钥匙并发出嗡嗡声就更好了。

感谢您的帮助,凯文

4

1 回答 1

1

使用navigator.credentials.get()时,一定要设置扩展名:{appid: u2f_appid},即u2f.register调用时的U2F appId参数。在我的例子中,我使用了 origins.json 可信面列表 URL。

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

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

于 2020-05-27T23:17:05.257 回答