Devise Secret Key wurde nicht gesetzt

99

Ich entwickle eine Rails 4-App mit dem Edelstein Active Admin für das Administrations-Backend. Active Admin wiederum verwendet Devise zur Benutzerauthentifizierung. Wenn ich jetzt versuche, die App mithilfe capistranoauf dem VPS-Server bereitzustellen, wird der folgende Fehler angezeigt:

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

Eine Google-Suche hilft nicht viel für diesen Fehler. Irgendwelche Vorschläge, warum es einen Fehler auslöst? Sollte ich den geheimen Schlüssel zum deviseInitialisierer hinzufügen , da ich keinen Ort finde, an dem ich einen solchen Konfigurationsschlüssel festlegen kann initializers/devise.rb?

scarver2
quelle
@mrbrdo Ja, die Nachricht sagt genau, was fehlt, aber wenn Sie die Datei devise.rb öffnen, gibt es keine Dokumentation darüber secret key. Auch wenn Sie eine Neuinstallation ausführen, sollte sich die Anwendung darum kümmern. Dank des Tickets unter github.com/plataformatec/devise/issues/2554 wurde es gelöst.

Antworten:

87

Ich bin bundle updateheute Morgen gelaufen und habe den gleichen Fehler bekommen.

Ich habe es als Zeile hinzugefügt config/initializers/devise.rbund der Fehler wurde behoben.

Dies scheint das Commit zu sein , das es eingeführt hat.

Brian Weiner
quelle
24
Zukünftige Googler, Ab dem 08.07.2014 ist stackoverflow.com/questions/18080910/… die richtige Antwort für Rails 4+, um zu vermeiden, dass Geheimnisse in der Konfiguration verbreitet werden.
Zachary Moshansky
3
Ab dem 30.10.2015 ist stackoverflow.com/a/32525855/1842747 die beste Antwort. Ich empfehle jedoch dringend, die SECRET_KEY_BASEUmgebungsvariable direkt festzulegen, anstatt sie zu kopieren, secrets.ymldamit Sie nicht vergessen, dass Ihr "geheimer Schlüssel" ist nicht geheim genug!
Monozok
38

Was für mich auf Rails 4.1 und Devise 3.2.4 funktioniert hat, ist in config/initializers/devise.rb:

config.secret_key = ENV['DEVISE_SECRET_KEY'] if Rails.env.production?
Paul Odeon
quelle
Oder wenn Sie figaroEdelstein verwenden:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander
33

Ab Devise 3.2.3 für Rails 4+ -Anwendungen ist der Speicherort für die Schlüsseleinstellung standardmäßig YourAppName :: Application.config.secret_key_base in config / initializers / secret_token.rb

Brandon Cook
quelle
2
Ah gut zu wissen. Ich verstehe, dass es für eine Open-Source-App eine sehr schlechte Sache ist, wenn der geheime Devise-Schlüssel irgendwo im Klartext in der Quelle sitzt, richtig? Zumindest mit dieser Standardeinstellung können wir dynamische geheime Schlüssel an weniger Stellen einrichten.
Topher Hunt
4
Kann jemand darlegen, was mit diesen Informationen für Nicht-Profis zu tun ist? Vielen Dank!
Ahnbizcad
2
Ich sehe diese Datei nicht in meiner App. Bedeutet dies, dass Rails g devise: install nicht erfolgreich funktioniert hat? Oder ist diese Antwort bereits veraltet?
Ahnbizcad
10
Veraltet. secret_token.rb kommt nicht auf Lager mit Rails 4, mit ersetzt wurde config / secrets.yml (siehe hier für weitere Informationen). Etwas abseits des Themas, aber stellen Sie sicher, dass Sie config / Secrets.yml in Ihren .gitignore aufnehmen, wie in den von Rails generierten Kommentaren angegeben. Um zu erfahren, wie es geht, klicken Sie hier .
brntsllvn
12

Dies löste mein Problem:

Fügen Sie den folgenden Code zu Ihrer Datei config / initializers / devise.rb hinzu .

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

Ersetzen Sie '- geheimer Schlüssel--' durch Ihren eigenen Schlüssel. Ich empfehle, es aus Sicherheitsgründen in einer ENV-Variablen zu speichern.

