4

在阅读了有关WebAuth API 的大量 文档 后,我无法在 iOS 上成功启用平台身份验证。 我尝试将 Authenticator Attachment 设置为跨平台和平台,除了 iOS,它们产生了一致的结果:

╭────────────────┬───────────────────────┬────────────────────────────┬────────────────────────────┬───────────────────────────────────────────────╮
│   Attachment   │       Windows 10      │         Android 8          │       MacOS Catalina       │             iOS 13                            │
│                │       Edge/Chrome     │        Chrome/Opera        │        Chrome/Safari       │      Webkit(Everything else is this anyways)  │
╞════════════════╬═══════════════════════╬════════════════════════════╬════════════════════════════╬═══════════════════════════════════════════════╡
│ cross-platform ║        USB Key        │     USB/Bluetooth Key      │      USB/Bluetooth Key     │                 USB/Bluetooth Key             │
│ platform       ║  Fingerprint/Face/Pin │ Fingerprint/USB/Bluetooth  │         Fingerprint        │               "Insert security key"           │
└────────────────┴───────────────────────┴────────────────────────────┴────────────────────────────┴───────────────────────────────────────────────┘
4

4 回答 4

3

不幸的是,iOS 上的支持目前仅限于外部身份验证器。对 iOS 的全面支持确实是阻止广泛采用的最后一件事,因此 iOS 14 将提供所需的功能。

它在 iOS 13.3 发行说明中得到了简短的提及:

https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_3_release_notes

ETA 这将很快到来:

https://developer.apple.com/videos/play/wwdc2020/10670/

于 2020-05-19T07:05:06.193 回答
2

2020 年 10 月 19 日,Apple 发布了他们对 WebAuthn 的解释:https ://webkit.org/blog/11312/meet-face-id-and-touch-id-for-the-web/

从 iOS 14 和 macOS Big Sur 开始支持 FaceID 和 TouchID。要使其工作,对于作为平台身份验证器的每个 allowCredentials 条目,您需要添加transport: ["internal"],否则它将继续提示输入 USB/NFC 令牌。

本质上,这是:

const publicKeyCredentialRequestOptions = {
    challenge: challengeBuffer,
    allowCredentials: [{
        id: 'credentialsIdentifierOne', // Windows Hello
        type: 'public-key'
    }, {
        id: 'credentialsIdentifierTwo', // iOS FaceID
        type: 'public-key'
    }],
    timeout: 60000
}

变成这样:

const publicKeyCredentialRequestOptions = {
    challenge: challengeBuffer,
    allowCredentials: [{
        id: 'credentialsIdentifierOne', // Windows Hello
        type: 'public-key',
        transports: ["internal"]
    }, {
        id: 'credentialsIdentifierTwo', // iOS FaceID
        type: 'public-key',
        transports: ["internal"]
    }],
    timeout: 60000
}

总的来说,这符合规范,您应该能够通过调用来检索身份验证器的传输.getTransports()列表AuthenticatorResponse。这在教程中没有得到广泛的记录,甚至没有得到广泛的支持,所以要小心:

设置跨平台身份验证器时,返回的值通常仅包含已使用的传输,而不是身份验证器支持的所有传输。例如,YubiKey 5 NFC 仅["usb"]在插入时使用时才会返回。

因此,您应该避免将transports这些身份验证器设置在一起,或者将它们设置为所有“非内部”传输:["usb", "nfc", "ble"].

至于调用.getTransports(),请检查是否可用(2020 年 12 月,Safari 仍然没有),如果不可用,则transports根据您何时请求平台验证器或跨平台验证器回退到适当的位置。

另一个非常重要的一点:如果你在你的应用程序中启动 SFSafariWebView 来处理这个问题,无论是 PWA、Cordova 还是本机,它都会意外失败。原因?Apple 决定在将 FaceID 作为选项提供给用户之前需要用户激活(点击/点击)。更糟糕的是,您不知道身份验证肯定会失败 - iOS 让它看起来一切都在正常运行,甚至提示用户插入他们的身份验证器,同时知道不存在这样的身份验证器(凭证 ID 指向 FaceID iOS 知道)。

上述问题的解决方案是添加一个额外的步骤并通过要求用户在调用 WebAuthn 代码之前按下按钮来中断身份验证流程。

于 2020-12-13T23:12:52.173 回答
0

chrome 将不支持任何扩展:

https://bugs.chromium.org/p/chromium/issues/detail?id=1097972

请求 chromium 团队支持 iOS 13,14 的 WebAuth

https://bugs.chromium.org/p/chromium/issues/detail?id=1101804

于 2020-07-02T15:38:45.293 回答
0

对我来说,来自 .Net 的 WebAuthn 是一场完整的编码转换噩梦!然而,我终于让它工作了,但后来遇到了 iOS 问题。最后,当我弄清楚当我设置 AuthenticatorAttachment 时 Mac 和 iOS 都不喜欢它时发生的事情时,修复对我来说是一个简单的问题。因此,我最终不得不使用从这里获得的函数来检测操作系统:getOS()

然后我将其编码如下:

   var os = getOS();
   if (os == 'iOS' || os =='Mac OS') {
      credentialOptions.authenticatorSelection.authenticatorAttachment = undefined;
   }
于 2021-05-03T15:33:30.530 回答