我们的应用程序公开了当前仅由我们的 UI 使用的 REST API。 UI 目前使用 OIDC 授权代码流程对用户进行身份验证,这需要用户与授权服务器(在本例中为 AWS Cognito)交互。
我们需要为客户提供一种通过我们的应用程序进行身份验证的方法,并以“M2M”友好的方式使用他们自己的集成客户端应用程序(而不是我们的 UI)调用我们的 API。意思是,我们希望他们能够从他们开发的 python 脚本调用我们的 API,或者从他们的应用程序将数据 POST 到我们的 API。
工程提出的解决方案:
我们被告知使用这样的 API 密钥是不安全的,相反,我们应该实现 OAuth2 客户端凭证流程(使用私钥 JWT 方法)。
我的问题:
客户应通过他们自己的 API 将请求路由到您的 API。从您的问题来看,有点不清楚您的数据是否与客户的用户有关系。例如,您是否存储映射到特定用户的资源?
OAUTH 流程
使用客户端凭证等 OAuth 流程的好处包括:
tenant_id
声明和范围,以减少特权和被盗令牌的影响在您的 API 密钥解决方案中,攻击者可能能够长时间重放被盗的凭证,无论它是否经过哈希处理和加盐处理。此外,服务器漏洞可能会泄露所有客户的 API 密钥,因为攻击者可以散列和加盐窃取的值并重新发送它们。
用户身份验证
当用户存在时,您运行代码流并始终对用户进行身份验证。其工作原理取决于 OAuth 和 OIDC 标准中授权服务器的实现(以及如何配置它)。如果您澄清了客户用户与 API 的关系,我将对此进行扩展。可能是代码流程是正确的流程,而不是授权服务器。
提供商
您应该花一些时间来识别 OAuth 支持的标准化流程和安全行为。您选择的解决方案可能还取决于数据敏感性、风险和您的上市时间。
如果您选择 OAuth,请澄清您的要求并在向提供商做出承诺之前进行概念验证。基于标准的解决方案使您的选择保持开放,并保持您的代码和安全标准。