Использует ли Rails 4.2 secret_token?

Нужны ли как secret_key_base, так и secret_token для производства в Rails 4.2? Ни один из параметров не приводит к следующему сообщению об исключении:

Отсутствуют secret_token и secret_key_base для "производственной" среды, установите эти значения в config/secrets.yml

Руководство по обновлению до версии 4.2 (http://railsapps.github.io/updating-rails.html) говорит следующее:

Когда вы создаете новое приложение Rails с помощью команды rails new, создается уникальный секретный ключ, который записывается в файл config/initializers/secret_token.rb.

Но такой файл не был создан, когда я создавал свое приложение, и в config/secrets.yml нет ссылки на secret_token.

Я предполагаю, что сообщение об ошибке неверно и требуется только secret_key_base. Когда я запускаю свое приложение в рабочей среде на своей машине разработки, оно начинается только с secret_key_base, но в Engineyard установка secret_key_base (через переменную среды) не работает. Я все еще получаю сообщение об ошибке.


person J Plato    schedule 27.02.2015    source источник


Ответы (4)


Проблема, которую вы видите на Engine Yard, заключается в том, что переменная окружения secret_key_base (пока) не существует по умолчанию. Это то, над чем мы работаем. Вы можете установить это самостоятельно, используя собственный шеф-повар; Я предлагаю поговорить с нашей службой поддержки для получения дополнительной информации об этом.

Что касается фактической ошибки, которую вы получаете, я только что протестировал совершенно новое приложение Rails 4.2 («rails new foo»), чтобы увидеть, генерирует ли оно secret_token.rb, а это не так. Я думаю, что здесь вам нужно создать config/secrets.yml, и этот файл должен выглядеть так:

development:
  secret_key_base: somekey

test:
  secret_key_base: someotherkey

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Теперь, когда вы видите ENV["SECRET_KEY_BASE"], это то, где у Engine Yard есть небольшая изюминка — мы пока не предоставляем это из коробки. Пока ваше репо является частным, вы можете жестко закодировать что-то там самостоятельно. В противном случае использование пользовательского шеф-повара может привести к тому, что вы создадите базу секретных ключей и поместите ее в скрипт-оболочку, отвечающий за запуск рабочих процессов вашего приложения (например, config/env.custom на нашей платформе).

Надеюсь это поможет.

person J. Austin Hughey    schedule 27.02.2015
comment
Кроме того, это может ответить на некоторые ваши вопросы о секретном токене и секретном_ключе: guides.rubyonrails.org /upgrading_ruby_on_rails.html#action-pack - person J. Austin Hughey; 27.02.2015
comment
Спасибо за быстрый ответ. Я также не получил файл secret_token.rb при создании приложения (поэтому я предполагаю, что он больше не используется), и мой автоматически сгенерированный файл secrets.yml выглядит точно так же, как вы разместили здесь. Что касается отсутствия поддержки ENV[SECRET_KEY_BASE] из коробки, могу ли я использовать гем dotenv, а не помещать его в файл? - person J Plato; 27.02.2015
comment
Гем dotenv не будет работать на нашей платформе, потому что у нас есть собственные сценарии-оболочки, которые мы используем для установки переменных среды перед выполнением сервера приложений (например, Unicorn). Таким образом, пока он будет работать в разработке на вашем локальном компьютере, в производстве вам необходимо изменить /data/‹appname›/shared/config/env.custom, который является файлом, который ДОЛЖЕН быть изменен пользовательским шеф-поваром, поскольку все файлы должны следует рассматривать как одноразовые, а управление конфигурацией считается наилучшей/обязательной практикой. - person J. Austin Hughey; 28.02.2015
comment
Мне пришлось создать файл secret_token.rb и поместить туда мой secret_token, за исключением того, что он загружает его из среды. Это сработало для меня. - person Nick Res; 06.04.2015

4.2 использует секретный ключ, и ссылка, которую вы разместили, содержит решение, которое вы ищете.

В среде, в которой секретный ключ не активен, вам необходимо сгенерировать его с помощью rake secret, а затем поместить вывод из консоли в файл config/initializers/secret_token.rb (вы можете создать его, если его нет).

У вас есть возможность не использовать secrets.yml. Многие люди предпочитают использовать другой гем/процедуру (например, figaro) для обработки секретной информации. Чтобы упростить себе жизнь, вы можете просто поместить эту информацию в файл secret_token.rb и двигаться дальше — или вы можете изучить различные другие идиоматические способы разрешения ситуации.

person Ecnalyr    schedule 27.02.2015
comment
Но почему в сообщении об ошибке Rails говорится, что необходимо установить как secret_key_base, так и secret_token? Это просто ошибка? И я использую переменную среды для установки secret_key_base в secrets.yml вместо того, чтобы помещать ключ в файл. Таким образом, мне не нужно его игнорировать, и мне не нужно заново создавать его вручную при каждом развертывании. - person J Plato; 27.02.2015
comment
@JPlato Я думаю, что ошибка просто ссылается на secret_key_base и secret_token по отдельности, но традиционно вы просто устанавливаете secret_key_base в файле secret_token.rb. Честно говоря, я не слишком уверен в специфике ошибки, я просто знаю, что у меня есть приложение 4.2, использующее этот secret_key_base, и я едва заметил его конфигурацию во время процесса развертывания. Таким образом, решение должно быть простым, и кажется, что сообщение об ошибке просто делает вещи более запутанными, чем они должны быть. Я также обновил свой ответ, чтобы быть более ясным. - person Ecnalyr; 27.02.2015
comment
Спасибо, @Ecnalyr. Я думаю, ты прав. Я думаю, что проблема, с которой я столкнулся, согласно ответу Дж. Остина Хьюли, заключается в неспособности Engineyard установить это через ENV. - person J Plato; 27.02.2015

По крайней мере, Rails 4.2.2 дал мне ту же ошибку, но установка переменной окружения SECRET_KEY_BASE в файле .bash_profile пользователя rails решила проблему для меня, так что немного о secret_token кажется фиктивным - вероятно, пережиток из более ранних версий.

Сгенерируйте секрет командой rake secret, затем используйте сгенерированную строку в файле .bash_profile следующим образом:

export SECRET_KEY_BASE='the_output_of_the_rake_secret_command'
person Teemu Leisti    schedule 27.08.2015

Я бы предложил повторно создать новое приложение с установленной последней версией Rails.

Этот файл был автоматически сгенерирован в моем последнем проекте:

# config/secrets.yml
# Be sure to restart your server when you modify this file.

# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!

# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rake secret` to generate a secure secret key.

# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.

development:
  secret_key_base: fooooo

test:
  secret_key_base: fooooo

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Я также рекомендую вам сравнить сгенерированные файлы через сайт railsdiff (пример: http://railsdiff.org/4.1.10.rc2/4.2.1.rc2), так как похоже, что вы обновляетесь со старой версии.

person Michael De Silva    schedule 27.02.2015
comment
Я использую Rails 4.2.0, и у меня есть тот же автоматически сгенерированный файл secrets.yml, который вы показываете. Но на мой вопрос, где в игру вступает secret_token? В сообщении об ошибке говорится, что нужно установить оба, что, как я полагаю, неверно. В руководстве по обновлению сказано, что сгенерирован файл config/secret_token.rb — есть ли он в вашем приложении? - person J Plato; 27.02.2015
comment
Вы ссылаетесь на неофициальный источник — этот сайт railsapp устарел, отсюда и проблема, которую вы видите. Нет файла secret_token.rb, созданного в соответствии с генератором приложений (по умолчанию). См. ответ Остина Хьюи для конкретной информации о машинном дворе. Спасибо! - person Michael De Silva; 03.03.2015
comment
Хорошо, спасибо, Майкл. Но к вашему сведению - фактическое сообщение об ошибке, сгенерированное Rails 4.2, также говорит, что оба должны быть установлены (цитируется в моем исходном вопросе), поэтому это немного сбивает с толку. - person J Plato; 03.03.2015
comment
Привет @JPlato, я помню, что видел это - это может быть ошибка в сообщении об ошибке; возможно уже исправлено. - person Michael De Silva; 05.05.2015