Jean-Nicholas Hould
quelle
2
Wie \ wo machst du das und wie verbindest du sie?
Ahnbizcad
3
^ Die Antwort darauf ist, den Figaro-Edelstein zu verwenden. github.com/laserlemon/figaro Sie fügen alle Ihre eigentlichen Schlüssel in eine config / application.yml-Datei ein, gitignore sie so, dass sie geheim bleiben, und verweisen sie wie folgt an anderer Stelle in Ihrer Anwendung ENV["your_particular_secret_key_name"]. Anschließend verweist Ihre App dynamisch auf Ihre Schlüssel. Aber Sie haben Ihre Schlüssel gitigniert. Wie bringen Sie sie in Ihre Produktionsumgebung? Sie schieben sie mit figaro direkt von Ihrer lokalen Entwicklungsumgebung nach Heroku, und Ihre geheimen Schlüssel werden als Umgebungsvariablen auf Heroku angezeigt
ahnbizcad
12

Wie pro Changelog :

Devise verwendet die Anwendung secret_key_base in Rails 4+ als secret_key. Sie können dies ändern und Ihr eigenes Geheimnis verwenden, indem Sie den Initialisierer devise.rb ändern.

Ich ging zu config/secrets.ymlund änderte den productionWert.

Vor:

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

Nach dem:

production: 
  secret_key_base: string of charaters

Das sollte natürlich auf die Umgebungsvariable gesetzt werden, die ich später setzen werde, aber das hat es zumindest zum Laufen gebracht. Ich habe meine Schnur mit bundle exec rake secret.

Eric
quelle
11
Dies ist ein Anti-Muster. Bitte checken Sie Ihren geheimen Produktionsschlüssel nicht ein.
Zack Brown
10

Könnte es sein, dass du nicht gerannt bist rails g devise:install?

Das Ausführen rails generate devise Userohne den vorherigen Befehl verursacht dieses Problem.

sascha.daniels
quelle
1
Das ist mein Problem, aber wie kann man es beheben ...?
C404
Nach dem Erstellen von Benutzern sollte es möglich sein, "Rails g Devise: Install" erneut auszuführen. Wenn Sie git verwenden, erstellen Sie einen Testzweig und probieren Sie es aus. Wenn nicht, versuchen Sie es mit einer Kopie Ihres Projekts.
sascha.daniels
Das war mein Problem. Ich habe die App gelöscht (ich hatte nicht viel getan) und rails g devise userbevor ich versuchte, die Benutzertabelle zu erstellen und zu migrieren. Dies hat das Problem behoben.
Matt
Dies löste das gleiche Problem für mich mit Rails 5.0.0.beta4 & Devise 4.1.1, aber ich bin mir nicht sicher warum. Ich habe ein Diff ausgeführt und die einzige Zeile, die sich in meiner devise.rb geändert hat, abgesehen von einem anderen geheimen Schlüssel, war + 102: "config.stretches = Rails.env.test ?? 1: 11"
Cleverlemming
10

In config/initializers/devise.rbich legte:

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

Denn wenn Sie sagen:

$ heroku config

Sie sehen ein secret_key_basefür den Modus production.

rld
quelle
2
Ich denke, bei dieser Antwort gibt es ein großes Sicherheitsproblem. Wenn Sie die einfachen Anführungszeichen um '<% = ENV ["SECRET_KEY_BASE"]%>' setzen, wie die Antwort andeutet, erhalten Sie meiner Meinung nach genau diese Zeichenfolge, anstatt die interpolierte geheime Schlüsselbasis zu erhalten. Mit anderen Worten, es bedeutet buchstäblich ENV ["SECRET_KEY_BASE"], richtig?
user1515295
Verwenden Sie zur Verdeutlichung doppelte Anführungszeichen: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295
3
devise.rb ist eine Ruby-Datei, keine erb-Datei. Die Syntax <% = ist nicht erforderlich. Verwenden Sie einfach config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan
6

Ich löse mein Initialisierungsproblem mit diesem hässlichen Ansatz:

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

in config / initializers / devise.rb Es funktioniert jetzt sowohl in der Produktion als auch in der Entwicklung!

Andrey Yasinishyn
quelle
6

Ich habe mein Repository von git auf einen neuen Computer geklont. Das

config/secrets.yml 

Die Datei befand sich in meiner .gitignore-Liste, sodass diese Datei nicht vorhanden war und Devise die Datei nicht erstellt.

Ich habe die Datei hinzugefügt und dann erneut ausgeführt

rails generate devise MODEL

und es hat funktioniert.

