java - 集成测试 WebAuthN 作为 2FA 选项
问题描述
我想将 WebAuthN 作为多因素身份验证的选项添加到 Angular 和 Spring 应用程序。我使用 Yubico 的 WebAuthN java-webauthn-server库。
在没有硬件客户端的情况下,集成测试我的 WebAuthN 服务器的最佳方法是什么?是否有任何软件可以在自动化测试中处理密码学?我想在 CI/CD 管道 (GitLab) 中自动运行这些测试。
在最好的情况下,我希望能够测试整个过程,创建凭据以及登录。另一种情况可能是我在后端使用已知凭据并仅使用这些凭据登录。
我的 API 是基于 REST/JSON 的,具有依赖方、用户、挑战、pubKey 等...
我的集成测试是基于 Java 的(spring boot starter test)
我主要对如何在没有客户端的情况下集成测试服务器感兴趣。是否有实用程序或库可以处理身份验证器并返回正确的数据/json 对象?
我已经查看了通过 REST 工具测试 WebAuthn,但是,我对测试规范不感兴趣,因为我使用的是库,我只想确保我将库正确应用于我的代码。
解决方案
如果您只对测试服务器端感兴趣,您可以编写一个带有按钮的简单网页,这些按钮可以锻炼您的端点并调用navigator.credentials.(create|get)
. 然后,您可以使用Selenium 4+ 检测浏览器,设置Virtual Authenticators并针对该网页运行测试。以selenium 测试为例。设置身份验证器的代码在 java 中如下所示:
VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions();
options.setTransport(Transport.INTERNAL)
.hasUserVerification(true)
.isUserVerified(true);
VirtualAuthenticator authenticator =
((HasVirtualAuthenticator) driver).addVirtualAuthenticator(options);
请注意使用正确的设置设置身份验证器以匹配您的 webauthn 调用。您应该选择正确的用户验证支持、常驻密钥支持以及内部(即平台)与 usb / nfc / ble(即跨平台)传输。
如果您使用的是旧版本的 selenium,则必须自己手动定义命令。代码应该看起来像
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);
如果您还没有将它用于集成测试,那么运行 selenium 测试可能需要一些工作。然而,这个实现将非常接近现实。从浏览器的角度来看,虚拟身份验证器是真实的硬件。来自身份验证器的响应将由浏览器处理,就好像它是真实的一样。
目前,只有基于 chromium 的浏览器支持虚拟身份验证器。
推荐阅读
- c++ - 如何通过通用引用或 std::forward 将这三个 c++ 模板函数合并为一个?
- c# - 如何在 C# 中将 Excel 数据插入现有表中
- mongodb - db.collection.find().explain() 在 MongoDB 4.0 中不再输出性能细节
- php - 如果不将其存储在数据库中,则无法显示
- stress-testing - 使用压力ng来模拟工作量
- java - 如何对向量进行排序
> 将子项目组合在一起的多个元素? - image-processing - 使用图像作为不透明蒙版
- amazon-iam - 无法访问 AWS Elasticsearch 集群,IAM 策略问题
- c++ - 如何从派生类函数中调用虚函数
- c++ - 如何使用基于范围的 for 循环遍历本身就是 JSON 数组的 Rapidjson 文档?