【问题标题】:Hiding API keys in JS setup在 JS 设置中隐藏 API 密钥
【发布时间】:2019-01-07 04:08:33
【问题描述】:

我正在使用 HTML+CSS+JS 设置创建一个简单的 UI,该设置使用需要密钥的第三方 API,我想将密钥保存在一个文件中,我可以 gitignore 并从我的Javascript 文件。我不打算部署这个项目,我只是希望能够将它推送到 GitHub,而不会在每次提交之前临时删除变量。

我发现的所有响应都与 Node.js、React/Webpack 或其他服务器设置有关,但我没有服务器或转译器,也不想添加一堆杂乱无章和配置就为了这个。有没有办法做到这一点?我尝试将它存储在一个单独的 JS 文件中并导入/导出,但要么我无法获得正确的语法,要么我正在尝试的东西需要一个转译器。每次尝试变化都会导致语法错误或未定义的变量。

关键信息:

  1. 这是一个完全在本地运行的项目——就像在我的浏览器中打开index.html一样——所以我认为我不需要担心密钥会暴露在客户端中。
  2. 我的设置几乎只包括index.htmlmain.jsstyle.css
  3. 我想将项目推送到 GitHub,因此我想将 api 密钥作为变量存储在与main.js 分开的文件中,我可以将其添加到.gitignore,但可以在main.js 中访问。
  4. 我在没有框架等的情况下尽可能保持简单。除非它超级简单和轻量级,否则我不想添加库只是为了让它工作。

【问题讨论】:

  • 您使用的是什么无服务器提供商? AWS Lambda?
  • @Paul 我不应该在最初的标题中说无服务器。我的意思是字面意思,如“我根本没有服务器”。不涉及后端,只涉及 index.html、styles.css、main.js 并通过在浏览器中打开 index.html 来运行它。我不知道如何在没有 Node 或某种转译器的情况下配置 .env 文件。我认为答案要么太基本以至于我错过了它,要么不可能创造出过度设计的东西
  • 如果是这样,那么您将 API 密钥发送给客户端,因此使用您的应用程序的每个人都将拥有它。
  • 我不会将它部署给任何人使用,我实际上是在浏览器中打开本地 index.html 文件,所以我认为我不需要担心安全性。不过,我想将项目公开推送到 GitHub,因此我希望能够将密钥保存在 git 可以忽略的文件中。
  • 根据此新信息更新答案。

标签: javascript ecmascript-6 environment-variables api-key


【解决方案1】:

如果你使用MVC,尝试用php variabel 编写。比使用 echo 在脚本 javasript 中打开...

【讨论】:

  • 安全性如何?从字面上看,任何人都可以向该 .php 文件发出请求并查看该秘密。
【解决方案2】:

您最好的选择是从环境本身中提取您需要的任何秘密,无论是您的环境变量还是秘密存储。

具体实施取决于您使用的无服务器提供商,但例如 AWS Lambda 允许您配置环境变量:

https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html

您可以根据自己的偏好和要求使用密钥管理服务或参数存储:

https://aws.amazon.com/blogs/mt/the-right-way-to-store-secrets-using-parameter-store/


保留上述内容,以防人们通过查看无服务器标签找到此内容。下面根据更新后的问题进行更新。

所以,如果我正确理解更新后的问题,您希望将除 API 密钥之外的所有代码签入 git,仅在本地文件系统上提供文件,并让该本地副本能够访问 API 密钥。

最简单的方法是使用另一个 .js 文件来定义相关变量,如下所示:

// config.js
var config = { // this should be const instead if you're using ES6 standards
  apiKey : '123456789XYZ'
}

然后,在 index.html 中有另一个脚本标签,在任何需要配置的脚本之前调用它,例如:

  <script src='./config.js'></script>
  <script src='./main.js'></script>
</body>

在 main.js 中,您将能够引用变量 config 以供使用,同样您可以使用 .gitignore 'config.js'。

【讨论】:

  • 如果您要部署它,那么 config.js 文件是否也需要可公开访问才能从索引页面读取它?哪个也会公开 apikey?
  • 是的,但是如果您检查更新后的问题,他会专门寻找 localhost 部署的解决方案,而不是要发布的东西。
  • 我认为这主要是一种将 api 密钥保留在 repo 之外的方法。我在寻找使用 JS 时隐藏 api 密钥的方法时发现了这个问题。我发现不使用某种服务器端语言是没有办法的。
  • @Sl4rtib4rtf4st 是的,没错。尽管您可能会使用 Firebase 的方法,即拥有一个“公共”API 密钥,该密钥与服务器上的用户身份相交以计算权限等。
  • 好吧,之前没听说过。谢谢,我会调查的。