自动化测试OAuth2/OpenID Connect保护的API。

24

我正在研究一个新项目,计划首先基于API进行开发,然后再在其上实现Web应用和本地应用程序,并允许第三方集成。到目前为止都很标准。

我们还希望为API拥有完整的自动化测试套件,既要确保它在没有回归的情况下正常工作,也要确保它符合需求。这也很标准,但因为我们正在测试API,所以将使用代码中的HTTP客户端而不是Web浏览器。

我们一直在研究OAuth2 / OpenID Connect来促进API的身份验证和授权 - 基本上是让客户端进行身份验证,获取访问令牌,然后使用它来访问所有API资源。

我所面临的难题是如何使自动化测试与OAuth2部分配合良好,以便能够调用API。最初的想法是使用“client_credentials”或“password”授权类型,这两种方法似乎都符合我们的要求,但它们在OpenID Connect规范中没有涵盖,并且至少通常不被认为是一种好方法。

这是实现此目标的最佳方法吗?还是说有其他最佳做法可用于这种情况,并且可以与其他流程一起使用,但不需要Web浏览器?

编辑:经过(大量)阅读后,我有了新计划。完全离线运行测试,使用针对分开的数据库的单独部署,并在测试运行之前直接将数据种子放入数据库中,然后使用标准的OpenID Connect流程,但是:

  • 一个客户端被标记为用于测试目的。这是一个重要的部分,只有在客户端可以直接注册到数据库而无需通过业务逻辑时才可能实现。
  • prompt=none
  • login_hint=要获取访问令牌的用户名
  • 包含“testing”的作用域

系统随后可以检测到这些事实的组合,并自动验证已提供的用户名,而无需通过浏览器进行身份验证。

这个方案看起来合理吗?还是说有更好的方法?


你尝试过OpenID基金会提供的OpenID Connect认证工具吗? - Spomky-Labs
1
我的理解是这是为了测试OpenID Connect服务本身,而我更感兴趣的是测试其他API服务,这些服务将在OAuth2 / OpenID Connect访问令牌后面生成和保护,这意味着为了调用它们,我需要以编程方式获取有效的访问令牌。 - Graham
我不明白创建一个特殊的测试用户如何是安全的?如果有人获得了您的测试环境访问权限,或者找出如何在生产环境中创建测试用户,那该怎么办?这对我来说似乎不是正确的解决方案。 - Alex Spurling
我应该澄清一下(我在我的帖子中已经这样做了)。我的端到端测试正在针对运行在进程中的Web应用程序版本运行,它本身针对运行在进程中的数据库运行,并且测试过程直接将数据种子插入数据库,以便在必要时进行验证。我正在使用Java和Maven,因此我正在使用maven-cargo-plugin运行webapp,并使用embedmongo-maven-plugin启动数据库以供webapp使用。任何人都不需要通过任何正常手段创建具有此特殊标志的用户,因此这种风险较小。 - Graham
好的,这很有道理。在我们的情况下,我们有一个类似于生产环境的UAT环境,我们希望在其中运行端到端测试。直到上周,我们一直在使用一个解决方法,可以让我们获取Google OAuth令牌,但不幸的是,它已经停止工作了。知道对我们来说正确的解决方案将是很好的。 - Alex Spurling
1个回答

13

既然您想要测试API,那么获取access_token的方式并不重要,无论是通过浏览器还是其他方式。因此有(至少)两种解决方案:

  1. 另一种方式可以是client_credentials授权。您需要让授权服务器返回一个与在浏览器中通过OpenID Connect流程为用户返回的access_token相似的access_token,但这取决于您AS的实现是否可行。

  2. 使用常规的OpenID Connect浏览器流来引导您的客户端生成一个refresh_token和一个access_token,并将这两个令牌与测试客户端一起存储,并在配置时间存储client_idclient_secret。您的测试客户端可以访问API,直到access_token过期,然后通过refresh_token授权类型(利用client_idclient_secret)获取新的access_token

OpenID Connect本身、用户身份验证和id_token对于您只关心access_token的API来说是无关紧要的。


详细说明解决方案1:创建一个测试客户端,并添加所有声明以通过端点的授权要求。如果需要检查“sub”声明,则向测试客户端添加名为“sub”的声明,因为仅使用oidc进行用户身份验证会生成sub声明。 - Ian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接