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


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?


@mrbrdo так, повідомлення вказує саме те, чого не вистачає, але коли ви відкриваєте файл devise.rb, документації про це немає secret key. Крім того, якщо ви працюєте в новому встановленні, програма повинна подбати про це. Завдяки квитку на github.com/plataformatec/devise/isissue/2554 це було вирішено.

Відповіді:


87

Я побіг bundle updateсьогодні вранці і почав отримувати ту саму помилку.

Я додав його як рядок у, config/initializers/devise.rbі помилка була виправлена.

Здається, це зобов'язання, яке його запровадило.


24
Майбутнє Googlers, На 2014-07-08, stackoverflow.com/questions/18080910 / ... є більш правильною відповіддю на Rails 4+ , щоб уникнути поширення секретів по всій конфігурації.
Захарій Мошанський

3
Станом на 2015-10-30, 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+ ключове налаштування розташування за замовчуванням для вашоїAppName :: Application.config.secret_key_base, знайдене в config / Initiators / secret_token.rb


2
Ну добре знати. Я розумію, що для програми з відкритим кодом дуже погана річ, щоб секретний ключ Devise сидів десь у простому тексті в джерелі, правда? Принаймні цей за замовчуванням дозволяє нам встановлювати динамічні секретні ключі в меншій кількості місць.
Topher Hunt

4
Чи може хтось прописати, що робити з цією інформацією для непрофесіоналів? Дякую!
ahnbizcad

2
Я не бачу цього файлу у своїй програмі. Чи означає це, що рейки g розробляють: установка не працювала успішно? Або ця відповідь уже застаріла?
ahnbizcad

10
Застаріла. secret_token.rb не постачається на Rails 4, замінивши його на config / secrets.yml (див. тут для отримання додаткової інформації). Злегка від теми, але обов’язково включіть config / secrets.yml у свій .gitignore, як це написано в коментарях, створених Rails. Щоб дізнатися, як, перейдіть сюди .
brntsllvn

12

Це вирішило мою проблему:

Додайте код нижче у свій файл config / inicijalizer / devise.rb .

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

Замініть "секретний ключ--" власним ключем. Я рекомендую зберігати його в змінній ENV з метою безпеки.


2
Як \ де ти це робиш і як їх з'єднуєш?
ahnbizcad

3
^ відповідь на це - використовувати дорогоцінний камінь фігаро. github.com/laserlemon/figaro Ви ставите всі фактичні ключі в config / application.ymlfile, gitignore його, щоб вони залишалися в секреті, і посилаєтесь на них в іншому місці вашої програми ENV["your_particular_secret_key_name"]. Потім ваш додаток динамічно посилається на ваші ключі. Але ви розігнали ваші ключі, тож як їх довести до виробничого середовища? Ви натискаєте їх безпосередньо з вашого локального середовища розвитку на heroku за допомогою figaro, і ваші секретні ключі стануть змінними оточення на heroku
ahnbizcad

12

Відповідно до журналу змін :

Devise використовуватиме таємну_захисну базу даних у додатках Rails 4+ як свою таємну ключу. Ви можете змінити це і використовувати свій власний секрет, змінивши ініціалізатор 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
Це анти-модель. Будь ласка, не вказуйте у своєму виробничому секретному ключі.
Зак Браун

10

Можливо, ви не бігали rails g devise:install?

Запуск rails generate devise Userбез попередньої команди викликає цю проблему.


1
Це моя проблема, але як це виправити ...?
C404

Потрібно мати можливість повторно запустити "rails g devise: install" після створення користувачів. Якщо ви використовуєте git, зробіть тестову гілку та спробуйте. Якщо ні, спробуйте це на копії свого проекту.
sascha.daniels

Ось у чому моя проблема. Я видалив додаток (я цього не робив багато) і зробив ще rails g devise userдо того, як спробував створити таблицю користувачів та перемістити. Це вирішило проблему.
Метт

це вирішило ту саму проблему для мене з Rails 5.0.0.beta4 & Devise 4.1.1, але я не знаю чому. Я запустив diff, і єдиний рядок, який змінився в моєму 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.


2
Я думаю, що у цій відповіді є велика проблема безпеки. Якщо ви поставите одинарні лапки навколо "<% = ENV [" SECRET_KEY_BASE "]%> ', як підказує відповідь, то, я думаю, ви отримаєте саме таку строку символів, а не отримуєте інтерпольовану таємну базу ключів. Іншими словами, він буквально викладає ENV ["SECRET_KEY_BASE"], правда?
користувач1515295

Для уточнення використовуйте подвійні лапки: "<% = ENV [" SECRET_KEY_BASE "]%>"
користувач1515295

3
devise.rb - це файл рубіну, а не файл erb. Немає потреби в синтаксисі <% = Просто використовуйте config.secret_key = ENV ["SECRET_KEY_BASE"]
Джон Хіннеган,

6

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

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

у config / inicijalizer / devise.rb Зараз він працює як у виробництві, так і в розробці!


6

Я клонував своє сховище на новій машині від git. The

config/secrets.yml 

файл був у моєму списку .gitignore, так що цей файл не існував, і Devise не створив файл.

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

rails generate devise MODEL

і це спрацювало.


1
ЦЕЙ. Github подумав, що це корисно, додавши secrets.ymlдо свого .gitignoreфайлу. Я не дав йому детально прочитати, і був неясно вражений, що він включає набагато більше, ніж створений .gitignoreфайл Rails . : facepalm:
steve

Так, саме це було моїм питанням. Я повернувся до старої програми git і файл secrets.yml пішов.
ддонче

Просто була ця сама проблема. Додаток, який я використовую для того, щоб слідкувати за підручником, щоб щось не хотіло працювати, тому я клонувався до нового каталогу та скопіював документи автора підручника. Не бачив проблеми, тому я вручну встановив 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

І це оцінили чудово. А після цього я коментував маршрути.


Ідеально, дякую. Була ця проблема при створенні нового проекту, і я забув про те, rails generate devise:installперш ніж створити свою першу модель розробки. Відповідно до цієї відповіді, прокоментував рядок devise_for у маршрутах, потім запустіть команду generation, і вона працює.
користувач208769

я прокоментував devise_forрядок, щоб отримати мій граблі db: переїхати на роботу .. поняття не маю, чому хоча
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
  • capistrano (3.7.1)

1

Натрапив на ту ж проблему з Rails 5.2.0 та Devise 4.4.1

Залиште наступне у /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base

1
це менш безпечно у виробництві і ускладнює зміни у разі порушення безпеки.
лакостенікодер

0

Спроба дати кілька більш повну відповідь на ті вище: Як уже згадувалося в devise_auth_token дорогоцінного каменю документації

... Крім того, ви можете налаштувати інші аспекти розробки, вручну створивши традиційний файл 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"] %>'

Цей рядок коду вирішив мою проблему.


конфігурація не буде оцінювати рубінові ракети <%= %>як стропову інтерполяцію. Потім вашим ключем буде буквально те, що ви набрали всередині рядкового ' what ever the %he!@#$ you type here is your key no matter what characters'
буквалу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.