跨多个子域的 WebAuthn
WebAuthn across multiple subdomain
我正在尝试在我的网站上设置 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 传递给两者 => 身份验证步骤失败,因为身份验证器没有 return任意键。
- 在 www.scoutswechel.be 上注册,在 sso.scoutswechel 上进行身份验证,将这些域分别作为 rp.id 传递 => 身份验证步骤失败,因为身份验证器没有 return 任何密钥.
- 在 www.scoutswechel.be 上注册,在 [=56= 上进行身份验证],将 'scoutswechel.be' 作为 rp.id 传递给两者 => 注册步骤已经失败,不同浏览器的错误不同(例如 'key returned something unexpected (2)' 在 chrome).
如果我正确理解规范,传递 'scoutswechel.be' 实际上应该有效,因为两个域都是主域的子域(如果我在这里错了请纠正我)。
我用 PHP 准备我的挑战,然后用 ajax 调用将它们传递到页面。我的 PHP 脚本 returns 例如以下值:
{
"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"
}
然后我将挑战和 user.id 转换为 Uint8Array 并将公钥部分传递给:
navigator.credentials.create({publicKey: key.publicKey}).
then(function (aNewCredentialInfo) {
do.stuff()
})
我该怎么办?我可以将什么值传递给 rp.id 以使其跨两个子域工作?
最后,我想通了。这些都是我这边的实施问题:
- 在我基于我的项目 (https://github.com/davidearl/webauthn) 的库中,有一段 javascript 将 rp.name 的值与原点进行了比较。由于我传递的是 non-domain 名称,此检查阻止了进一步执行。
- 我正在传递 'rpid' 作为依赖方标识符。但是,这应该是 'rpId'。由于我的身份验证器在没有 rpid 的情况下找不到任何凭据,所以它没有 return 任何东西,我没有通过身份验证。
我正在尝试在我的网站上设置 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 传递给两者 => 身份验证步骤失败,因为身份验证器没有 return任意键。
- 在 www.scoutswechel.be 上注册,在 sso.scoutswechel 上进行身份验证,将这些域分别作为 rp.id 传递 => 身份验证步骤失败,因为身份验证器没有 return 任何密钥.
- 在 www.scoutswechel.be 上注册,在 [=56= 上进行身份验证],将 'scoutswechel.be' 作为 rp.id 传递给两者 => 注册步骤已经失败,不同浏览器的错误不同(例如 'key returned something unexpected (2)' 在 chrome).
如果我正确理解规范,传递 'scoutswechel.be' 实际上应该有效,因为两个域都是主域的子域(如果我在这里错了请纠正我)。
我用 PHP 准备我的挑战,然后用 ajax 调用将它们传递到页面。我的 PHP 脚本 returns 例如以下值:
{
"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"
}
然后我将挑战和 user.id 转换为 Uint8Array 并将公钥部分传递给:
navigator.credentials.create({publicKey: key.publicKey}).
then(function (aNewCredentialInfo) {
do.stuff()
})
我该怎么办?我可以将什么值传递给 rp.id 以使其跨两个子域工作?
最后,我想通了。这些都是我这边的实施问题:
- 在我基于我的项目 (https://github.com/davidearl/webauthn) 的库中,有一段 javascript 将 rp.name 的值与原点进行了比较。由于我传递的是 non-domain 名称,此检查阻止了进一步执行。
- 我正在传递 'rpid' 作为依赖方标识符。但是,这应该是 'rpId'。由于我的身份验证器在没有 rpid 的情况下找不到任何凭据,所以它没有 return 任何东西,我没有通过身份验证。