健全性检查:OAuth 2 client_credential 服务器到服务器与 username/pwd

Sanity check: OAuth 2 client_credential server-to-server vs. username/pwd

我们正在就以下问题进行内部辩论。我们有一个服务器实现了 API 而我们客户的服务器 consume/call。我们的服务器正在使用 AWS Cognito。我们已经实现了 client_credential 身份验证。因此,当我们加入新客户时,我们会为他们注册一个新应用程序(在 Cognito/UserPool 中)并为他们提供相应的应用程序 ID 和应用程序密码(由 Cognito 创建)。我们还设置了范围等。现在,当客户的服务器进行 API 调用时,它 1) 使用应用程序 ID 和密码从 Cognito 获取身份验证令牌,以及 2) 使用API呼唤。

一位工程师认为我们不应该信任我们的客户来保护应用程序的秘密。相反,他建议 we 保留应用程序 ID 和机密。然后,我们给我们的新客户一个username/pwd。当客户的服务器发出 API 调用时,客户的服务器将 1) 发送 username/pwd 以及 API 调用,而不是上述“常规”方法(Oauth 2), 2) 我们的服务器验证这些,3) 从内部数据库中提取客户的应用程序 ID 和密码,以及 4) 将这些传递给 Cognito 以获取身份验证令牌。

呸!这似乎是几个方面的问题:

  1. 如果我们不信任他们使用应用程序秘密,我们为什么要信任他们使用我们为他们创建的 username/pwd?
  2. 建议的替代方案 (username/pwd) 引入了另一层。现在我们需要管理用户名和密码,存储它等
  3. 现有的实现 (OAuth 2) 已经成熟,经过测试等

我对 OpenAuth 的做事方式相当陌生,所以我想在告诉工程师“感谢您的意见,但我们不打算介绍 username/pwd; 相反,我们将信任我们的客户来保护应用程序的秘密。"

想法? TIA.

当您添加另一层 username/passwords 时唯一改变的是,当密码被泄露时,您只需在系统中更改密码,而不是在 Cognito 中。

如果您想让您的客户能够自行更改或重置他们的密码,并且您不想让他们访问 Cognito(通过 GUI 或通过某些代理),那么建议的方法可能会有用由您创建)。否则,第二层 username/password.

完全没有附加价值