【问题标题】:Using API keys in a react app在 React 应用中使用 API 密钥
【发布时间】:2018-03-31 23:18:04
【问题描述】:

我有一个使用两个第三方服务的 React 应用程序。该应用程序是使用react-create-app 启动的。

这两项服务都需要 API 密钥。

通过脚本标签提供一个键,如下所示:

<script type="text/javascript" src="https://myapi?key=MY_KEY">
</script>

请求中使用了另一个 API 密钥。我将实际密钥存储在一个常量中并使用它来形成请求。像这样:

const MY_OTHER_KEY = 'MY_OTHER_KEY'
let url = `http://myotherapi?key=${MY_OTHER_KEY}&q=${query}`

Google 关于处理 API 密钥的 best practice tips 说:

不要将 API 密钥直接嵌入代码中

这就引出了我的第一个问题:

1. index.html中的变量如何使用?

在我的index.html 文件中,我有两个如下所示的标签:

<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">

显然,%PUBLIC_URL%是一个变量。如何添加变量 %MY_KEY% 以避免将 API 密钥直接嵌入到我的代码中?

要得到这样的东西:

<script type="text/javascript" src="https://myapi?key=%MY_KEY%">
</script>

与这个问题相关,将 API 密钥存储在常量中是否安全,就像我为 MY_OTHER_KEY 所做的那样?

谷歌还说:

不要将 API 密钥存储在应用程序源代码树内的文件中

这就引出了我的第二个问题:

2。 API 密钥不是仍然在捆绑包中吗?

说我按照 Google 所说的去做

... 将它们存储在环境变量或您的外部文件中 应用程序的源代码树

假设我将密钥存储在外部文件中。我假设,该文件将在某个时候被读取,其内容要么复制到包中,要么以其他方式引用。最后,除了可能更难找到之外,钥匙在捆绑包中是否仍然可见?这究竟有什么帮助?

3.是否有在反应应用程序中使用 API 密钥的规范方法?还是取决于个人开发者?

不言自明,我正在寻找解决此问题的反应方式,如果有的话。

感谢您的帮助!

【问题讨论】:

  • IMO 你已经以“反应”的方式将其存储为常量。不知道他们还希望你做什么。

标签: reactjs security frontend api-key


【解决方案1】:

1.如何在 index.html 中使用变量?

答案1:请通过Adding Custom Environment Variables了解如何添加您作为示例显示的类型的环境变量。

2。 API 密钥不是仍然在捆绑包中吗?

答案 2: 即使您将密钥 (MY_KEY) 作为脚本标记中的环境变量,它也会在页面上呈现并可见。通常,这些是浏览器密钥,旨在用于客户端。这些可以通过在您的请求中提供 Http Referer 标头来限制。更多关于保护这些密钥here 的功效。但是 API 密钥(如 MY_OTHER_KEY)不应该在客户端使用,也不应该在脚本标签中呈现或存储在客户端 JS 中。

3.是否有在反应应用程序中使用 API 密钥的规范方法?还是取决于个人开发者?

答案 3: 使用第三方 API 密钥的规范方法是让您的客户端应用程序向您的后端 API 发送请求。然后,您的后端 API 根据第三方 API 格式化请求,添加密钥并调用第三方 API。一旦它收到响应,它可以解包并将其转换为前端应用程序可以理解的域对象,或者将原始响应发送回前端应用程序。这样,API 密钥就留在后端,永远不会发送到客户端。

【讨论】:

  • 至于 QA 3 - 我想知道用于 oAuth 服务的密钥如何,通常的做法是让客户端使用它们。我可以想象一种方法,其中服务器使用 api 令牌,然后返回一个时间 url 让客户端与 oAuth 对话,但这将是一些额外的东西,而且在大多数现有情况下很可能不支持......
  • 答案 3 让我觉得否定了反应的优势。如果您的端点都是外部 api 怎么办?现在我们需要一个简单的后端来保护凭证,而且,我们为每个请求引入了两个 api 调用,基本上?似乎必须有更好的方法
  • 您在答案 1 中提供的链接说:“警告:不要在您的 React 应用程序中存储任何机密(例如私有 API 密钥)!”。
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多