Использование переменных окружения в NodeJS
Использование dotenv
Безопасное обращение с секретами и API-токенами
Связанная статья: Защитите свои токены
Давайте быстро разберемся в разнице между секретными и несекретными ключами.
- 🔒
Секретные ключиДОЛЖНЫ использовать собственный сервер (например, Node/Express/Heroku), чтобы скрывать (проксировать) запросы к сторонним API-сервисам. - 🌍
Несекретные ключиописывают ключи, которые можно отправлять в браузер.
В этой статье мы сосредоточимся на работе с 🔒
секретными ключамис помощью переменных окружения.
Обзор
Чтобы безопасно получать доступ к секретам в вашем NodeJS-коде:
- Замените захардкоженные ключи переменными окружения. Например:
process.env.API_SECRET - Используйте библиотеку
dotenvвместе с файлом.env. Добавьте ваши ранее захардкоженные секреты в файл.env. - Проверьте наличие строки
.envв вашем файле.gitignore!
НЕ создавайте файл
.envна развернутых серверах. Используйте инструмент управления переменными окружения, предоставляемый вашим хостинг-сервисом (например, Heroku, Netlify, AWS EC2): например, панель управления или командную строку.
Пример кода
Мы собираемся определить несколько файлов.
.env./db/connection.js./api/users.js
Сначала установите пакет dotenv.
npm install dotenvДалее создайте файл .env в корне вашего проекта.
PGDATABASE="postgres"PGHOST="localhost"PGPORT=5234PGUSER="postgres"PGPASSWORD="password"❌ НИКОГДА не коммитьте файл .env.
❌ Избегайте создания .env на серверах.
Обратитесь к документации вашего хостинг-провайдера, чтобы настроить переменные окружения.
Чтобы легко убедиться, что в вашем .gitignore есть строка .env.
# Автоматическое обновление .gitignore# Запустите в терминале:[ "$(grep '^.env' .gitignore)" == "" ] && echo '.env' >> .gitignore# примечание: отсутствие вывода означает успехФайл ./db/connection.js предоставляет общий экземпляр pg.Pool. Он будет использоваться для запросов к базе данных.
require('dotenv').config(); // ✅ Загрузка файла .envconst 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.
const db = require('../db/connection.js');
module.exports = { findUsername: function(username) { return db.query('SELECT * FROM users WHERE username=$1', username); }};- Никогда не коммитьте секреты из
.envв git! - Не передавайте файлы
.envвнутри команды. *
* Каждый новый рабочий ноутбук или десктоп разработчика должен генерировать новые ключи доступа и токены.
Если это невозможно, проявляйте максимальную осторожность при передаче вашего .env (в случаях, когда сервис может аннулировать все старые ключи или у вас есть ограниченный токен доступа к платному API.)
⚠️ Важно: при необходимости всегда используйте защищенные сервисы обмена сообщениями (желательно с поддержкой самоуничтожающихся сообщений.)
Удачи, и дайте знать, если у вас возникнут вопросы! 🎉