Зачем и как помещать секреты в переменные окружения в Node.js? - PullRequest
2 голосов
/ 08 мая 2020

Я относительно новичок в Node.js и Express, и я следовал руководству по добавлению аутентификации с использованием JWT на мой сайт, найденном здесь: Средний . Меня смущает один пункт этого руководства об использовании секретов, в котором говорится:

Этот секрет будет прочитан библиотекой JWT при создании и проверке токенов. В производстве нам нужно хранить этот секрет в переменной окружения, а не в файле.

В руководстве они поместили секрет в файл конфигурации. В sh руководстве описано, почему именно секрет JWT должен быть переменной среды, а не в файле конфигурации, но это довольно расплывчато. Так почему же секреты должны быть переменными среды и каковы другие передовые методы использования секретов? Я решил использовать Passport & Express Sessions для аутентификации вместо JWT, но я думаю, что это все еще применимо к секретам сеанса.

Мой следующий вопрос: как мне точно установить секрет в среде переменная? Я больше не использую руководство, но как кто-то, кто его использует, преобразовал этот файл конфигурации в переменную среды? И, наконец, для чего вы обычно используете переменные среды в типичном приложении Node.js?

1 Ответ

2 голосов
/ 08 мая 2020

Почему секрет должен быть переменной среды, а не храниться в файле конфигурации?

Работая над проектами, вы в конечном итоге загрузите свой код на github, который доступен всем. Если вы храните свои секреты в файле конфигурации, любой, у кого есть учетная запись github, сможет их прочитать, и, следовательно, это угроза безопасности. Хранение секретов в виде переменных среды гарантирует их сохранность. Ваш файл конфигурации должен считывать эти значения из объекта process.env. Примерно так:

const jwtSecretKey = process.env.JWT_SECRET_KEY;
const googleApiKey = process.env.GOOGLE_API_KEY;
const serverPort = process.env.PORT || 8000; // 8000 is the default value in case if the env variable has not been set

module.exports = {
   jwtSecretKey: jwtSectetKey,
   googleApiKey: googleApiKey,
   serverPort: serverPort
}

И любой другой фрагмент кода, использующий эти секреты, должен требовать файл конфигурации.

const config = require('./config');
...

jwt.verify(token, config.jwtSecretKey);

Помимо хранения секретов в виде переменных среды, вы также должны сохранять любые значения c, указанные в среде, как переменные среды. Например, ваш сервер NodeJS (который подключен к размещенной базе данных) работает в трех средах - Development, QA и PROD. Каждая из этих сред будет иметь разную информацию о БД ХОСТ и ПОРТ, к которым должна подключаться среда. Переменные среды - это хороший способ сохранить хост и порт БД в каждой отдельной среде и использовать один и тот же код во всех средах для подключения к разным базам данных путем чтения переменной среды.

Как сохранить значения как переменные среды - один из способов сделать это вручную, хотя я бы не рекомендовал это делать. Один из способов - использовать сценарии оболочки. На самом деле это зависит от вашей инфраструктуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...