API 身份验证,使用本地“API 密钥”与 OAuth2 客户端凭据流程

问题描述 投票:0回答:1

我们的应用程序公开了当前仅由我们的 UI 使用的 REST API。 UI 目前使用 OIDC 授权代码流程对用户进行身份验证,这需要用户与授权服务器(在本例中为 AWS Cognito)交互。

我们需要为客户提供一种通过我们的应用程序进行身份验证的方法,并以“M2M”友好的方式使用他们自己的集成客户端应用程序(而不是我们的 UI)调用我们的 API。意思是,我们希望他们能够从他们开发的 python 脚本调用我们的 API,或者从他们的应用程序将数据 POST 到我们的 API。

工程提出的解决方案:

  1. 提供一种在应用程序中配置“API Keys”的方法,它由 ID 和密钥组成。
  2. 在应用程序中存储密钥的哈希和加盐版本。
  3. 客户客户端应用程序可以通过发送 API 密钥 ID 和密钥来使用我们的 API 进行身份验证,这些密钥 ID 和密钥在应用程序中进行哈希处理并与存储的版本进行比较。

我们被告知使用这样的 API 密钥是不安全的,相反,我们应该实现 OAuth2 客户端凭证流程(使用私钥 JWT 方法)。

我的问题:

  1. 为什么 OAuth2 客户端凭证流程会更安全?无论哪种情况(我们的 API 密钥解决方案和 OAuth2 解决方案),客户客户端应用程序都需要存储秘密:私钥或 API 密钥。在这两种情况下,秘密都不会存储在应用程序中:存储公钥或散列秘密。
  2. 我的理解是,OAuth2 并不是用于身份验证,而是用于授权,而 OIDC 是构建在 OAuth2 之上用于身份验证的。我的理解正确吗?那么我们是否应该使用 OIDC 来代替,或者在这种情况下使用 OAuth2 进行身份验证是否可以/正确?
  3. 如果使用客户端凭证流程更好,是否可以以某种方式使用 AWS Cognito?或者我们必须使用其他支持使用私钥 JWT 方法的客户端凭据流程的授权服务器吗?我们已经有了一些使用 Keycloak 的经验 - 这是一个不错的选择吗?或者可以使用 @node-oauth/oauth2-serveroidc-provider 之类的东西在应用程序本身(NodeJS Express 应用程序)中实现 OAuth2?
node.js authentication oauth-2.0 amazon-cognito openid-connect
1个回答
0
投票

客户应通过他们自己的 API 将请求路由到您的 API。从您的问题来看,有点不清楚您的数据是否与客户的用户有关系。例如,您是否存储映射到特定用户的资源?

OAUTH 流程

使用客户端凭证等 OAuth 流程的好处包括:

  • API 请求中使用基于时间的凭据,以限制拦截的令牌/请求的影响
  • 可以锁定 API 凭证,例如使用
    tenant_id
    声明和范围,以减少特权和被盗令牌的影响
  • 您可以使用比 API 密钥更强大的基于密钥的客户端凭据,客户端在不泄露其秘密的情况下进行身份验证 - 还有内置的密钥更新模式
  • 开发人员使用的 API 中基于范围和声明的一致授权编码模型

在您的 API 密钥解决方案中,攻击者可能能够长时间重放被盗的凭证,无论它是否经过哈希处理和加盐处理。此外,服务器漏洞可能会泄露所有客户的 API 密钥,因为攻击者可以散列和加盐窃取的值并重新发送它们。

用户身份验证

当用户存在时,您运行代码流并始终对用户进行身份验证。其工作原理取决于 OAuth 和 OIDC 标准中授权服务器的实现(以及如何配置它)。如果您澄清了客户用户与 API 的关系,我将对此进行扩展。可能是代码流程是正确的流程,而不是授权服务器。

提供商

您应该花一些时间来识别 OAuth 支持的标准化流程和安全行为。您选择的解决方案可能还取决于数据敏感性、风险和您的上市时间。

如果您选择 OAuth,请澄清您的要求并在向提供商做出承诺之前进行概念验证。基于标准的解决方案使您的选择保持开放,并保持您的代码和安全标准。

© www.soinside.com 2019 - 2024. All rights reserved.