Разработать секретный ключ не был установлен

99

Я разрабатываю приложение Rails 4 с использованием гема Active Admin для административной части. Active Admin, в свою очередь, использует Devise для аутентификации пользователей. Теперь, когда я пытаюсь развернуть приложение, используя capistranoна сервере VPS, я получаю следующую ошибку:

rake aborted!
Devise.secret_key was not set. Please add the following to your Devise initializer:
config.secret_key = '-- secret key --'

Поиск в Google не помогает устранить эту ошибку. Любые предложения, почему он выдает ошибку? Следует ли мне добавить секретный ключ в deviseинициализатор, так как я не могу найти места для установки такого ключа конфигурации initializers/devise.rb?

шарвер2
источник
@mrbrdo да, в сообщении точно указано, чего не хватает, но когда вы открываете файл devise.rb, документации по нему нет secret key. Также, если вы запускаете новую установку, приложение должно позаботиться об этом. Благодаря тикету на github.com/plataformatec/devise/issues/2554 он был решен.

Ответы:

87

Я побежал bundle updateсегодня утром и начал получать ту же ошибку.

Я добавил это как строку, config/initializers/devise.rbи ошибка была исправлена.

Похоже, это коммит, который его ввел.

Брайан Вайнер
источник
24
Будущие гуглеры, по состоянию на 8 июля 2014 г. stackoverflow.com/questions/18080910/… является более правильным ответом для Rails 4+, чтобы избежать распространения секретов по всей конфигурации.
Zachary Moshansky
3
По состоянию на 30 октября 2015 г. stackoverflow.com/a/32525855/1842747 является лучшим ответом, но я настоятельно рекомендую сразу перейти к настройке SECRET_KEY_BASEпеременной среды, а не копировать ее, secrets.ymlчтобы вы не забыли, что ваш «секретный ключ» это еще не секрет!
monozok
38

То, что у меня работало на Rails 4.1 и Devise 3.2.4, находится в config/initializers/devise.rb:

config.secret_key = ENV['DEVISE_SECRET_KEY'] if Rails.env.production?
Пол Одеон
источник
Или, если вы используете figaroдрагоценный камень:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Александр
33

Начиная с Devise 3.2.3 для приложений Rails 4+, местоположение ключевой настройки по умолчанию - YourAppName :: Application.config.secret_key_base, найденное в config / initializers / secret_token.rb

Брэндон Кук
источник
2
Ах, хорошо знать. Я понимаю, что для приложения с открытым исходным кодом очень плохо, когда секретный ключ Devise находится где-то в виде обычного текста в источнике, верно? По крайней мере, это значение по умолчанию позволяет нам устанавливать динамические секретные ключи в меньшем количестве мест.
Topher Hunt
4
Может кто-нибудь объяснить, что делать с этой информацией для непрофессионалов? Спасибо!
ahnbizcad
2
Я не вижу этого файла в своем приложении. Означает ли это, что rails g devise: install не сработал? Или этот ответ уже устарел?
ahnbizcad
10
Устаревший. secret_token.rb не входит в комплект Rails 4, он был заменен на config / secrets.yml ( дополнительную информацию см. здесь ). Немного не по теме, но обязательно включите config / secrets.yml в ваш .gitignore, как сказано в сгенерированных Rails комментариях. Чтобы узнать, как это сделать, перейдите сюда .
brntsllvn
12

Это решило мою проблему:

Добавьте приведенный ниже код в свой файл config / initializers / devise.rb .

config.secret_key = '-- secret key --' 

Замените '- secret key--' своим собственным ключом. Я рекомендую хранить его в переменной ENV в целях безопасности.

Жан-Николас Холд
источник
2
Как \ где вы это делаете и как вы их соединяете?
ahnbizcad
3
^ ответ на этот вопрос - использовать драгоценный камень фигаро. github.com/laserlemon/figaro Вы помещаете все свои фактические ключи в файл config / application.ymlfile, gitignore его, чтобы они оставались секретными, и ссылаетесь на них в другом месте вашего приложения таким образом ENV["your_particular_secret_key_name"]. Затем ваше приложение динамически ссылается на ваши ключи. Но вы используете gitignored свои ключи, так как же их перенести в производственную среду? Вы отправляете их прямо из вашей локальной среды разработки в heroku с помощью figaro, и ваши секретные ключи в конечном итоге превращаются в переменные среды на heroku
ahnbizcad
12

