1

通过 webauthn 登录 iframe 时出现错误。

本文档中未启用“publickey-credentials-get”功能。权限策略可用于将 Web 身份验证功能委托给跨域子框架。

这是示例https://jsfiddle.net/14kj25nr/的链接。我已经直接通过 webauthn.io 注册了一个用户“test_account”,然后尝试通过 jsfiddle 登录。它说使用publickey-credentials-get,但我找不到一种方法来使用它来让它工作。任何帮助,将不胜感激。

更新1:

我为 iframe 添加了 allow 属性allow="publickey-credentials-get"。它仍然给我同样的错误。小提琴中的示例已更新。

更新 2:

来自 IAmKale 的建议。我进行了以下更改,但仍然遇到相同的错误。更新了 iframe 的 allow 属性allow="publickey-credentials-get *"

我使用Requestlychrome 扩展Permissions-Policy在 RP 的响应中添加标题。在下面的屏幕截图中可以看出,我能够成功地在响应中添加标头。但仍然得到同样的错误。会不会是一些jsfiddle具体的问题?还是我做错了什么?我正在使用 Chrome 版本 96.0.4664.110。 在此处输入图像描述

更新 3:

当我在 localhost 而不是 jsfiddle 中使用 iframe 时,我会弹出 webauthn chrom 弹出窗口。但是登录仍然不成功,服务器返回POST https://webauthn.io/assertion 400

4

2 回答 2

2

扩展蒂姆的回答,嵌入 RP 的站点将需要添加以下allow属性:

<iframe src="..." allow="publickey-credentials-get *" />

规范对此有点模棱两可,但深入研究权限策略我相信 RP 还需要在对 iframe 中指定的 URL 的响应中设置以下 HTTP 标头src

Permissions-Policy: publickey-credentials-get=*

如果您想要更精细的控制,您可以将允许嵌入 RP 站点的特定 URL 列入白名单:

# Only specific sites
Permissions-Policy: publickey-credentials-get=("https://example.com")

https://example.com是嵌入 RP 站点的页面的URL<iframe>

一旦两个部分都到位,我认为您将能够navigator.credentials.get()在 iframe 中触发。

于 2022-01-23T16:16:18.197 回答
0

默认情况下,跨域 iframe 中禁用 Web 身份验证 API。要覆盖此默认策略并指示允许跨域 iframe 调用 Web 身份验证 API 的 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 方法,请在 iframe 元素上指定允许属性并包括 publickey-credentials-在允许属性的值中获取特征标识符标记。

https://www.w3.org/TR/webauthn-2/#sctn-iframe-guidance

于 2022-01-23T00:10:08.007 回答