我应该在哪里存储节点服务器上的密钥?

时间:2015-11-06 00:32:19

标签: node.js

好吧,我遇到了一个问题。如何存储不应该转到我的公共版本控件的密码,数据库URL和重要字符串?

我想出了3个解决方案。 第一个仅适用于开发者:

var config = require('./config');
var port = config.serverPort;

config.js

module.exports = {
  'serverPort' : '8182'
}

第二一个应该在dev和prod上工作。但是config.js文件已添加到 .gitignore 文件中,因此不会上传到服务器。当服务器尝试要求 config.js 并且找不到它时,它将引发错误。

var config = require('./config');
var port = process.env.PORT || config.serverPort;

第三仅使用process.env变量,但这仅适用于生产。而且,如果我在本地计算机上进行测试,我可能需要粘贴我的秘密字符串并记得在发送到公共版本控件之前将其删除。

那么,我该怎么办?

4 个答案:

答案 0 :(得分:12)

常见的解决方案是将config.js.example文件添加到版本控制(包含空/虚拟值以记录可用的内容)。

然后将config.js添加到.gitignore(或适合您的VCS的任何内容)。

要运行您的应用程序,您只需将config.js.example复制到config.js并输入正确的值即可。

当然,config.js的路径可以从环境变量中获取,以便轻松使用不同的配置 - 但是,您仍然不会将实际的配置文件置于版本控制之下(除非您有一个单独的私人仓库配置文件等)

总是要求配置文件存在才有意义。即使在开发中。虽然默认设置可能是合适的,但您的应用程序上的许多开发人员仍然想要配置内容或者只是使用非默认值测试内容。

答案 1 :(得分:2)

这是我的建议:

<强> 1。使用文件和env变量的混合

您可以使用配置文件和process.env变量混合来管理密钥字符串。

您可以这样做:

var port = process.env.PORT || config.serverPort;

从现在起,使用docker是规则,你应该试试这个。

<强> 2。使用样本

您可以使用您应定义的变量示例向您的仓库中添加config.json.example,但在此处,您必须记住在部署到生产时更改它。

请记住将真实的config.json添加到.gitignore文件中。 这个不是我的首选,但仍然是一个选择。

答案 2 :(得分:2)

dotenv包可用于将.env文件中的配置和机密加载到process.env。对于生产,.env文件不一定存在。

示例:

require('dotenv').config();

const oauth2 = require('simple-oauth2').create({
  client: {
    id: process.env.TWITTER_CONSUMER_KEY,
    secret: process.env.TWITTER_CONSUMER_SECRET
  }
});

.env文件:

TWITTER_CONSUMER_KEY=bMm...
TWITTER_CONSUMER_SECRET=jQ39...

的.gitignore:

.env

答案 3 :(得分:1)

有一个节点程序包使用其凭据系统来处理类似于Ruby On Rails的方法:schluessel

它使您可以将机密信息保存在加密的Vault文件中,并分别存储密钥。只要您将密钥文件保密,就可以将该vauft文件签入版本控制系统。

您可以为不同的NODE_ENV创建文件文件。 如果您通过密钥文件或环境变量交出密钥, 您可以从您的应用程序中轻松访问凭据。