Согласно журналу изменений :

Devise будет использовать secret_key_base в приложениях Rails 4+ в качестве secret_key. Вы можете изменить это и использовать свой секрет, изменив инициализатор devise.rb.

Я пошел config/secrets.ymlи изменил productionзначение.

Перед:

production: 
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

После:

production: 
  secret_key_base: string of charaters

Конечно, это должно быть установлено в переменной окружения, которую я установлю позже, но это, по крайней мере, запустило ее. Я получил свою строку, используя bundle exec rake secret.

Эрик
источник
11
Это антипаттерн. Пожалуйста, не возвращайте свой производственный секретный ключ.
Zack Brown
10

Неужели ты не сбежал rails g devise:install?

Запуск rails generate devise Userбез предыдущей команды вызывает эту проблему.

sascha.daniels
источник
1
Это моя проблема, но как ее исправить ...?
C404 07
После создания пользователей должна быть возможность повторно запустить "rails g devise: install". Если вы используете git, сделайте тестовую ветку и попробуйте. Если нет, попробуйте его на копии вашего проекта.
sascha.daniels
Вот в чем была моя проблема. Я удалил приложение (я мало что сделал) и сделал это rails g devise userдо того, как попытался создать таблицу пользователей и выполнить миграцию. Это устранило проблему.
Мэтт
это решило ту же проблему для меня с Rails 5.0.0.beta4 и Devise 4.1.1, но я не уверен, почему. Я провел сравнение, и единственная строка, которая изменилась в моем devise.rb, помимо другого секретного ключа, была + 102: "config.stretches = Rails.env.test?? 1: 11"
Cleverlemming
10

В config/initializers/devise.rbI поставил:

config.secret_key = ENV["SECRET_KEY_BASE"] if Rails.env.production?

Потому что если поставить:

$ heroku config

Вы увидите значок secret_key_baseдля режима production.

rld
источник
2
Я думаю, что в этом ответе есть большая проблема с безопасностью. Если вы заключите "<% = ENV [" SECRET_KEY_BASE "]%> в одинарные кавычки, как следует из ответа, то я думаю, вы получите именно эту строку символов вместо интерполированной базы секретных ключей. Другими словами, он буквально обозначает ENV ["SECRET_KEY_BASE"], верно?
user1515295
Чтобы уточнить, используйте двойные кавычки: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295 03
3
devise.rb - это файл ruby, а не файл erb. Нет необходимости в синтаксисе <% =. Просто используйте config.secret_key = ENV ["SECRET_KEY_BASE"]
Джон Хиннеган
6

Я решаю проблему с инициализатором с помощью этого уродливого подхода:

config.secret_key = 'some1234keyq23' if Rails.env == 'production'

в config / initializers / devise.rb Теперь он работает как в производстве, так и в разработке!

Андрей Ясинишин
источник
6

Я клонировал свой репозиторий на новую машину из git. В

config/secrets.yml 

файл был в моем списке .gitignore, поэтому этот файл не существует, и Devise не создает его.

Я добавил файл, затем снова запустил

rails generate devise MODEL

и это сработало.

jgrumps
источник
1
ЭТОТ. Github подумал, что было полезно добавить secrets.ymlв мой .gitignoreфайл. Я не стал внимательно его читать и был слегка впечатлен тем, что он включает гораздо больше, чем сгенерированный .gitignoreфайл Rails . : facepalm:
steve
Да, вот в чем была моя проблема. Я вернулся к старому коммиту git, и файл secrets.yml исчез.
ddonche
Просто была такая же проблема. Приложение, которое я использую, чтобы следовать руководству, что-то не должно работать, поэтому я клонировал его в новый каталог и скопировал коммиты автора учебника. Не видел проблемы, поэтому я вручную установил config.secret_key. Узнал только при загрузке моего рельсового сервера. Проголосовал за вас, так что это может быть выше!
Джо
5

