2016-11-25 8 views
0

Я заканчиваю экспресс-приложение узла, где у меня есть ключ API для Sendgrid и Stripe, но я не уверен, как их сохранить в моем приложении, которое будет развернуто на Heroku (также несколько других переменных, которые я хотел бы хранить так же, как пароль db, а что нет). Я видел онлайн много людей, которые использовали process.env, поэтому после некоторого поиска я попытался использовать dotenv npm и даже с некоторыми проблемами со структурой приложения после попытки использовать dotenv для моего ключа sendgrid, я получал ошибку каждый раз.где хранить ключи api в экспресс-узле для Heroku

Мой вопрос: может ли кто-нибудь предоставить некоторые подробные инструкции или способ безопасно хранить ключи API в моем экспресс-приложении узла, которые я буду развертывать в Heroku?

P.S. Я последовал за учебником по внедрению Passport.js для Oauth2 через facebook, google и linkedIn, чтобы пользователи могли легко войти в приложение. Секреты приложения, идентификаторы и обратные вызовы извлекаются из json-файла в конфигурации вызова папки в моем приложении. Является ли эта информация безопасной, по крайней мере, при ее размещении и поиске в приложении? Должен ли я делать что-то подобное для моих ключей sendgrip и strip 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

Вы также можете опустить любые детали, которые вам могут не понадобиться, как разработка или тестирование.

Edit: Пример

Попробуйте это из командной строки первой, чтобы получить представление о том, что происходит. В этом примере я использую linux. Если вы используете что-либо еще, просто изучите, как устанавливать переменные среды в используемой командной строке.

приложение.JS

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

Установите переменные среды из командной строки Баш

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

запустить приложение

$: node app.js 

или если вы используете НПМ скрипты

$: npm start 

При запуске узла приложения автоматически загружается process.env с каждой переменной среды, определенной в оболочке командной строки. Теперь, если вы используете героку, вы можете перейти по ссылке, которую я опубликовал ранее в этом ответе, и вам не нужно их устанавливать. Просто определите их в интерфейсе heroku, и он загрузит их для вас.

+0

Благодарим за быстрый ответ, но у меня есть вопросы, связанные с тем, чтобы убедиться, что я знаю, что происходит на каждом шагу. 1) Я предполагаю, что process.env.NODE_ENV будет либо установлен мной, либо оболочкой, либо система Heroku сделает ее «производственной», когда я развернусь, чтобы она не по умолчанию не была разработана, правильно? 2) Добавляет ли 'envFile' в фрагмент разработки в качестве JSON все пары KEY = VALUE для моих ключей или я помещаю это в часть' module.exports', которую вы разместили внизу, и если это case, что происходит в 'envFile'? Извините. Я хочу знать, что происходит ... – KellysOnTop23

+0

Да, правильно. И да, это будет стандартный JSON. Подобно этому '{" VALUE ":« другое значение »}' и ничего больше. Нет 'module.exports'. Конечно, это характерно для моего примера. Вы можете использовать все, что хотите (т. Е. Загружать из текстового файла, yaml, csv). Основная идея заключается в том, что среда разработки должна загружать значения из файла, который вы можете занести, производство определяется в переменных среды, а тест обычно жестко закодирован. Итак, просто возьмите то, что вам нужно, и оно должно сработать для вас. –

+0

Gotcha. Да, оглядываясь, все говорили об этом, но я не нашел подробного объяснения кода. Может быть, я просто не смотрел. Прежде чем я пойду и положу это в свой проект, я хотел бы задать еще один вопрос. После этого и получения всех моих ценностей на этом пути это будет безопасно? Я не ищу здесь fort knox, но достаточно, чтобы у меня были основы, и никто не может легко взять мои ключи. – KellysOnTop23