繁体   English   中英

使用用户存储的第三方 API 密钥的最佳实践?

[英]Best practice to use User's stored third party API keys?

我正在构建一个应用程序,它要求用户存储他们的第三方 API 密钥和秘密,以便在我的应用程序中使用第三方服务。 我已将这些密钥安全地存储到数据库中并散列了秘密。 但我不知道如何在我的应用程序中使用第三方服务的最佳实践。 在我的应用程序的前端或后端使用它是否更好。

对于前端选项,我需要从前端应用程序的数据库中调用 api 密钥和秘密。 然后需要进行第三方 api 调用,以便从第三方提取数据和信息。 但这不会潜在地暴露用户 api 密钥吗?

或者从后端,但我需要从服务器调用第三方服务,然后将该信息发送到前端以显示给用户。 怕多少调用和加载时间。

可能经常需要来自第三方服务的这些数据。 设置一个websocket并从后端调用会更好吗?

提前致谢

首先考虑存储 API 密钥的最佳实践(您已经提到将它们存储在数据库中,所以您的方式是正确的,仍然是一个很好的提及):

  1. 不要将 API 密钥直接嵌入代码中。
  2. 不要将 API 密钥存储在应用程序源树内的文件中,或任何浏览器存储选项(sessionStorage、localStorage、cookie...)中
  3. 尝试将您的 API 密钥限制为仅由需要它们的 IP 地址、引荐来源网址或移动应用程序使用。
  4. 将您的 API 密钥限制为仅可用于某些 API 或仅授予它们工作所需的权限(例如,如果您的应用只需要从该第三方服务读取信息,则不要生成具有写入权限的 API 密钥)。

您可以在每个平台文档中搜索有关安全使用 API 密钥的最佳实践的更多文档(以下是使用 Google Cloud Platform API 密钥的 Google 建议https://support.google.com/googleapi/answer/6310037

现在,对于您描述的用法,我看到了几种解决方案,我将尝试揭示每种方法的优缺点:

  1. 使用您的后端处理对第三方服务的请求:就像您之前提到的,这种方法将允许您避免 API 密钥暴露给客户端应用程序,但是如果您的应用程序没有足够的安全性并且容易受到例如,XSS 或 CSRF 攻击,无论您是否在数据库中妥善保护了 API 密钥,攻击者都可能访问您的目标用户通过您的应用程序可以访问的任何信息。 您的后端仍然需要处理它通常会处理的所有请求,加上从数据库中获取 API 密钥的查询,以及后端需要使用该 API 密钥向第三方服务发出的请求。
  2. 在您的前端处理第三方请求:对于这种方法,您将遇到与 XSS 和 CSRF 攻击相同的潜在安全问题(我不是网络安全专家,但据我所知,这两种被认为是最常见的可以通过前端应用程序访问您的安全后端信息的攻击,如果我错了,请任何网络安全专家纠正我)。 但是,如果您的前端应用程序是安全的并且您正确处理 API 密钥,并将它们存储在内存中(例如在 redux 中)而不是任何浏览器存储中,那么您前端可以处理对第三方服务的请求,您将避免后端的潜在瓶颈。
  3. 使用带有微服务的 API 网关,仅处理对第三方服务的请求,并将 API 密钥存储在像 Redis 这样的内存数据库中:在我看来,这可能是最好的方法。 您的后端不会承担任何费用超载,因此您可以避免潜在的瓶颈,您的前端不会暴露任何敏感信息,因为这些信息将由专门用于此单一任务的服务处理。 唯一的缺点是,如果您不使用微服务架构,这可能是最难构建的方法。 我使用 Apollo Gateway (GraphQL) 开发了一个应用程序,该应用程序处理了一个类似于您需要使用的用例,您可以在 Apollo 文档https://www.apollographql.com/docs/federation/v1/上阅读有关此内容的信息网关/

总结:如果你有足够的时间,或者如果你可以不费吹灰之力地在后端开发一个 API 网关,那么我认为选项 3 可能是最适合你的选项。 相反,如果选项 3 太难实现或太耗时,那么在您的情况下,我宁愿选择选项 2,同时考虑前端应用程序的最佳安全实践。

您可以在https://owasp.org/www-project-top-ten/上阅读有关 Web 应用程序安全性的更多信息,特别是对于 React 应用程序,这篇中等文章可能会对您有所帮助https://medium.com/strands-tech-corner /前端-应用程序-安全-b1ea9999cd02

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM