Devise Secret Key non è stato impostato


99

Sto sviluppando un'app Rails 4 utilizzando Active Admin gem per il back-end amministrativo. L'amministratore attivo a sua volta utilizza Devise per l'autenticazione dell'utente. Ora, quando provo a distribuire l'app utilizzando capistranosul server VPS, ottengo il seguente errore:

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

Una ricerca su Google non fa molto per questo errore. Qualche suggerimento sul motivo per cui genera un errore? Devo aggiungere la chiave segreta deviseall'inizializzatore, poiché non riesco a trovare alcun posto in cui impostare tale chiave di configurazione initializers/devise.rb?


@mrbrdo si il messaggio dice esattamente cosa manca, ma quando apri il file devise.rb non c'è documentazione secret key. Inoltre, se stai eseguendo una nuova installazione, l'applicazione dovrebbe occuparsene. Grazie al ticket su github.com/plataformatec/devise/issues/2554 è stato risolto.

Risposte:


87

Ho corso bundle updatequesta mattina e ho iniziato a ricevere lo stesso errore.

L'ho aggiunto come una riga config/initializers/devise.rbe l'errore è stato risolto.

Questo sembra essere il commit che l'ha introdotto.


24
Future googler, a partire dal 08/07/2014, stackoverflow.com/questions/18080910/... è la risposta più adeguata per Rails 4+ per evitare la diffusione segreti in tutta config.
Zachary Moshansky

3
A partire dal 2015/10/30, stackoverflow.com/a/32525855/1842747 è la migliore risposta, ma mi raccomando di andare dritto al impostando la SECRET_KEY_BASEvariabile d'ambiente, invece di copiare insecrets.yml modo da non dimenticare che la "chiave segreta" non è abbastanza segreto!
monozok

38

Ciò che ha funzionato per me su Rails 4.1 e Devise 3.2.4 è in config/initializers/devise.rb:

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

O se usi la figarogemma:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alessandro

33

A partire da Devise 3.2.3 per applicazioni Rails 4+, la posizione dell'impostazione della chiave è predefinita YourAppName :: Application.config.secret_key_base trovata in config / initializers / secret_token.rb


2
Ah buono a sapersi. Capisco che sia una cosa molto brutta per un'app open source avere la chiave segreta di Devise da qualche parte in testo normale nel sorgente, giusto? Almeno questa impostazione predefinita ci consente di impostare chiavi segrete dinamiche in meno posti.
Topher Hunt

4
Qualcuno può spiegare cosa fare con queste informazioni, per i non professionisti? Grazie!
ahnbizcad

2
Non vedo quel file nella mia app. Questo significa che rails g devise: install non ha funzionato correttamente? O questa risposta è già obsoleta?
ahnbizcad

10
Obsoleto. secret_token.rb non viene fornito con Rails 4, essendo stato sostituito con config / secrets.yml (vedi qui per maggiori informazioni). Un po 'fuori tema, ma assicurati di includere config / secrets.yml nel tuo .gitignore, come dice nei commenti generati da Rails. Per sapere come, vai qui .
brntsllvn

12

Questo ha risolto il mio problema:

Aggiungi il codice seguente al tuo file config / initializers / devise.rb .

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

Sostituisci "- chiave segreta--" con la tua chiave. Consiglio di memorizzarlo in una variabile ENV per motivi di sicurezza.


2
Come \ dove lo fai e come li colleghi?
ahnbizcad

3
^ la risposta è usare la gemma figaro. github.com/laserlemon/figaro Metti tutte le tue chiavi effettive in un file config / application.yml, gitignore in modo che rimangano segrete e fai riferimento ad esse altrove nella tua applicazione in questo modo ENV["your_particular_secret_key_name"]. Quindi, l'app fa riferimento alle tue chiavi in ​​modo dinamico. Ma hai gitignored le tue chiavi, quindi come le ottieni nel tuo ambiente di produzione? Li sposti direttamente dal tuo ambiente di sviluppo locale a heroku usando figaro e le tue chiavi segrete finiranno come variabili di ambiente su heroku
ahnbizcad

12

Come da changelog :

Devise utilizzerà le applicazioni secret_key_base su Rails 4+ come secret_key. Puoi cambiarlo e usare il tuo segreto cambiando l'inizializzatore devise.rb.

Sono andato a config/secrets.ymle ho cambiato il productionvalore.

Prima:

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

Dopo:

production: 
  secret_key_base: string of charaters

Ovviamente, dovrebbe essere impostato sulla variabile di ambiente, che imposterò in seguito, ma almeno questo lo ha fatto funzionare. Ho ottenuto la mia stringa usando bundle exec rake secret.


11
Questo è un anti-pattern. Per favore non controllare la tua chiave segreta di produzione.
Zack Brown

10

Potrebbe essere che non hai corso rails g devise:install ?

L'esecuzione rails generate devise Usersenza il comando precedente causa questo problema.


1
Questo è il mio problema, ma come risolverlo ...?
C404

Dovrebbe essere possibile eseguire nuovamente "rails g devise: install" dopo aver creato gli utenti. Se usi git, crea testing branch e provalo. In caso contrario, provalo su una copia del tuo progetto.
sascha.daniels

Questo è il mio problema. Ho cancellato l'app (non avevo fatto molto) e l'ho fatto rails g devise userprima di provare a creare la tabella utente e migrare. Questo ha risolto il problema.
Matt