Проверьте, есть ли у вас config\initializers\secret_token.rb:

YourAppName::Application.config.secret_token

Так должно быть:

YourAppName::Application.config.secret_key_base
зурберграмма
источник
4

У меня такая же проблема. Проблема была вызвана этими строками в routes.rb:

devise_for :users, :skip => [:registrations]                                                   
as :user do
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'              
  put 'users' => 'devise/registrations#update', :as => 'user_registration'                      
  get '/users/sign_out' => 'devise/sessions#destroy'                                            
end

Я их прокомментировал и после этого бегу:

$ rails generate devise:install

И это оценено отлично. И после этого раскомментировал маршруты.

ExiRe
источник
Отлично, спасибо. Была эта проблема с настройкой нового проекта, и я забыл об этом rails generate devise:installдо создания моей первой модели разработки. В соответствии с этим ответом закомментировал строку devise_for в маршрутах, затем запустите команду генерации, и она работает.
user208769
я закомментировал devise_forстроку, чтобы получить мой rake db: migrate to work .. хотя понятия не имею, почему
Clam
1

Что ж, я слежу за этим постом и пробовал здесь почти все. Я добавил ключ в devise.rb. Но я все еще получал ту же ошибку.

Может быть, глупый ответ, но все, что мне нужно было сделать, это вставить devise.rbключ в репозиторий.

Филип Джон
источник
1

Исправить:

  1. На производственном сервере:

    sudo -H nano /etc/environment
  2. Затем в файле добавьте:

    export SECRET_KEY_BASE="yourkey"
    export DEMO03_DATABASE_PASSWORD="yourpass"

    чтобы установить это постоянно, и для всей системы (все пользователи, все процессы) добавить переменную набора

  3. В локальном devise.rbфайле проекта :

    config.secret_key = ENV["SECRET_KEY_BASE"] if Rails.env.production?

Технические подробности:

  • Ubuntu 16.04
  • Разработать (4.2.0)
  • рельсы 5.0.1
  • капистрано (3.7.1)
gotqn
источник
1

Попал в ту же проблему с Rails 5.2.0 и Devise 4.4.1

Поместите следующее в /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base
Бенни Паулино
источник
1
это менее безопасно в производственной среде и затрудняет внесение изменений в случае нарушения безопасности.
lacostenycoder
0

Попытка дать несколько более полный ответ на те выше: Как уже упоминалось в devise_auth_token драгоценного камня документации

... Кроме того, вы можете настроить другие аспекты devise, вручную создав традиционный файл devise.rb по адресу config/initializers/devise.rb. Вот несколько примеров того, что вы можете делать в этом файле:

Devise.setup do |config|   
# The e-mail address that mail will appear to be sent from   
# If absent, mail is sent from "please-change-me-at-config-initializers-devise@example.com"  
config.mailer_sender = "support@myapp.com"

# If using rails-api, you may want to tell devise to not use ActionDispatch::Flash   
# middleware b/c rails-api does not include it.   
# See: http://stackoverflow.com/q/19600905/806956  
config.navigational_formats = [:json] end

У меня была та же проблема, и, как здесь упоминалось, я создал инициализатор устройства и добавил config.secret_key = ENV['DEVISE_SECRET_KEY']к нему строку.

Амит Либер
источник
-1

Я не знаю правильного решения, но оно работает. Можешь попробовать. Мой проект был клонирован из моей учетной записи GitLab, и когда я запускаю на своем локальном сервере, у меня появляется сообщение об ошибке:

rake aborted! Devise.secret_key was not set. Please add the following to your Devise initializer: config.secret_key = '-- secret key --'

Откройте config/initializers/devise.rbи добавьте эту строку

config.secret_key = '<%= ENV["SECRET_KEY_BASE"] %>'

Эта строка кода решает мою проблему.

ОгузТР
источник
config не будет оценивать рубиновые ракеты <%= %>как строковую интерполяцию. Тогда ваш ключ будет буквально тем, что вы ввели внутри строкового литерала' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder