2016-11-25 58 views
0

我正在完成一个节点快递应用程序,其中我有一个用于Sendgrid和Stripe的API密钥,但我不确定如何将这些存储在将部署在Heroku上的应用程序中还有一些其他变量,我想存储类似的数据库密码和什么不)。我在网上看到很多人在使用process.env,所以在看了一些后我尝试使用dotenv npm,甚至在尝试使用dotenv作为我的sendgrid密钥后,应用程序的结构出现问题,我每次都会遇到错误。在Heroku的快递节点中存储API密钥

我的问题是有人可以提供一些详细的说明或安全的方式在我的节点快递应用程序中存储API密钥,我将部署到Heroku?

P.S.我跟着一个教程,通过Facebook,谷歌和linkedIn实现Oauth2的Passport.js,以便用户可以轻松登录到应用程序。应用程序的秘密,id和回调是从应用程序中的文件夹调用配置中的json文件中检索的。这些信息是否至少在应用程序中的安置和检索中是安全的?我应该为我的sendgrip和stripe api键做些类似的事吗? (下图)

enter image description here

回答

1

您可以设置您的文件夹目录如下:

config

config.js

var config = {}; 
//development 
var env = process.env.NODE_ENV || 'development'; 
if(env === 'development'){ 
    config = require('./env/development'); 
}else if (env === 'test'){ 
    config = require('./env/test'); 
} else if(env === 'production'){ 
    config = require('./env/production'); 
} 

module.exports = config; 

development.js

var envFile = __dirname + '/env.json'; 
var jsonfile = require('jsonfile'); 

var envVars = jsonfile.readFileSync(envFile); 

module.exports = { 
    value: envVars["VALUE"] 
}; 

production.js

module.exports = { 
    value: process.env.VALUE 
}; 

test.js

module.exports = { 
    value: 'Some value' 
}; 

这里的基本思想是每个开发人员可以在自己的env.json文件来配置自己的密钥。对于生产,您可以将它们存储在某个安全的文件中,然后将它们加载到环境中,然而在运行应用程序之前需要将其加载。使用heroku,可以轻松配置这些环境变量并将其存储起来。检查出来here

你也可以省略任何细节,你可能不需要像开发或测试的东西。

编辑:一个例子

在命令行试试这个第一个获得正在发生的事情的想法。在这个例子中,我使用的是Linux。如果您正在使用其他任何方法,只需研究如何在您正在使用的命令行中设置环境变量即可。

app。JS

var config = require('./config/config'); 
//get value from config 
var value = config.value; 

从bash命令行

$: VALUE="my value" 
$: NODE_ENV="production" 
$: export VALUE 
$: export NODE_ENV 

运行应用程序设置环境变量

$: node app.js 

,或者如果你正在使用NPM脚本

$: npm start 

当您运行应用程序节点时,将自动加载process.env与在命令行shell中定义的每个可变环境。现在,如果您使用的是heroku,您可以按照我之前在此答案中发布的链接进行操作,而不必设置它们。只需在heroku界面中定义它们,它会为你加载它们。

+0

感谢您的快速反应,但我有问题,所有关于确保我知道每一步发生了什么。 1)我假设process.env.NODE_ENV将由我设置,因为shell或Heroku系统在部署时将使其生成'生产',因此它不会默认为开发,是正确的吗? 2)您在开发代码片段中添加的'envFile'是否包含我的密钥的所有KEY = VALUE对,或者是否将它放在您放置在底部的'module.exports'部分中,如果这是情况下,在'envFile'中发生了什么?很抱歉。我想知道最新情况以及... – KellysOnTop23

+0

是的,正确的。是的,它将是标准的JSON。就像这个'{“VALUE”:“一些其他的值”}',没有别的。没有'module.exports'。当然,这是我的例子所特有的。你可以使用任何你想要的东西(即从文本文件,yaml,csv中加载)。基本的想法是开发环境应该从你可以放入的文件中加载值,生产在环境变量中定义,并且测试通常是硬编码的。所以,只需要拿出你需要的东西,它就应该适合你。 –

+0

Gotcha。是的,环顾大家提到它,但我没有找到太多明确的解释代码。也许我只是没有看。在我去之前,把它放在我的项目Id中,想再问一个问题。做完这些并以这种方式获得我所有的价值后,它会安全吗?我不是在这里寻找堡垒诺克斯,但只是足够的基础知识覆盖,没有人可以轻松地拿我的钥匙 – KellysOnTop23