Отсутствует `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

Всякий раз, когда вы хотите изменить свой секретный ключ, следуйте приведенным выше шагам. Не записывайте его в файл по соображениям безопасности.