javascript - 使用 Create React App 创建对象时如何维护隐藏的 API 密钥
问题描述
我正在使用一个.env
文件添加我的 API 密钥来获取远程数据。但是我需要像这样用它们创建一个 API 对象:
const myAPIObject = new fancyAPI({
url: process.env.REACT_APP_FANCYAPI_URL,
consumerKey: process.env.REACT_APP_FANCYAPI_CONSUMERKEY,
consumerSecret: process.env.REACT_APP_FANCYAPI_CONSUMERSECRET
})
我在文件/src
夹中的专用文件中执行此操作。当我编译并检查浏览器中的缩小代码以获取关键文字时,它们就在那里。我该如何正确地做到这一点?
解决方案
基本上,这是 JavaScript 中的一个大问题,你尝试做的任何事情都会导致这个问题。避免这种情况的唯一方法是不这样做。
忘记尝试使用来自客户端 JavaScript 应用程序的 API 密钥与您自己的后端进行通信。任何知道如何使用开发者工具的人都可以看到缩小、混淆或不加密的密钥。这就是为什么您应该不惜一切代价避免这种情况并依赖会话。
至于您的应用程序中需要您与您无法控制的第三方 API 进行通信的任何功能,答案是对您自己的后端进行简单的 CSRF 安全 AJAX 调用,然后让您的服务器端应用程序进行代表您的前端调用 API,然后将响应返回给您的客户端应用程序
(http://billpatrianakos.me/blog/2016/02/15/securing-api-keys-in-a-javascript-single-page-app/)
如您所知,客户端脚本在构建时是静态的,之后不会更改。因此,注入其中的任何变量都将留在那里,并且对寻找它们的人可见。
因此,您的问题的解决方案似乎是实际实现一个服务器应用程序,该应用程序可以隐藏密钥并基于其他不需要客户端向整个世界公开密钥的机制来处理客户端。
推荐阅读
- lua - 您可以不再将要求分配给变量并引用该变量吗
- sql - 在查询如何在 Oracle 中的另一列上按顺序获取一列时
- python-3.x - 为什么在使用 numpy 1.13.3 时从 scipy 导入“comb”会失败?
- cordova - 在ionic 3上使用firebase插件时构建android时出错
- c# - 变量没有在循环外重新评估
- php - 我们在哪里可以找到 wordpress WooCommerce 字段已定义?喜欢(订单 ID:%id%,订单密钥:%order_key%)
- pentaho - 如何从 Pentaho-Kettle 中的 select-sql 获取结果集?
- java - 传递给方法时不将新节点分配给树
- r - 如何在 kable/formattable 表中打印 unicode 符号?
- javascript - Problem with reconnection to replica in mongoose