【问题标题】:Securing a web app against authorization API without revealing credentials在不泄露凭据的情况下保护 Web 应用不受授权 API 的影响
【发布时间】:2021-10-27 23:40:40
【问题描述】:

我有一个网络应用 MyWebApp。

还有两个 API:MyAuthAPI 和 MyServiceAPI,都是 RESTful NodeJS。 MyAuthAPI 使用 HashiCorp Vault 作为 OAuth2 的令牌存储。

MyServiceAPI 具有可供经过身份验证的客户端使用的 CRUD 操作。

在 MyWebApp 上不需要(或不需要)人工登录。任何人都可以通过浏览器访问 MyWebApp 并运行该服务。

目前,这是(非常不安全的)流程: MyWebApp 将 clientid 和 clientsecret 发送到 MyAuthAPI 以检索令牌。然后使用此令牌与 MyServiceAPI 进行通信。

明显的缺点是任何人都可以通过在 Web 浏览器中查看开发人员工具来捕获 clientid 和 clientsecret。然后,他们可以使用它们通过 MyAuthAPI 进行身份验证,生成自己的令牌,并在不涉及 MyWebApp 的情况下调用 MyServiceAPI。

那么,我如何最好地保护整个应用程序,以便在不泄露凭据的情况下安全可靠地对 MyWebApp 进行身份验证?

谢谢。

预计到达时间: 我希望能够使用 MyAuthAPI 对 MyWebApp 进行身份验证,然后使用生成的令牌连接到 MyServiceAPI。但我不希望任何人都可以拦截这些凭据 - 目前它们可以在请求标头中看到为“授权:基本”

必须保护 MyServiceAPI 端点,以便只有经过身份验证的客户端才能访问它们。但是,当该客户端 (MyWebApp) 是公共网站时,如何在不显示凭据的情况下进行身份验证?

ETA2:

https://mywebapp.com is MyWebApp which is a React application.
https://myauthapi.com hosts MyAuthAPI
https://myserviceapi.com hosts MyServiceAPI

当我在网络浏览器中加载 mywebapp.com 时,它会使用 myauthapi.com/oauth/token 进行身份验证以获取令牌。目前,它通过在标头 Authorization: Basic 中发送凭据来实现这一点

然后保存返回的令牌。 然后,Web 应用程序尝试使用此令牌从 MyServiceApi 上的端点获取数据: 授权:承载

GET https://myserviceapi.com/objects
or POST myserviceapi.com/objects
or GET myserviceapi.com/objects/objectid
or DELETE myserviceapi.com/objects/objectid

MyServiceAPI 使用 MyAuthAPI 验证令牌,但这不是面向公众的,因此没有问题。

问题是,正如您在 Chrome 中的开发者工具控制台的附加屏幕截图中看到的那样,任何使用 Web 应用程序的人都可以看到包含凭据的 Authorization 标头,然后可以使用这些凭据以编程方式访问auth API 生成一个令牌,然后可以在服务 API 端点上使用该令牌。 我想将对 API 服务器的所有访问限制为仅来自 mywebapp.com 上的特定应用程序,例如 MyWebApp。

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • @JoyoWaseem 我添加了更多信息。是不是更清楚了?
  • MyServiceAPI 不是 MyWebApp 中的服务?如果是,你是什么意思:“......并在不涉及 MyWebApp 的情况下调用 MyServiceAPI”?您不是说“在不涉及 MyAuthAPI 的情况下调用 MyServiceAPI”吗?
  • 简而言之,您无法在客户端应用程序中保护您的 API 密钥!你可以像@OhadR 所说的那样使用body。建议使用 Nginx 作为节点 RestApi 的代理服务器,然后以某种方式配置 Nginx,以便它可以接收来自您希望允许的域的请求。

标签: node.js authentication oauth-2.0 credentials hashicorp-vault


【解决方案1】:

首先,我认为这个问题最好在https://softwareengineering.stackexchange.com/ 中提出。

第二,MyWebApp部署在哪里?它是如何被使用的?如果和https一起工作,那么body是加密的,当你发送clientId和clientSecret时,你应该在body中发送,这样用户将看不到它们。

【讨论】:

    【解决方案2】:

    Client Credentials Grant 只能由机密客户使用。那是因为您无法在非机密客户端上隐藏 client_secret。您的前端似乎是非机密客户端。

    通常您应该将授权代码授予与 PKCE 一起使用。但是您需要用户为此进行身份验证。

    【讨论】:

      【解决方案3】:

      感觉您需要基于标准流程的架构设计,因为 OAuth 应该像这样工作:

      • Web 应用使用授权代码流 (PKCE) 通过授权服务器登录用户
      • Web 应用从授权服务器获取令牌
      • Web 应用使用访问令牌调用 API
      • API 使用来自授权服务器的数据验证令牌
      • API 然后信任访问令牌中的声明并使用它们进行授权

      请参阅我的 Initial HTTP Messages 博客文章以了解其外观示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-16
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 2016-05-02
        • 2016-09-24
        • 2016-01-11
        • 2016-09-08
        相关资源
        最近更新 更多