Selenium 测试:使用 Webauthn 进行身份验证

Selenium Tests: Authenticate with Webauthn

在我的用例中,有一个注册页面会触发浏览器特定的 webauthn 流程。例如在 Chrome 上 Mac 你会看到这一系列的弹出窗口:

  1. 在 USB 安全密钥和内置传感器之间选择一个选项
  2. MacOS 使用 Touch ID 确认
  3. 来自 Chrome 的确认对话框请求访问您的安全密钥

除了https://w3c.github.io/webauthn/#add-virtual-authenticator I haven't found much documentation about authenticating with webauthn as part of a selenium test. What resources are available to help devs figure out how to test webauthn with Selenium in JavaScript? I have also checked out https://github.com/SeleniumHQ/selenium/issues/7829,但是示例测试用例对我来说没有意义。示例将 非常 赞赏。

更新 js 解决方案:

  import { Command } from 'selenium-webdriver/lib/command';

  addVirtualAuthenticator = async () => {
    await this.driver.getSession().then(async session => {
      this.driver
        .getExecutor()
        .defineCommand('AddVirtualAuthenticator', 'POST', `/session/${session.id_}/webauthn/authenticator`);

      let addVirtualAuthCommand = new Command('AddVirtualAuthenticator');
      addVirtualAuthCommand.setParameter('protocol', 'ctap2');
      addVirtualAuthCommand.setParameter('transport', 'internal');
      addVirtualAuthCommand.setParameter('hasResidentKey', true);
      addVirtualAuthCommand.setParameter('isUserConsenting', true);
      await this.driver.getExecutor().execute(addVirtualAuthCommand);
    });
  };

请注意 this.driver 的类型为 WebDriver

在点击与 navigator 交互的任何代码之前调用 addVirtualAuthenticator(在我们的案例中,用户注册涉及对 navigator.credentials.create 的调用)。如果您需要访问 publicKey,即在登录期间通过 navigator.credentials.get({ publicKey: options }),则 hasResidentKeycritical.

如果您在 java 中实现它并使用 selenium 4,那么一个很好的示例资源是 the tests on selenium itself。你基本上需要

  • 创建虚拟验证器

    在您的情况下,您应该将传输设置为 internal 并将 hasUserVerification 设置为 true 以模拟 touchID。

VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions();
options.setTransport(Transport.INTERNAL)
       .hasUserVerification(true)
       .isUserVerified(true);
VirtualAuthenticator authenticator =
    ((HasVirtualAuthenticator) driver).addVirtualAuthenticator(options);
  • 执行触发注册的操作。

    如果一切正常,浏览器应该不会显示对话框。相反,它应该立即 return 一个凭据。

对于任何其他语言或 selenium 版本,您需要直接调用 WebDriver 协议。正如您所指出的,W3C spec has documentation on the protocol endpoints.

对于java,它可能类似于

browser.driver.getExecutor().defineCommand(
    "AddVirtualAuthenticator", "POST", "/session/:sessionId/webauthn/authenticator");

// ...

Command addVirtualAuthCommand = new Command("AddVirtualAuthenticator");
addVirtualAuthCommand.setParameter("protocol", "ctap2");
addVirtualAuthCommand.setParameter("transport", "usb");
browser.driver.getExecutor().execute(addVirtualAuthCommand);

对于 java 脚本,您应该能够以类似的方式使用 defineCommand and webDriver.execute

这是 selenium 中最糟糕的做法

Two Factor Authentication shortly know as 2FA is a authorization mechanism where One Time Password(OTP) is generated using “Authenticator” mobile apps such as “Google Authenticator”, “Microsoft Authenticator” etc., or by SMS, e-mail to authenticate. Automating this seamlessly and consistently is a big challenge in Selenium. There are some ways to automate this process. But that will be another layer on top of our Selenium tests and not secured as well. So, you can avoid automating 2FA.

绕过 2FA 检查的选项很少:

1.Disable 测试环境中某些用户的 2FA,以便您可以在自动化中使用这些用户凭据。 2.Disable 测试环境中的 2FA。 3.Disable 2FA 如果您从某些 IP 登录。这样我们就可以配置我们的测试机器 IP 来避免这种情况。