questo ha risolto lo stesso problema per me con Rails 5.0.0.beta4 e Devise 4.1.1 ma non sono sicuro del perché. Ho eseguito un diff e l'unica riga che è cambiata nel mio devise.rb, a parte una diversa chiave segreta, era + 102: "config.stretches = Rails.env.test?? 1: 11"
Cleverlemming

10

In config/initializers/devise.rbho messo:

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

Perché se metti:

$ heroku config

Vedrai una secret_key_baseper la modalità production.


2
Penso che ci sia un grosso problema di sicurezza con questa risposta. Se metti le virgolette singole intorno a '<% = ENV ["SECRET_KEY_BASE"]%>' come suggerisce la risposta, allora penso che ottieni quella stringa esatta di caratteri invece di ottenere la chiave segreta interpolata di base. In altre parole, enuncia letteralmente ENV ["SECRET_KEY_BASE"], giusto?
user1515295

Per chiarire, utilizza le virgolette doppie: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295

3
devise.rb è un file ruby, non un file erb. Non c'è bisogno della sintassi <% =. Usa semplicemente config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan

6

Risolvo il mio problema con l'inizializzatore con questo brutto approccio:

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

in config / initializers / devise.rb Ora funziona sia in produzione che in sviluppo!


6

Ho clonato il mio repository su una nuova macchina da git. Il

config/secrets.yml 

file era nel mio elenco .gitignore, quindi quel file non esisteva e Devise non crea il file.

Ho aggiunto il file, quindi ho rieseguito

rails generate devise MODEL

e ha funzionato.


1
QUESTO. Github ha pensato che fosse utile aggiungerlo secrets.ymlal mio .gitignorefile. Non ho dato una lettura approfondita e sono rimasto vagamente impressionato dal fatto che includesse molto di più del .gitignorefile Rails generato . : facepalm:
steve

Sì, questo è il mio problema. Sono tornato a un vecchio commit git e il file secrets.yml era sparito.
ddonche

Ho appena avuto lo stesso problema. Un'app che sto usando per seguire un tutorial per qualcosa che non voleva funzionare, quindi ho clonato in una nuova directory e ho copiato i commit dell'autore del tutorial. Non ho visto il problema, quindi ho impostato manualmente config.secret_key. L'ho scoperto solo durante l'avvio del mio server rails. Ti ho dato un voto positivo in modo che possa essere più alto!
Joe

5

Controlla se hai config\initializers\secret_token.rb:

YourAppName::Application.config.secret_token

Dovrebbe essere:

YourAppName::Application.config.secret_key_base

4

Ho lo stesso problema. Il problema è stato causato da queste righe in 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

Li ho commentati e poi corro:

$ rails generate devise:install

E ha valutato perfettamente. E dopo di ciò ho decommentato le rotte.


Perfetto grazie. Ho avuto questo problema nell'impostare un nuovo progetto e rails generate devise:installho dimenticato il prima di creare il mio primo modello di ideazione. Secondo questa risposta, commenta la riga devise_for nelle rotte, quindi esegui il comando generate e funziona.
user208769

ho commentato la devise_forlinea per ottenere il mio rake db: migrare al lavoro .. non ho idea del perché però
Clam

1

Bene, ho seguito questo post e ho provato quasi tutto qui. Ho aggiunto la chiave adevise.rb . Ma stavo ancora ricevendo lo stesso errore.

Forse una risposta stupida, ma tutto quello che dovevo fare era premere la devise.rbchiave del repository.


1

Correzione:

  1. Nel server di produzione:

    sudo -H nano /etc/environment
  2. Quindi nel file aggiungi:

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

    per impostarlo in modo permanente e a livello di sistema (tutti gli utenti, tutti i processi) aggiungere la variabile set

  3. Nel devise.rbfile di progetto locale :

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

Dettagli tecnici:

  • Ubuntu 16.04
  • Devise (4.2.0)
  • binari 5.0.1
  • capistrano (3.7.1)

1

Ho avuto lo stesso problema con Rails 5.2.0 e Devise 4.4.1

Trascina quanto segue in /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base

1
questo è meno sicuro in produzione e rende più difficile il cambiamento in caso di violazione della sicurezza.
lacostenycoder

0

Cercando di dare una risposta un po 'più completa a quelle sopra: come menzionato nella documentazione di devise_auth_token gem

... Inoltre, puoi configurare altri aspetti di devise creando manualmente il tradizionale file devise.rb in config/initializers/devise.rb. Ecco alcuni esempi di cosa puoi fare in questo file:

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

Ho avuto lo stesso problema e, come descritto qui, ho creato l'inizializzatore di devise e ho aggiunto la config.secret_key = ENV['DEVISE_SECRET_KEY']riga.


-1

Non conosco la soluzione giusta ma funziona. Puoi provarlo. Ho clonato il mio progetto dal mio account GitLab e quando corro sul mio server locale, ricevo un messaggio di errore:

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

Apri config/initializers/devise.rbe aggiungi questa riga

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

Questa riga di codice ha risolto il mio problema.


config non valuterà i razzi Ruby <%= %>come interpolazione di stringhe. La tua chiave sarà quindi letteralmente ciò che hai digitato all'interno della stringa letterale' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.