【问题标题】:Whitelist web application for API access without API key无需 API 密钥的 API 访问白名单 Web 应用程序
【发布时间】:2022-01-04 13:40:02
【问题描述】:

我们正在开发一个由以下部分组成的网络应用程序 (SPA):

  1. NextJS 容器
  2. 用于用户管理的 Django 后端
  3. 受 API 密钥保护的数据 API (FastAPI),我们还提供第三方访问权限

NextJS 容器使用 API 密钥来访问数据 API。我们不想将 API 密钥暴露给客户端(浏览器),因此浏览器将 API 请求发送到 NextJS 容器,然后将其中继到数据 API,请参阅here。这看起来很安全,但比从浏览器直接向数据 API 发送请求更复杂、更慢。

我想知道是否可以在数据 API 中将 Web 应用程序列入白名单,以便客户端(浏览器)可以在没有 API 密钥的情况下直接调用数据 API,但第 3 方不能。 FastAPI 提供了TrustedHostMiddleware,但它不安全,因为它可能会欺骗主机头。已向whitelist IPs instead 提出建议,但我们的 Web 应用程序没有专用 IP。我研究了使用引用标头,但由于某种原因它在 FastAPI 请求对象中不可用(我怀疑我们的托管中有一些配置问题)。此外,referer 标头也可能被欺骗。

是否有一种安全的方法将我们的 Web 应用程序列入数据 API 访问白名单,或者我们是否需要通过 NextJS 容器中继请求并使用 API 密钥?

【问题讨论】:

  • 不确定我是否理解正确但不是从浏览器发送的 API 请求?您希望将哪些内容列入白名单?
  • @juliomalves 是的,API 请求是从浏览器发送的,但我们不能直接将它们发送到数据 API,因为 API 密钥会在请求标头中显示。相反,我们目前将它们发送到没有 API 密钥的 NextJS 容器,容器将它们中继到添加了 API 密钥的数据 API。白名单可以让我们摆脱这种中继。
  • 是的,我知道了。我没有得到的是您希望将什么列入白名单以实现这一目标,因为每个请求都来自不同的客户?没有来自 Next.js 服务器的中继,每个请求都将直接来自浏览器。
  • 我想将运行 Web 应用程序的域列入白名单。目标是只有我们的 Web 应用程序可以在没有 API 密钥的情况下使用数据 API,而其他人则不能。但也许这只是不可能以一种安全的方式,我们现在已经研究了很多......

标签: rest next.js fastapi api-key websecurity


【解决方案1】:

是否有一种安全的方法可以将我们的 Web 应用程序的数据 API 列入白名单 访问,

不,在所有情况下,您都需要一个身份验证机制,在后端之前检查客户端是否是授权客户端。

最简单的模式是使用 NextJS 容器作为代理。具有调用后端的 api-key 的代理(您当前正在做什么)。

有很多方法可以为后端实现安全代理,但这种身份验证逻辑不应该在后端内部,而是在单独的服务中(如 envoy 、 nginx ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2015-03-27
    相关资源
    最近更新 更多