2016-11-25 56 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