当前位置: 首页 > 知识库问答 >
问题:

如何将FIDO凭据与WebAuthn一起用于移动端

花玄裳
2023-03-14

我使用Firefox内置的U2F API和Chrome的JavaScript U2F API实现了基于U2F的桌面浏览器。我遵循了这里的基本配方:

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

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

  • 证书
  • key_handle
  • public_key
  • 计数器

我相信(但我不确定),在获取了关于这个物理设备的这些信息之后,我现在可以在移动设备上呈现完全相同的网页时重新使用它来实现WebAuthn,它将呈现一个移动OS本机接口来请求NFC身份验证(如果设备有NFC的话),而不是呈现一个供用户验证的网页。

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

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

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

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都有这样一个确切的流程--你在桌面web上注册U2F设备,然后NFC设备就可以在本地移动设备上使用了。

顺便说一句,我想要实现这一点的原因是,用户在本机移动端,从来不需要离开您的web应用程序,本机NFC界面被呈现,他们被神奇地带回您的web应用程序。我目前拥有的是,如果移动检测到,呈现OTP界面,这需要用户切换到Authy这样的认证器应用程序,然后复制OTP并返回到mobile Web。把你的钥匙拔出来然后按一下就好了。

谢谢你的帮助,凯文

共有1个答案

湛嘉歆
2023-03-14

使用navigator.credentials.get()时,确保设置扩展名:{appId:u2f_appid},即在U2F.register调用期间设置U2F appId参数。在我的例子中,我使用了origins.json trustedfacet列表URL。

https://developer.mozilla.org/en-us/docs/web/api/publickeycredentialrequestoptions/extensions

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

 类似资料:
  • 我已经在的Jenkins中输入了AWS凭据,但是它们不会显示在AWS Elastic Beanstek插件中的Post Build步骤的下拉列表中。 如果我单击验证凭据,我会得到这个奇怪的错误。 失败com.amazonaws.SdkClientException:无法从链中的任何提供者加载AWS凭据:[环境变量凭据提供者:无法从环境变量(AWS_ACCESS_KEY_ID(或AWS_ACCESS

  • 我想ssh到代理后面的机器,然后在我的java程序中进行portforwarding。(为了能够ssh到盒子,我应该先ssh到代理机器)。我通常通过在我的~/.ssh/config文件中添加以下条目来实现: 谢了!

  • 我为我的spring boot应用程序开发集成测试,该应用程序与Cassandra一起工作。我使用与Cassandra通信。 有什么方法可以将Testcontainers Cassandra与Spring数据一起用于Apache Cassandra吗?

  • 抱歉,如果这个帖子不好,这是我在这里的第一个问题:)

  • 问题内容: 我正在使用Spring,Spring Data JPA,Spring Security,Primefaces的项目中工作… 在本教程中,你只能在预定义的数据源之间实现动态数据源切换。 这是我的代码的片段: springContext-jpa.xml 我想做的就是使targetDataSources映射也与其元素一样动态。 换句话说,我想获取某个数据库表,使用存储在该表中的属性创建我的数

  • 我在一个使用Spring、Spring数据JPA、Spring Security、Primefaces的项目中工作。。。 我正在学习关于spring动态数据源路由的教程。 在本教程中,您只能在预定义的数据源之间实现动态数据源切换。 以下是我的代码片段: springContext jpa。xml 我想做的是使targetDataSources映射与它的元素一样动态。 换句话说,我想获取一个特定的数