当使用 WSO2 作为移动应用程序的 API 网关时,如何安全地处理 comsumer-key 和秘密

When using WSO2 as API gateway for mobile app, how to handle comsumer-key and secret securely

我们正在构建一个移动应用程序及其 API 服务器,其架构如下图所示。

我们将 WSO2 作为 API 网关,位于 Spring 引导 API 服务器之前。我们使用 WSO2 API 管理器来限制谁可以调用 APIs。只有在我们的 WSO2 上注册并拥有正确的消费者密钥和秘密的客户端才能通过 WSO2 调用 API,客户端首先调用 WSO2 的令牌端点以使用访问令牌交换消费者密钥和秘密,然后使用 header Authorization: Bearer <access token>

中的访问令牌调用所需的 API

我们有一个问题,我们不知道如何为消费者保密,因为安全审计禁止我们将秘密存储在移动应用安装程序包中。

有些问题已经提出,例如

WSO2 API Manager - How does mobile app connect to API Manager?

WSO2 Api Manager OAuth2 DCR security in public native mobile app

但没有任何答案正确指出问题所在。他们中的大多数人被 oauth2 流程的复杂性误导了。

为了使问题具体清楚,请假设我们的手机没有用户登录。这个问题的目标是只允许受信任的移动应用程序通过 WSO2 调用 API。

请帮忙建议是否可行。或者我们别无选择,只能允许任何人调用 API。或者 WSO2 的消费者订阅功能根本就不是为直接从移动应用程序使用而设计的?

您可能需要阅读 OAuth 2.0 for Native Apps [RFC7636] 规范。它指出:

Public native app clients MUST implement the Proof Key for Code Exchange (PKCE [RFC7636]) extension to OAuth, and authorization servers MUST support PKCE for such clients, for the reasons detailed in Section 8.1.

也检查下面的答案。

经过一些研究,我发现了 2 个人们通常会做的选择。

  1. 将 API 分成两组。第一组包含 API 需要在没有用户登录的情况下使用,例如 API 用于获取初始化数据或获取应用程序着陆页的数据。 Thease APIs 设置为 public,允许任何人在没有 clientId 和 secret 的情况下调用。秒组包含需要令牌的安全 APIs。移动应用程序可以使用 Oauth2 PKCE 流程来交换具有用户身份证明的令牌。

  2. 混淆 clientId 和 secret 并将它们保存在移动应用安装程序包中。 APIs 仍然像以前一样分成两组。但第一组需要 client-level 令牌(oauth2 客户端凭据类型),第二组需要 user-level 令牌(资源所有者密码或授权码类型)

我更喜欢选项2。在我看来,我认为第一个选项没有什么意义。选择这个选项的人,也许只是为了绕过安全审计检查列表,to not store the secret in public client,而不真正关心安全问题。这就像当您不相信您的孩子可以安全地保管好您家的钥匙时,您决定将门锁取下。

保护每个 API 并将密钥保存在客户端中。即使某些黑客可以设法找到秘密,他也只能破解第一组的 API 并且您可以跟踪他使用的 clientId。您知道客户端的预期行为,因此很容易设置警报来检测来自客户端的恶意活动并撤销令牌、重置密码并推出更复杂的混淆算法。