jgrumps
quelle
1
DIES. Github fand es hilfreich secrets.yml, meine .gitignoreDatei zu ergänzen. Ich habe es nicht gründlich durchgelesen und war vage beeindruckt, dass es so viel mehr als die generierte Rails- .gitignoreDatei enthielt . : facepalm:
Steve
Ja, das war mein Problem. Ich kehrte zu einem alten Git-Commit zurück und die Datei secret.yml war verschwunden.
Ddonche
Hatte gerade das gleiche Problem. Eine App, mit der ich einem Tutorial für etwas folge, das nicht funktionieren wollte, klonte in ein neues Verzeichnis und kopierte die Commits des Tutorial-Autors. Das Problem wurde nicht erkannt, daher habe ich die Datei config.secret_key manuell festgelegt. Nur beim Booten meines Rails-Servers herausgefunden. Hat dir eine positive Bewertung gegeben, damit diese höher sein kann!
Joe
5

Überprüfen Sie, ob Ihre config\initializers\secret_token.rbhat:

YourAppName::Application.config.secret_token

Es sollte sein:

YourAppName::Application.config.secret_key_base
zurbergram
quelle
4

Ich habe das gleiche Problem. Das Problem wurde durch folgende Zeilen verursacht 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

Ich habe sie kommentiert und danach renne ich:

$ rails generate devise:install

Und es hat perfekt ausgewertet. Und danach habe ich Routen auskommentiert.

ExiRe
quelle
Perfekt danke. Hatte dieses Problem beim Einrichten eines neuen Projekts und vergaß das rails generate devise:installvor dem Erstellen meines ersten Entwurfsmodells. Kommentieren Sie gemäß dieser Antwort die Zeile devise_for in den Routen aus und führen Sie dann den Befehl generate aus. Dies funktioniert.
user208769
Ich habe die devise_forZeile auskommentiert, um meine Rake-Datenbank zu erhalten: zur Arbeit migrieren. Keine Ahnung warum
Clam
1

Nun, ich bin diesem Beitrag gefolgt und habe hier fast alles versucht. Ich habe den Schlüssel hinzugefügtdevise.rb . Aber ich bekam immer noch den gleichen Fehler.

Vielleicht eine dumme Antwort, aber alles, was ich tun musste, war, den devise.rbSchlüssel zum Repository zu drücken .

Philip John
quelle
1

Fix:

  1. Auf dem Produktionsserver:

    sudo -H nano /etc/environment
  2. Dann in der Datei hinzufügen:

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

    Um dies dauerhaft und systemweit (alle Benutzer, alle Prozesse) festzulegen, fügen Sie eine Set-Variable hinzu

  3. In der lokalen Projektdatei devise.rb:

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

Technische Details:

  • Ubuntu 16.04
  • Gerät (4.2.0)
  • Schienen 5.0.1
  • Capistrano (3.7.1)
gotqn
quelle
1

Ich bin mit Rails 5.2.0 und Devise 4.4.1 auf die gleichen Probleme gestoßen

Legen Sie Folgendes in /config/initializers/devise.rb ab

config.secret_key = Rails.application.credentials.secret_key_base
Benny Paulino
quelle
1
Dies ist in der Produktion weniger sicher und erschwert die Änderung im Falle einer Sicherheitsverletzung.
Lacostenycoder
0

Der Versuch, eine etwas vollständigere Antwort auf die oben genannten Fragen zu geben: Wie in der Dokumentation zum Juwel devise_auth_token erwähnt

... Darüber hinaus können Sie andere Aspekte von devise konfigurieren, indem Sie die traditionelle Datei devise.rb unter manuell erstellen config/initializers/devise.rb. Hier sind einige Beispiele dafür, was Sie in dieser Datei tun können:

Devise.setup do |config|   
# The e-mail address that mail will appear to be sent from   
# If absent, mail is sent from "[email protected]"  
config.mailer_sender = "[email protected]"

# 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

Ich hatte das gleiche Problem, und wie hier beschrieben, habe ich den Geräteinitialisierer erstellt und die config.secret_key = ENV['DEVISE_SECRET_KEY']Zeile hinzugefügt .

Amit Liber
quelle
-1

Ich kenne keine richtige Lösung, aber es funktioniert. Du kannst es versuchen. Ich habe mein Projekt von meinem GitLab-Konto geklont und wenn ich es auf meinem lokalen Server ausführe, wird eine Fehlermeldung angezeigt:

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

Öffnen config/initializers/devise.rbSie diese Zeile und fügen Sie sie hinzu

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

Diese Codezeile hat mein Problem gelöst.

OguzTR
quelle
config bewertet Ruby-Raketen nicht <%= %>als String-Interpolation. Ihr Schlüssel wird dann buchstäblich das sein, was Sie in das Zeichenfolgenliteral eingegeben haben' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder