DanLevy.net

Использование переменных окружения в NodeJS

Использование dotenv

Hero image for Использование переменных окружения в NodeJS

Безопасное обращение с секретами и API-токенами

Связанная статья: Защитите свои токены

Давайте быстро разберемся в разнице между секретными и несекретными ключами.



В этой статье мы сосредоточимся на работе с 🔒 секретными ключами с помощью переменных окружения.

Ниже приведены примеры кода.

Обзор

Чтобы безопасно получать доступ к секретам в вашем NodeJS-коде:

  1. Замените захардкоженные ключи переменными окружения. Например: process.env.API_SECRET
  2. Используйте библиотеку dotenv вместе с файлом .env. Добавьте ваши ранее захардкоженные секреты в файл .env.
  3. Проверьте наличие строки .env в вашем файле .gitignore!

НЕ создавайте файл .env на развернутых серверах. Используйте инструмент управления переменными окружения, предоставляемый вашим хостинг-сервисом (например, Heroku, Netlify, AWS EC2): например, панель управления или командную строку.

Пример кода

Мы собираемся определить несколько файлов.

  1. .env
  2. ./db/connection.js
  3. ./api/users.js

Сначала установите пакет dotenv.

Terminal window
npm install dotenv

Далее создайте файл .env в корне вашего проекта.

.env
PGDATABASE="postgres"
PGHOST="localhost"
PGPORT=5234
PGUSER="postgres"
PGPASSWORD="password"

НИКОГДА не коммитьте файл .env.

❌ Избегайте создания .env на серверах.

Обратитесь к документации вашего хостинг-провайдера, чтобы настроить переменные окружения.

Чтобы легко убедиться, что в вашем .gitignore есть строка .env.

Terminal window
# Автоматическое обновление .gitignore
# Запустите в терминале:
[ "$(grep '^.env' .gitignore)" == "" ] && echo '.env' >> .gitignore
# примечание: отсутствие вывода означает успех

Файл ./db/connection.js предоставляет общий экземпляр pg.Pool. Он будет использоваться для запросов к базе данных.

./db/connection.js
require('dotenv').config(); // ✅ Загрузка файла .env
const pg = require('pg');
const {PGUSER, PGHOST, PGPORT} = process.env;
if (process.env.NODE_ENV === 'development')
console.log(`Connecting to ${PGUSER} @ ${PGHOST}:${PGHOST}`);
// ^^ только для отображения отладочных переменных подключения
// pg автоматически использует переменные окружения PG*
module.exports = new pg.Pool();

Папка ./api содержит интерфейсы к вашим таблицам/представлениям.

Вот пример ./api/users.js для таблицы users.

./api/users.js
const db = require('../db/connection.js');
module.exports = {
findUsername: function(username) {
return db.query('SELECT * FROM users WHERE username=$1', username);
}
};

* Каждый новый рабочий ноутбук или десктоп разработчика должен генерировать новые ключи доступа и токены. Если это невозможно, проявляйте максимальную осторожность при передаче вашего .env (в случаях, когда сервис может аннулировать все старые ключи или у вас есть ограниченный токен доступа к платному API.)

⚠️ Важно: при необходимости всегда используйте защищенные сервисы обмена сообщениями (желательно с поддержкой самоуничтожающихся сообщений.)

Удачи, и дайте знать, если у вас возникнут вопросы! 🎉