Devise Secret Key nie został ustawiony


99

Rozwijam aplikację Rails 4 przy użyciu perełki Active Admin dla zaplecza administracyjnego. Active Admin z kolei używa Devise do uwierzytelniania użytkowników. Teraz, gdy próbuję wdrożyć aplikację capistranona serwerze VPS , pojawia się następujący błąd:

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

Wyszukiwarka Google niewiele robi w przypadku tego błędu. Jakieś sugestie, dlaczego wyrzuca błąd? Czy powinienem dodać tajny klucz do deviseinicjatora, ponieważ nie mogę znaleźć miejsca na ustawienie takiego klucza konfiguracyjnego initializers/devise.rb?


@mrbrdo tak, komunikat mówi dokładnie, czego brakuje, ale po otwarciu pliku devise.rb nie ma dokumentacji na ten temat secret key. Również jeśli uruchamiasz nową instalację, aplikacja powinna się tym zająć. Dzięki zgłoszeniu na github.com/plataformatec/devise/issues/2554 został rozwiązany.

Odpowiedzi:


87

Pobiegłem bundle updatedziś rano i zacząłem otrzymywać ten sam błąd.

Dodałem go jako wejście liniowe config/initializers/devise.rbi błąd został naprawiony.

Wydaje się, że jest to zatwierdzenie, które go wprowadziło.


24
Przyszli Googlersi, od 08.07.2014, stackoverflow.com/questions/18080910/… jest bardziej odpowiednią odpowiedzią dla Rails 4+, aby uniknąć rozprzestrzeniania tajemnic w całej konfiguracji.
Zachary Moshansky,

3
Od 30.10.2015 najlepszą odpowiedzią jest stackoverflow.com/a/32525855/1842747 , ale zdecydowanie zalecam przejście od razu do ustawienia SECRET_KEY_BASEzmiennej środowiskowej zamiast jej kopiowania, secrets.ymlaby nie zapomnieć, że Twój „tajny klucz” nie jest wystarczająco tajne!
monozok

38

To, co działało na Railsach 4.1 i Devise 3.2.4, to config/initializers/devise.rb:

config.secret_key = ENV['DEVISE_SECRET_KEY'] if Rails.env.production?

Lub jeśli użyjesz figaroklejnotu:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander

33

Począwszy od Devise 3.2.3 dla aplikacji Rails 4+, lokalizacja ustawień klucza jest domyślnie ustawiona na YourAppName :: Application.config.secret_key_base w config / initializers / secret_token.rb


2
Dobrze wiedzieć. Rozumiem, że to bardzo zła rzecz dla aplikacji open source, aby tajny klucz Devise znajdował się gdzieś w źródle w postaci zwykłego tekstu, prawda? Przynajmniej to domyślne ustawienie pozwala nam ustawić dynamiczne tajne klucze w mniejszej liczbie miejsc.
Topher Hunt

4
Czy ktoś może przeliterować, co zrobić z tymi informacjami dla osób niebędących profesjonalistami? dzięki!
ahnbizcad

2
Nie widzę tego pliku w mojej aplikacji. Czy to oznacza, że ​​rails g devise: install nie powiodło się? A może ta odpowiedź jest już nieaktualna?
ahnbizcad

10
Przestarzały. Secret_token.rb nie jest dostępny w Rails 4, został zastąpiony przez config / secrets.yml (zobacz tutaj po więcej informacji). Trochę poza tematem, ale pamiętaj, aby dołączyć config / secrets.yml do swojego .gitignore, tak jak jest to napisane w komentarzach generowanych przez Railsy. Aby dowiedzieć się, jak to zrobić, przejdź tutaj .
brntsllvn

12

To rozwiązało mój problem:

Dodaj poniższy kod do pliku config / initializers / devise.rb .

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

Zastąp „- tajny klucz--” własnym kluczem. Ze względów bezpieczeństwa zalecam przechowywanie go w zmiennej ENV.


2
Jak \ gdzie to robisz i jak je łączysz?
ahnbizcad

