在Node.js中,存储敏感凭据的最佳方法是什么?

4
我几天前开始学习Node.js,现在遇到一个关于数据库凭证和Gmail连接(最后需要用于nodemailer)的问题。
我主要创建了这样一个文件:
const config = {
    development: {
        url: '127.0.0.1',

        database: {
            host: 'mongodb://localhost',
            port: '27017',
            db: 'foo'
        },

        gmail: {
            username: 'foo@gmail.com',
            password: 'foo',
        },

        server: {
            host: '127.0.0.1',
            port: '3000'
        }
    },

    production:{
        url: 'https://my.site.com',

        database: {
            host: '127.0.0.1',
            port: '27017',
            db: 'foo'
        },
        gmail: {
            username: 'foo@gmail.com',
            password: 'foo',
        },

        server: {
            host: '127.0.0.1',
            port: '3000'
        }
    }
};

module.exports = config;

我不喜欢在应用程序中输入这些信息,因此经过一些研究,我找到了这个库:dotenv。该库将信息存储在process.env属性内,但本质上是相同的... 为什么我应该更喜欢像dotenv这样的解决方案,而不是我的config模块呢?
你有什么建议吗?

你的配置模块对所有人可见,因为每个环境的dotenv都不同。例如,在开发环境中,.env文件具有特定于开发服务器的条目。 - eagle
@MonicaGarud,您的建议是使用dotenv而非JavaScript配置文件,对吗? - sfarzoso
请使用dotenv而不是JavaScript配置。 - eagle
2个回答

6

我强烈推荐使用dotenv,这也是它被创建的目的。然而,我特别建议使用dotenv-safe npm包。相比于dotenv,它提供了升级功能。

由于您不会将包含敏感数据的.env.xy文件上传到版本管理系统(如Git),因此您可能会很快混淆应该将哪些变量放入环境文件中,特别是在团队工作时。

假设Adam创建了一个新的环境变量,在他的代码中使用并推送了代码。由于环境文件在.gitignore文件中,只有当你的代码尝试使用该变量并崩溃时,你才能注意到Adam引入了一个新的环境变量。然而,如果使用dotenv-safe,你可以将你的.env.example文件和有效的键一起推送到Git中,但值都是伪造的,例如MY_API_KEY=somerandomgibberish,而真实值会存在于.env.production文件中,例如MY_API_KEY=aaf347xkhskallmtopsecret

如果你刚从Git拉取了一个文件.env.example ,但你的真实.env文件(在这种情况下是.env.production)与之不一致,dotenv-safe将不允许你运行应用程序。这样,当你启动你的应用时,你会发现Adam添加了他的新环境变量。

这样,一旦应用程序具有了.env.example中预定义的所有变量,就不会出现任何意外行为,从而保护您免受长期来自大量头痛和数千次不必要的重新部署。


我的问题是,我该如何使用CI工具在生产环境中为应用程序提供.env.production文件,因为我不能提交该文件,所以在自动部署期间如何将其挂钩回来? - Dev Yego
1
抱歉,刚刚意识到了这条评论。你必须在部署提供商处设置一个选项,例如:Heroku / Github CI,以提供环境变量(请参见:此链接)。 - f4z3k4s

3
您使用了dotenv包,因为它会创建一个文件并将其保存到您的进程中,而config.js不会保存在进程中。
但是我为什么要保存在进程中呢?
首先:凭据永远不会被推送到Git或任何其他版本控制系统。如果我们不将此文件推送到Git,并且在一段时间后克隆它,程序将崩溃。但在这种情况下,如果我使用Process.env属性,程序将不会崩溃。
其次,如果我们有大型团队,我们还可以对进程文件进行额外的安全性保护,但对JavaScript文件进行额外的安全性保护,因为开发团队应该可以访问这些文件以进行编辑和其他操作。
这对于更多信息非常有用:使用dotenv和convict管理Node.js应用程序中的配置

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接