Никогда не кодируйте конфиденциальную информацию (учетные данные, пароли и т. Д.) . Вместо этого создайте файл для хранения этой информации в виде переменных среды (пары ключ / значение) и исключите этот файл из системы управления исходным кодом. Например, с точки зрения Git (системы управления исходным кодом), исключите этот файл, добавив его в. gitignore :
-bash> echo '/config/app_environment_variables.rb' >> .gitignore
/ конфигурации / app_environment_variables.rb
ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'
Также добавьте следующие строки в /config/environment.rb
между строкой require
и строкой Application.initialize
:
# Load the app's custom environment variables here, so that they are loaded before environments/*.rb
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)
Вот и все!
Как сказано в комментарии выше, тем самым вы будете загружать переменные среды до environments/*.rb
, что означает, что вы сможете ссылаться на свои переменные внутри этих файлов (например, environments/production.rb
). Это большое преимущество перед помещением файла переменных среды в /config/initializers/
.
Внутри app_environment_variables.rb
нет необходимости различать среды по development или production , потому что вы никогда не будете фиксировать этот файл в своей системе управления исходным кодом, поэтому он предназначен для разработка контекст по умолчанию. Но если вам нужно установить что-то особенное для среды test (или для случаев, когда вы тестируете production mode local ), просто добавьте условный блок ниже все остальные переменные:
if Rails.env.test?
ENV['HTTP_USER'] = 'testuser'
ENV['HTTP_PASS'] = 'testpass'
end
if Rails.env.production?
ENV['HTTP_USER'] = 'produser'
ENV['HTTP_PASS'] = 'prodpass'
end
При каждом обновлении app_environment_variables.rb
перезапускайте сервер приложений. Предполагая, что вы используете Apache / Passenger или rails server
:
-bash> touch tmp/restart.txt
В вашем коде используйте переменные окружения следующим образом:
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
Обратите внимание, что внутри app_environment_variables.rb
необходимо указать логические и числа в виде строк (например, ENV['SEND_MAIL'] = 'false'
не просто false
, а ENV['TIMEOUT'] = '30'
не просто 30
), иначе вы получите ошибки can't convert false into String
и can't convert Fixnum into String
соответственно.
Хранение и передача конфиденциальной информации
Последний узел, который нужно связать: как поделиться этой конфиденциальной информацией со своими клиентами и / или партнерами? В целях обеспечения непрерывности бизнеса (т. Е. Когда вас ударит падающая звезда, как вы клиенты и / или партнеры возобновляют полную работу сайта?), ваши клиенты и / или партнеры должны знать все учетные данные, необходимые для вашего приложения. Пересылка по электронной почте / скайп этих вещей вокруг небезопасна и приводит к беспорядку. Хранить его в общедоступных Документах Google неплохо (если все используют https), но приложение, предназначенное для хранения и обмена маленькими крошками, такими как пароли, было бы идеальным решением.
Как установить переменные окружения на Heroku
Если у вас есть одна среда на Heroku:
-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'
Если у вас несколько сред на Heroku:
-bash> heroku config:add HTTP_USER='staguser' --remote staging
-bash> heroku config:add HTTP_PASS='stagpass' --remote staging
-bash> heroku config:add HTTP_USER='produser' --remote production
-bash> heroku config:add HTTP_PASS='prodpass' --remote production
Форман и .env
Многие разработчики используют Foreman (установленный с Heroku Toolbelt ), чтобы запускать свои приложения локально (в отличие от использования подобных Apache / Passenger или rails server
). Форман и Heroku используют Procfile
для объявления того, какие команды выполняются вашим приложением , поэтому переход от локального разработчика к Heroku в этом отношении беспроблемен. Я использую Foreman и Heroku в каждом проекте Rails, поэтому это удобство очень велико. Но вот в чем дело ... Форман загружает переменные окружения, хранящиеся в /.env
, через dotenv , но, к сожалению, dotenv, по сути, анализирует файл только для key=value
пар ; эти пары не становятся переменными тут же и тогда, поэтому вы не можете ссылаться на уже установленные переменные (чтобы сохранить вещи СУХИМЫМИ), и вы не можете делать там «Ruby» (как отмечено выше с условными обозначениями), что вы можете делать в /config/app_environment_variables.rb
. Например, с точки зрения сохранения вещей СУХИМ, я иногда делаю что-то вроде этого:
ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO'] = ENV['SUPPORT_EMAIL']
Следовательно, я использую Foreman для локального запуска своих приложений, но я не использую его .env
файл для загрузки переменных среды; скорее я использую Foreman в сочетании с подходом /config/app_environment_variables.rb
, описанным выше.