3
^ odpowiedzią na to jest użycie klejnotu figaro. github.com/laserlemon/figaro Umieszczasz wszystkie swoje aktualne klucze w pliku config / application.yml, rejestrujesz je gitignore tak, aby pozostały tajne, i odwołujesz się do nich w innym miejscu aplikacji ENV["your_particular_secret_key_name"]. Następnie aplikacja dynamicznie odwołuje się do kluczy. Ale gitignorowałeś swoje klucze, więc jak przenieść je do środowiska produkcyjnego? Wysyłasz je bezpośrednio ze swojego lokalnego środowiska programistycznego do Heroku za pomocą figaro, a Twoje tajne klucze staną się zmiennymi środowiskowymi na heroku
ahnbizcad

12

Zgodnie z dziennikiem zmian :

Devise będzie używać secret_key_base w aplikacjach Rails 4+ jako swojego klucza tajnego. Możesz to zmienić i użyć własnego sekretu, zmieniając inicjator devise.rb.

Poszedłem do config/secrets.ymli zmieniłem productionwartość.

Przed:

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

Po:

production: 
  secret_key_base: string of charaters

Oczywiście powinno to być ustawione na zmienną środowiskową, którą ustawię później, ale to przynajmniej ją uruchomiło. Otrzymałem swój ciąg za pomocą bundle exec rake secret.


11
To jest anty-wzór. Nie sprawdzaj swojego tajnego klucza produkcyjnego.
Zack Brown

10

Czy to możliwe, że nie uciekłeś rails g devise:install?

Uruchomienie rails generate devise Userbez poprzedniego polecenia powoduje ten problem.


1
To jest mój problem, ale jak to naprawić ...?
C404

Powinno być możliwe ponowne uruchomienie "rails g devise: install" po utworzeniu użytkowników. Jeśli używasz git, stwórz gałąź testową i wypróbuj ją. Jeśli nie, wypróbuj to na kopii swojego projektu.
sascha.daniels

Na tym polegał mój problem. Usunąłem aplikację (niewiele zrobiłem) i zrobiłem to rails g devise userzanim spróbowałem utworzyć tabelę użytkowników i przeprowadzić migrację. To rozwiązało problem.
Matt,

rozwiązało to ten sam problem z Railsami 5.0.0.beta4 i Devise 4.1.1, ale nie jestem pewien dlaczego. Uruchomiłem różnicę i jedyną linią, która zmieniła się w moim devise.rb, oprócz innego tajnego klucza, było + 102: "config.stretches = Rails.env.test?? 1: 11"
Cleverlemming

10

W config/initializers/devise.rbkładę:

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

Ponieważ jeśli umieścisz:

$ heroku config

Zobaczysz secret_key_basetryb production.


2
Myślę, że z tą odpowiedzią wiąże się duży problem z bezpieczeństwem. Jeśli umieścisz pojedyncze cudzysłowy wokół „<% = ENV [" SECRET_KEY_BASE "]%>”, jak sugeruje odpowiedź, myślę, że otrzymasz dokładny ciąg znaków zamiast interpolowanej bazy tajnego klucza. Innymi słowy, dosłownie oznacza ENV ["SECRET_KEY_BASE"], prawda?
user1515295

Aby to wyjaśnić, użyj podwójnych cudzysłowów: „<% = ENV [" SECRET_KEY_BASE "]%>”
user1515295

3
devise.rb jest plikiem ruby, a nie plikiem erb. Nie ma potrzeby stosowania składni <% =. Po prostu użyj config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan,

6

Rozwiązuję swój problem z inicjatorem za pomocą tego brzydkiego podejścia:

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

w config / initializers / devise.rb Teraz działa zarówno w środowisku produkcyjnym, jak iw fazie rozwoju!


6

Sklonowałem moje repozytorium na nową maszynę z gita. Plik

config/secrets.yml 

plik był na mojej liście .gitignore, więc ten plik nie istniał, a Devise go nie tworzy.

Dodałem plik, a następnie uruchomiłem ponownie

