使用 Polymer + Firebase 时将密钥存储在哪里?

Where to store secret keys when using Polymer + Firebase?

我正在使用 Polymer + Firebase 开发 Web 应用程序。在我的应用程序中,我试图将它集成到 Slack 中。为了从 Slack 获取访问令牌,我需要使用客户端密钥(由 Slack 生成)对 Slack 进行 api 调用。

问题是,where/how 我应该存储这个客户端密钥吗?在我的 Polymer 应用程序中硬编码这个密钥听起来确实是一个很大的安全性,不,不。

谢谢。

在您的客户端代码中存储秘密听起来是个很糟糕的主意。任何恶意用户都可以在那里获取它。

需要在客户端访问机密的任何其他方式同样存在缺陷。

唯一的解决方案是不需要客户端上存在秘密的解决方案,因此涉及 运行在受信任位置中安装代码的解决方案。通常这将是一台服务器,但不要高估 运行 此类代码所需的硬件数量。在这种情况下需要服务器是为了信任,而不是为了更大的硬件。

参见此 article about common application architectures on Firebase 中的模式 2。

像 API 密钥这样的秘密应该只能由您的服务器代码访问,如果保存到文件,则使用 .gitignore 规则从您的源代码中排除。

  • 使用 firebase config:set 存储您的 Firebase 项目 API 键。
  • 自己创建一个 serverless function,它使用 API 密钥供您的浏览器客户端代码使用。
  • 通过检查身份验证/角色/权限(可选/推荐)来安全访问新的无服务器功能API

更好……只需从您的无服务器函数中调用 Slack API,并且根本不要将密钥暴露给您的浏览器客户端用户。

示例:

$ firebase functions:config:set myapp.apikey=XXX

然后在本地模拟器或部署的代码中你可以使用:

const functions = require('firebase-functions');
const apikey = functions.config().myapp.apikey;
const url = `https://hooks.slack.com/services/${apikey}`
// call Slack API