跨多个子域的WebAuthn

时间:2019-03-10 17:48:27

标签: javascript webauthn

我正在尝试在我的网站上设置WebAuthn身份验证流程,但遇到了一个问题。我希望我的用户能够在主要网站(www.domain.com)上注册其设备,以便可以通过其用户设置轻松访问该设备。身份验证本身通过IdP(sso.domain.com)在不同的子域上进行。这是麻烦开始的地方。

我尝试了几件事:

  • 在www.scoutswechel.be上进行注册和身份验证,同时将'www.scoutswechel.be'作为rp.id传递给两个=>作品。
  • 在www.scoutswechel.be上进行注册,在sso.scoutswechel.be上进行身份验证,将'www.scoutswechel.be'作为两个的rp.id传递=>身份验证步骤失败,因为身份验证器未返回任何密钥。 / li>
  • 在www.scoutswechel.be上进行注册,在sso.scoutswechel上进行身份验证,分别将这些域作为rp.id =>进行身份验证,因为身份验证程序未返回任何密钥,因此身份验证步骤失败。
  • 在www.scoutswechel.be上进行注册,在sso.scoutswechel.be上进行身份验证,同时将'scoutswechel.be'作为rp.id传递给两个=>注册步骤已经失败,并且针对不同的浏览器会出现不同的错误(例如'key返回了意外的内容) (2)'(在Chrome中)。

如果我正确理解规范,则传递“ scoutswechel.be”实际上应该可以正常工作,因为两个域都是主域的子域(如果我在这里错了,请纠正我)。

我准备使用PHP进行挑战,并通过ajax调用将其传递给页面。例如,我的PHP脚本返回以下值:

{
   "publicKey":{
      "challenge":[105,107,101,103,105,49,119,115,98,108,119,109,48,109,105,53],
      "user":{
         "name":"walter",
         "displayName":"Wouter Henderickx",
         "id":[49,48,51]
      },
      "rp":{
         "id":"scoutswechel.be",
         "name":"scoutswechel.be"
      },
      "pubKeyCredParams":[
         {
            "alg":-7,
            "type":"public-key"
         }
      ],
      "authenticatorSelection":{
         "authenticatorAttachment":"cross-platform",
         "requireResidentKey":false,
         "userVerification":"preferred"
      },
      "attestation":null,
      "timeout":60000,
      "excludeCredentials":[],
      "extensions":{
         "exts":true
      }
   },
   "b64challenge":"aWtlZ2kxd3NibHdtMG1pNQ"
}

然后我将Challenge和user.id转换为Uint8Array并将公钥部分传递给:

navigator.credentials.create({publicKey: key.publicKey}).
	then(function (aNewCredentialInfo) {
		do.stuff()
	})

我应该怎么做?我可以将什么值传递给rp.id,以使其在两个子域中都能正常工作?

1 个答案:

答案 0 :(得分:0)

最后,我弄清楚了。这些都是我的实现问题:

  • 在我基于(https://github.com/davidearl/webauthn)的项目的库中,有一段javascript将rp.name的值与源进行了比较。由于我传递的是非域名,因此此检查阻止了进一步的执行。
  • 我正在传递“ rpid”作为依赖方标识符。但是,这应该是“ rpId”。由于我的身份验证器在没有pid的情况下找不到任何凭据,因此它不返回任何内容,因此我也没有经过身份验证。