我有一个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密钥方面的best practice tips项研究表明:

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

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

1. How to use variables in 100?

在我的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. Doesn't the API key still end up in the bundle?

如果我照谷歌说的做,我

... 将它们存储在环境变量或外部文件中

假设我把一个密钥存储在一个外部文件中.我认为,该文件将在某个时刻被读取,其内容要么在包中复制,要么以其他方式引用.最后,除了可能更难找到外,密钥在包中不是仍然可见吗?这到底有什么帮助?

3. Is there a canonic way of using API keys in a react app? Or is it up to the individual developer?

不言而喻,我正在寻找解决这个问题的方法,如果有的话.

谢谢你的帮助!

推荐答案

1. How to use variables in index.html?

Answer 1 :请浏览Adding Custom Environment Variables,了解如何添加示例中所示类型的环境变量.

2. Doesn't the API key still end up in the bundle?

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

3. Is there a canonic way of using API keys in a react app? Or is it up to the individual developer?

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

Reactjs相关问答推荐

MUImaterial -ui-如何将文本字段和 Select 分组?

URL参数和React路由中的点

我想删除NextJs中的X轴标签APEXCHARTS

Redux工具包-useSelector如何通过Reducer引用InitialState?

在新屏幕上显示照片时出现问题-react

React组件未出现

useEffect不重新渲染

FabricJS反序列化问题

Yup.number().integer() 不将 1.0 视为小数,如何解决这个问题?

在 useSelector() 中使用 array.map() 如何导致组件在分派操作时重新渲染?

使用登录保护 React 中的 SPA 应用程序 - 为什么这种方法不起作用?

Redux Toolkit 配置,是否适用于全栈应用程序?

使用带有搜索字符串的全局过滤器时如何在 React-Table 中进行精确匹配?

将复杂状态和 setState 传递给更简单的 api

react-admin useGetIdentity 只返回全名,id 未定义 头像未定义

如何在 react-router-dom v6 中实现监听功能?

在 React 中使用使用状态挂钩合并两个数组

在 redux 状态更改时更新react 按钮禁用状态

Context Api React 的问题

警告:您在没有 `onChange` 处理程序的情况下为表单字段提供了 `value` 属性