在 React 应用程序中使用 API 密钥

IT技术 reactjs security frontend api-key
2021-04-19 12:10:55

我有一个使用两个第三方服务的 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}`

谷歌关于处理 API 密钥最佳实践提示说:

不要直接在代码中嵌入 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 密钥不是仍在捆绑包中吗?

说我按照谷歌说的去做

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

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

3. 是否有在 React 应用程序中使用 API 密钥的规范方式?还是由个人开发人员决定?

不言自明,我正在寻找解决这个问题的react方式,如果有的话。

谢谢您的帮助!

1个回答

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

回答 1:请查看添加自定义环境变量以了解如何添加您作为示例显示的类型的环境变量。

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

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

3. 是否有在 React 应用程序中使用 API 密钥的规范方式?还是由个人开发人员决定?

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

您在答案 1 中提供的链接说:“警告:不要在您的 React 应用程序中存储任何秘密(例如私有 API 密钥)!”。
2021-05-27 12:10:55
答案 3 在我看来否定了做出反应的优势。如果您的端点都是外部 api 怎么办?现在我们需要一个后端来保护凭证,而且,我们基本上为每个请求引入了两个 api 调用?似乎必须有更好的方法
2021-06-19 12:10:55
至于 QA 3 - 我想知道用于 oAuth 服务的密钥怎么样,通常的做法是让客户端使用它们。我可以想象一种方法,它的服务器使用 api 令牌,然后返回一次 url 以便客户端与 oAuth 对话,但这将是额外的东西,并且很可能在大多数现有情况下都不支持......
2021-06-21 12:10:55