V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Explr
V2EX  ›  程序员

手机扫描电脑二维码使用 Passkey 登录时需要两个设备都连接谷歌服务器吗?

  •  1
     
  •   Explr · 313 天前 · 2253 次点击
    这是一个创建于 313 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用电脑在 webauthn.iopasskeys.io 上测试通行密钥,电脑上用 Chrome 120 和 Fireafox 121(目前最新版)。在电脑上选择使用移动设备,然后在安卓手机上扫码连接,使用安卓手机上保存的 Passkey 。

    经过几次测试,不论什么浏览器,如果电脑用虚拟网卡的方式全局代理,手机也开代理,注册和认证流程可以顺利完成。如果电脑只给浏览器代理,或者设置系统代理,两台设备连不上,手机不开代理也连不上。

    如果关闭电脑的蓝牙,显示 Passkey 的二维码前也会要求先打开蓝牙。我推测电脑和手机之间应该是用蓝牙传输数据的,那为什么还要两端都全局代理呢?有大佬用 iPhone/iPad 扫码试过吗?

    14 条回复    2024-02-28 18:05:28 +08:00
    Satelli
        1
    Satelli  
       313 天前
    扫码只需要蓝牙。
    Google Chrome 只是可以通过手机上的 Chrome 唤起配对流程面去扫码而已,实际上还是蓝牙。
    Passkey 是可以存在 Google 账号里并同步到其他 Android 或 ChromeOS 设备的,这种情况下可能是没连梯子导致网络请求失败?
    Android 手机还支持作为硬件密钥,验证流程是很相似的,你得区分一下。
    Explr
        2
    Explr  
    OP
       313 天前
    @Satelli #1 WebAuthn.io 的注册参数是 User Verification: Preferred ,Attachment: All Supported ,Discoverable Credential: Preferred ,Attestation: None ,Registration Hint: []

    确实是在 Google 密码管理器里看见这个 Passkey 了,大佬知道怎么设置 webauthn 的参数可以不依赖谷歌服务吗,我想给网站加上这个扫码登录的功能,但是要求两端都代理有点苛刻,尤其是电脑,光给浏览器代理还不行。
    Satelli
        3
    Satelli  
       313 天前
    @Explr
    电脑不需要代理的呀,所有数据都是浏览器通过蓝牙从你手机拿的。
    我的意思是因为你的手机的 Passkey 是存在 Google 账号里的,需要先从里拿数据所以可能需要代理。
    你好像唯独没有测试电脑不开代理,手机开代理的情况吧。
    iOS 设备的 Passkey 是存在 iCloud Keychain 或其他密码管理器里的,不需要代理。
    国行 Android 手机我不太清楚。
    Explr
        4
    Explr  
    OP
       313 天前 via Android
    测试过电脑不开代理手机开,也是不行的,手机是国行三星,这也是我奇怪的地方。而且电脑必须通过虚拟网卡让所有流量都走代理才行,只给浏览器设置代理或者设置 Windows 代理都是过一段时间后两端的认证各自超时。

    还有就是两端开代理成功过一次以后,下次电脑会记住手机型号,可以直接选这个手机连接,不必扫码。我试过关上手机的 wifi 和蓝牙,然后两端开代理,电脑依然能把认证请求推送到手机上,估计肯定是走谷歌服务器通知了。

    我还试过开代理扫码,在设备连接上以后,手机按指纹之前,断开电脑的代理,一样也会失败。不知道是不是扫码也过了谷歌服务器了。

    @Satelli
    cccer
        5
    cccer  
       313 天前   ❤️ 2
    1. QC 验证时 BLE 蓝牙只是提供握手及接近度证明,后续通信是通过网络隧道完成,这个网络隧道是认证器提供的(本文中的 Google )。
    2. Windows 需要代理是因为与认证器通信工作是由 Windows 完成的。
    cccer
        6
    cccer  
       313 天前
    记住设备这个功能也同理,在注册时双方已经提供了可信证明和网络隧道的地址,后续直接通过这个隧道通信就行。
    jocover
        7
    jocover  
       313 天前
    这东西其实就是 fido2 的验证模式,根据协议可以走蓝牙,nfc,和 USB hid ,不需要网络流量

    我是用自己开发基于 esp32 的在 USB 模式下测试的,注册 webauthn.iopasskeys.io 都不需要代理
    https://github.com/jocover/esp32_u2f
    Explr
        8
    Explr  
    OP
       313 天前
    @cccer #5 感谢大佬,请问有这个整体认证过程的标准文档或者介绍文档吗,我再研究研究。
    cccer
        9
    cccer  
       312 天前   ❤️ 2
    @Explr QR 验证属于混合传输,大概流程如下(细节可能有误):

    1. 电脑通过二维码展示一个公钥和一个秘钥
    2. 手机扫描后把通过秘钥加密后的网络隧道服务器和其他信息广播出去
    3. 电脑收到广播后就拿到了网络隧道地址和必要信息,也同时验证了认证器就在附近
    4. 后续电脑就通过这个网络隧道来和认证器通讯

    参考: https://fidoalliance.org/specs/fido-v2.2-rd-20230321/fido-client-to-authenticator-protocol-v2.2-rd-20230321.html#sctn-hybrid
    lslqtz
        10
    lslqtz  
       312 天前
    看了看贴, 我在上此功能的时候使用 iOS 设备测试, 上线后才了解到部分 Android 用户报告 WebAuthn 不可用, 这可能是可能一种原因吧...
    k332159915
        11
    k332159915  
       273 天前
    同为三星国行,请问下楼主知道是什么问题了嘛?
    k332159915
        12
    k332159915  
       273 天前
    我发现一个问题 Passkey 是可以存在 Google 账号的,但是我头一天设置好了之后看到里面有,但是第二天再去看的时候就没有设个 passkey 的数据了。
    Explr
        13
    Explr  
    OP
       273 天前 via Android
    @k332159915 #11 参考#9 的回复,实际数据是通过网络传输的,电脑传输数据时需要走代理。
    k332159915
        14
    k332159915  
       273 天前
    @Explr 三星国行好像 Google 服务阉割严重,唉,基本上连不上设备。passkey 基本上算残废的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1283 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:35 · PVG 07:35 · LAX 15:35 · JFK 18:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.