rails generate devise MODEL

i zadziałało.


1
TO. Github uznał, że dodanie secrets.ymldo mojego .gitignorepliku było pomocne . Nie przeczytałem go dokładnie i byłem pod wrażeniem, że zawiera o wiele więcej niż wygenerowany .gitignoreplik Rails . : facepalm:
steve

Tak, na tym polegał mój problem. Wróciłem do starego commita git i plik secrets.yml zniknął.
ddonche

Właśnie miałem ten sam problem. Aplikacja, której używam do śledzenia samouczka, aby coś nie działało, więc sklonowałem do nowego katalogu i skopiowałem zmiany autora samouczka. Nie widziałem problemu, więc ręcznie ustawiłem config.secret_key. Dowiedziałem się tylko podczas uruchamiania mojego serwera railsowego. Dałem ci głos za, więc to może być wyższe!
Joe

5

Sprawdź, czy masz config\initializers\secret_token.rb:

YourAppName::Application.config.secret_token

Powinno być:

YourAppName::Application.config.secret_key_base

4

Mam ten sam problem. Problem został spowodowany przez te linie w 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

Skomentowałem je, a potem biegnę:

$ rails generate devise:install

I to oceniono doskonale. A potem odkomentowałem trasy.


Perfekcyjnie, dzięki. Miałem ten problem podczas konfigurowania nowego projektu i zapomniałem o nim rails generate devise:installprzed utworzeniem mojego pierwszego modelu devise. Zgodnie z tą odpowiedzią, zakomentowałem linię devise_for w trasach, a następnie uruchom polecenie generowania i działa.
user208769

Skomentowałem devise_forlinię, aby uzyskać moją bazę rake: migrate to work .. nie mam pojęcia dlaczego
Clam

1

Cóż, śledziłem ten post i próbowałem tutaj prawie wszystkiego. Dodałem klucz do devise.rb. Ale nadal otrzymywałem ten sam błąd.

Może głupia odpowiedź, ale wszystko, co musiałem zrobić, to wcisnąć devise.rbklucz do repozytorium.


1

Naprawić:

  1. Na serwerze produkcyjnym:

    sudo -H nano /etc/environment
  2. Następnie w pliku dodaj:

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

    aby ustawić to na stałe, i dla całego systemu (wszyscy użytkownicy, wszystkie procesy) dodaj ustawioną zmienną

  3. W lokalnym devise.rbpliku projektu :

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

Szczegóły techniczne:

  • Ubuntu 16.04
  • Devise (4.2.0)
  • szyny 5.0.1
  • kapistran (3.7.1)

1

Wpadłem w ten sam problem z Railsami 5.2.0 i Devise 4.4.1

Upuść poniższy plik do /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base

1
jest to mniej bezpieczne w produkcji i utrudnia zmianę w przypadku naruszenia bezpieczeństwa.
lacostenycoder

0

Próbując dać nieco pełniejszą odpowiedź na wymienione powyżej: Jak wspomniano w devise_auth_token gem dokumentacji

... Dodatkowo możesz skonfigurować inne aspekty urządzenia, ręcznie tworząc tradycyjny plik devise.rb pod adresem config/initializers/devise.rb. Oto kilka przykładów tego, co możesz zrobić w tym pliku:

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

Miałem ten sam problem i podobnie jak tutaj, stworzyłem inicjator devise i dodałem config.secret_key = ENV['DEVISE_SECRET_KEY']do niego linię.


-1

Nie znam właściwego rozwiązania, ale działa. Możesz tego spróbować. Zostałem sklonowany z mojego konta GitLab i kiedy uruchamiam się na serwerze lokalnym, pojawia się komunikat o błędzie:

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

Otwórz config/initializers/devise.rbi dodaj tę linię

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

Ta linia kodu rozwiązała mój problem.


config nie oceni rakiet ruby <%= %>jako interpolacji ciągów. Klucz będzie wtedy dosłownie co zostało wpisane wewnątrz ciąg dosłownym' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.