Отсутствует `secret_token` и` secret_key_base` - Rails 4.2.0 с RVM
Недавно я вытащил один из моих репозиций из Git. После запуска сервера я получаю следующее: Отсутствует secret_token и secret_key_base.
Это может произойти, потому что я включил secrets.yml в свой .gitignore.
Моя текущая настройка
- Ubuntu 14.04
- ruby 2.2.0p0
- rails 4.2.0
- rvm 1.26.11
- локальный сервер (не удаленный)
- среда разработки
Многие онлайн-ресурсы заявляют, что я должен генерировать новый ключ с помощью rake secret
и добавлять его в файл secrets.yml. Размещение ключа внутри secrets.yml и перезапуск сервера рельсов не работает.
Отредактировано: Добавлено содержимое secrets.yml ниже. -04/30/15 9:04 утра EST
development:
secret_key_base: LONG KEY HERE
test:
secret_key_base: LONG KEY HERE
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Пожалуйста, знайте, что это установлено как среда разработки на локальном сервере по месту моего проживания (не Heroku).
Состояние других ресурсов. Мне нужно добавить запись внутри моего secret_token.rb
, но этот файл не существует в моем проекте.
Единственным способом запуска моего приложения является создание файла secret_token.rb
и добавление в него одного из следующих элементов:
MyApp::Application.config.secret_token = if Rails.env.development? or Rails.env.test?
('x' * 30) # meets minimum requirement of 30 chars long
else
ENV['SECRET_TOKEN-']
end
или
MyApp::Application.config.secret_token = 'the secret key'
Почему этот файл требуется, когда Rails docs заявляет, что он удаляет его?
3.3 config/secrets.yml
Secret_token.rb не требуется для запуска для новых сгенерированных проектов, только те из моего Git repo.
Пожалуйста, сообщите, почему мое приложение требует secret_token.rb, хотя документы Rails заявляют иначе, или мое приложение не будет работать без него.
Отредактировано: -04/30/15 9:27 AM EST
Еще одно странное поведение: я могу переименовать secrets.yml
, пока secret_token.rb
останется на месте, и приложение все равно будет работать.
Я попытался переименовать secret_token.rb
, добавленный <%= ENV["SECRET_KEY_BASE"] %>
в развитие, и я все еще испытываю проблему Missing secret_token.
Отредактировано: Добавлено Git repo ниже. -05/08/15 2:50 утра EST
git repo: https://github.com/captain-awesome/blog_mac
Что-то странное, если я должен изменить любой из 32 символов, сохраните secret_token.rb, перезагрузите сервер... мое приложение запустится. Является ли 32-символьная строка в файле secret_token.rb тем, что я могу сделать самостоятельно? Если да, то какова реальная цель секретного рейка?
Ответы
Ответ 1
Вы запускаете свой сервер локально в процессе разработки или в какой-либо другой среде (например, на производстве Heroku)? Потому что, если вы работаете на Heroku, вам нужно удалить secrets.yml
из вашего .gitignore
, чтобы Heroku мог выяснить, что такое секретный ключ. Безопасный способ обращения с этим заключается в том, чтобы хранить секретный ключ в качестве переменной окружения на Heroku и указывать на него secrets.yml
(см. Ниже).
Если вы работаете локально, вы можете удалить свой secret_token.rb
, если у вас установлен secret_key_base
для каждой среды внутри вашего файла secrets.yml
. Вы не публиковали свое мнение, но оно должно выглядеть примерно так:
development:
secret_key_base: somerandomkey
test:
secret_key_base: somerandomkey
staging:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Ответ 2
Как и в случае с Rails 4.1, существует новый способ для хранения секретов.
В Rails 4.1+, вам нужно config/secrets.yml
- не удалять его! Я могу видеть в репозитории GitHub, вы используете Rails 4.2 и этот файл отсутствует. Вот почему вы видите эту ошибку. (Примечание: если у вас все еще есть файл secret_token.rb, удалите его. Rails 4.1+ больше не использует его).
Я рекомендую использовать dotenv rails.
Добавить и зафиксировать config/secrets.yml:
default: &default
secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
development:
<<: *default
test:
<<: *default
staging:
<<: *default
production:
<<: *default
Всякий раз, когда вы запускаете рельсы, вам нужно убедиться, что вы устанавливаете переменную environement системы SECRET_KEY_BASE
. С помощью вышеуказанного файла YAML вам необходимо убедиться, что эта переменная среды установлена на любом компьютере, запускающем ваше приложение Rails в любой среде. Главное, это то, как эта переменная задана, может варьироваться в зависимости от того, где/на какой машине.
На локальном компьютере (дома) создайте файл с именем .env
с секретом:
echo SECRET_KEY_BASE=`rake secret` > .env
rails server
Вам нужно создать этот файл только один раз. Когда рельсы начнут, dotenv прочитает этот файл .env
и соответствующим образом установит переменную environement SECRET_KEY_BASE
. Не делайте этого файла - на самом деле, я рекомендую добавить его к вашему .gitignore
.
Позже, при развертывании на сервере удалить сервер (сервер производства/развертывания) все будет по-другому. Возможно, вам понадобится использовать SSH для установки переменной окружения. На Heroku вы можете войти в свою панель инструментов приложения и установить значение среды (или использовать config:set
в Heroku Toolbelt).
Изменить: Примечание. Я не изобретал это. Это подход, используемый Suspenders.
Ответ 3
Простой способ генерации вашего токена и ключевой базы:
bundle exec rake secret
Теперь вы получите длинную строку, например:
ddf4a6d37a956089984c8fe6160a6e3c18e48a448a07a50e4ab10a4edd6d3597f13ad9b6e0af4f5723f1ef52bfd2ffa78ab5b815d2bb8b15f14f48e7e307baad
скопируйте ту же строку, которую вы получили на вашем терминале /CMD
Не запускайте эту команду:
export SECRET_KEY_BASE=ddf4a6d37a956089984c8fe6160a6e3c18e48a448a07a50e4ab10a4edd6d3597f13ad9b6e0af4f5723f1ef52bfd2ffa78ab5b815d2bb8b15f14f48e7e307baad
rails s -e production
Всякий раз, когда вы хотите изменить свой секретный ключ, следуйте приведенным выше шагам. Не записывайте его в файл по соображениям безопасности.