La clé secrète de conception n'a pas été définie

99

Je développe une application Rails 4 en utilisant la gemme Active Admin pour le back-end d'administration. L'administrateur actif utilise à son tour Devise pour l'authentification des utilisateurs. Maintenant, lorsque j'essaie de déployer l'application en utilisant capistranole serveur VPS, j'obtiens l'erreur ci-dessous:

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

Une recherche Google ne fait pas grand-chose pour cette erreur. Des suggestions pourquoi il lance une erreur? Dois-je ajouter la clé secrète à l' deviseinitialiseur, car je ne trouve aucun endroit pour définir une telle clé de configuration initializers/devise.rb?

scarver2
la source
@mrbrdo oui le message dit exactement ce qui manque, mais lorsque vous ouvrez le fichier devise.rb, il n'y a pas de documentation sur secret key. De plus, si vous exécutez une nouvelle installation, l'application doit s'en occuper. Grâce au ticket sur github.com/plataformatec/devise/issues/2554, cela a été résolu.

Réponses:

87

J'ai couru bundle updatece matin et j'ai commencé à avoir la même erreur.

Je l'ai ajouté en tant que ligne config/initializers/devise.rbet l'erreur a été corrigée.

Cela semble être le commit qui l'a introduit.

Brian Weiner
la source
24
Future Googlers, à partir du 08/07/2014, stackoverflow.com/questions/18080910/… est la réponse la plus appropriée pour Rails 4+ pour éviter de répandre des secrets tout au long de la configuration.
Zachary Moshansky
3
À partir du 2015-10-30, stackoverflow.com/a/32525855/1842747 est la meilleure réponse, mais je recommande vivement de définir directement la SECRET_KEY_BASEvariable d'environnement au lieu de la copier secrets.ymlafin de ne pas oublier que votre "clé secrète" n'est pas assez secret!
monozok
38

Ce qui a fonctionné pour moi sur Rails 4.1 et Devise 3.2.4 est dans config/initializers/devise.rb:

config.secret_key = ENV['DEVISE_SECRET_KEY'] if Rails.env.production?
Paul Odéon
la source
Ou si vous utilisez des figarogemmes:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander
33

Depuis Devise 3.2.3 pour les applications Rails 4+, l'emplacement du paramètre de clé est par défaut YourAppName :: Application.config.secret_key_base trouvé dans config / initializers / secret_token.rb

Brandon Cook
la source
2
Ah bon à savoir. Je comprends que c'est une très mauvaise chose pour une application open source d'avoir la clé secrète Devise quelque part en texte brut dans la source, n'est-ce pas? Au moins, cette valeur par défaut nous permet de configurer des clés secrètes dynamiques dans moins d'endroits.
Topher Hunt
4
Quelqu'un peut-il expliquer quoi faire avec ces informations, pour les non-pros? Merci!
ahnbizcad
2
Je ne vois pas ce fichier dans mon application. Cela signifie-t-il que rails g conçoivent: l'installation n'a pas fonctionné avec succès? Ou cette réponse est-elle déjà dépassée?
ahnbizcad
10
Dépassé. secret_token.rb n'est pas fourni avec Rails 4, ayant été remplacé par config / secrets.yml (voir ici pour plus d'informations). Légèrement hors sujet, mais assurez-vous d'inclure config / secrets.yml dans votre .gitignore, comme indiqué dans les commentaires générés par Rails. Pour savoir comment, allez ici .
brntsllvn
12

Cela a résolu mon problème:

Ajoutez le code ci-dessous à votre fichier config / initializers / devise.rb .

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

Remplacez «- clé secrète» par votre propre clé. Je recommande de le stocker dans une variable ENV à des fins de sécurité.

Jean-Nicholas Hould
la source
2
Comment \ où faites-vous cela et comment les connectez-vous?
ahnbizcad
3
^ la réponse à cela est d'utiliser la gemme figaro. github.com/laserlemon/figaro Vous mettez toutes vos clés réelles dans un fichier config / application.yml, gitignorez-le pour qu'elles restent secrètes, et référencez-les ailleurs dans votre application comme ceci ENV["your_particular_secret_key_name"]. Ensuite, votre application référence vos clés de manière dynamique. Mais vous avez gitignoré vos clés, alors comment les amener dans votre environnement de production? Vous les poussez directement de votre environnement de développement local vers heroku en utilisant figaro, et vos clés secrètes finiront par devenir des variables d'environnement sur heroku
ahnbizcad
12

Selon le changelog :

Devise utilisera secret_key_base sur les applications Rails 4+ comme secret_key. Vous pouvez changer cela et utiliser votre propre secret en changeant l'initialiseur devise.rb.

Je suis allé config/secrets.ymlet j'ai changé la productionvaleur.

Avant:

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

Après:

production: 
  secret_key_base: string of charaters

Bien sûr, cela devrait être défini sur la variable d'environnement, que je définirai plus tard, mais cela a au moins fait fonctionner. J'ai obtenu ma chaîne en utilisant bundle exec rake secret.

Eric
la source
11
C'est un anti-modèle. Veuillez ne pas enregistrer votre clé secrète de production.
Zack Brown
10

Se pourrait-il que vous n'ayez pas couru rails g devise:install?

L'exécution rails generate devise Usersans la commande précédente provoque ce problème.

sascha.daniels
la source
1
C'est mon problème mais comment le résoudre ...?
C404
Il devrait être possible de relancer "rails g devise: install" après avoir créé les utilisateurs. Si vous utilisez git, créez une branche testing et essayez-la. Sinon, essayez-le sur une copie de votre projet.
sascha.daniels
C'est ce qu'était mon problème. J'ai supprimé l'application (je n'avais pas fait grand chose) et rails g devise userje l'ai fait avant d'essayer de créer la table des utilisateurs et de migrer. Cela a résolu le problème.
Matt
cela a résolu le même problème pour moi avec Rails 5.0.0.beta4 & Devise 4.1.1 mais je ne sais pas pourquoi. J'ai exécuté un diff et la seule ligne qui a changé dans mon devise.rb, à part une clé secrète différente, était + 102: "config.stretches = Rails.env.test?? 1: 11"
Cleverlemming
10

Dans config/initializers/devise.rbje mets:

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

Parce que si vous mettez:

$ heroku config

Vous verrez un secret_key_basepour le mode production.

rld
la source
2
Je pense qu'il y a un gros problème de sécurité avec cette réponse. Si vous mettez les guillemets simples autour de '<% = ENV ["SECRET_KEY_BASE"]%>' comme le suggère la réponse, alors je pense que vous obtenez cette chaîne exacte de caractères au lieu d'obtenir la base de clé secrète interpolée. En d'autres termes, il énonce littéralement ENV ["SECRET_KEY_BASE"], non?
user1515295
Pour clarifier, utilisez des guillemets doubles: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295
3
devise.rb est un fichier ruby, pas un fichier erb. Pas besoin de la syntaxe <% =. Utilisez simplement config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan
6

Je résous mon problème d'initialisation avec cette vilaine approche:

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

dans config / initializers / devise.rb Cela fonctionne maintenant aussi bien en production qu'en développement!

Andrey Yasinishyn
la source
6

J'ai cloné mon référentiel sur une nouvelle machine depuis git. le

config/secrets.yml 

fichier était sur ma liste .gitignore, donc ce fichier n'existait pas, et Devise ne crée pas le fichier.

J'ai ajouté le fichier, puis relancé

rails generate devise MODEL

et cela a fonctionné.

jgrumps
la source
1
CE. Github a pensé qu'il était utile d'ajouter secrets.ymlà mon .gitignorefichier. Je ne lui ai pas donné une lecture approfondie et j'ai été vaguement impressionné par le fait qu'il comprenait bien plus que le .gitignorefichier Rails généré . : facepalm:
steve
Oui, c'est ce que mon problème était. Je suis revenu à un ancien commit git et le fichier secrets.yml avait disparu.
ddonche
J'ai juste eu ce même problème. Une application que j'utilise pour suivre un tutoriel pour quelque chose ne voulait pas fonctionner, j'ai donc cloné dans un nouveau répertoire et copié les commits de l'auteur du tutoriel. Je n'ai pas vu le problème, j'ai donc défini manuellement le config.secret_key. Seulement découvert lors du démarrage de mon serveur rails. Vous a donné un vote pour que cela puisse être plus élevé!
Joe
5

Vérifiez si votre config\initializers\secret_token.rba:

YourAppName::Application.config.secret_token

Ça devrait être:

YourAppName::Application.config.secret_key_base
zurbergram
la source
4

J'ai le même problème. Le problème a été causé par ces lignes dans 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

Je les ai commentés et après cela, je cours:

$ rails generate devise:install

Et il a parfaitement évalué. Et après cela, je n'ai pas commenté les itinéraires.

ExiRe
la source
Parfait merci. J'ai eu ce problème lors de la configuration d'un nouveau projet, et j'ai oublié rails generate devise:installavant de créer mon premier modèle de conception. Selon cette réponse, commentez la ligne devise_for dans les routes, puis exécutez la commande generate, et cela fonctionne.
user208769
J'ai commenté la devise_forligne pour obtenir mon rake db: migrer vers le travail .. aucune idée de pourquoi
Clam
1

Eh bien, j'ai suivi ce post et essayé presque tout ici. J'ai ajouté la clé dedevise.rb . Mais j'obtenais toujours la même erreur.

Peut-être une réponse stupide, mais tout ce que j'avais à faire était de pousser la devise.rbclé vers le référentiel.

Philip John
la source
1

Réparer:

  1. Dans le serveur de production:

    sudo -H nano /etc/environment
  2. Puis dans le fichier, ajoutez:

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

    pour définir cela de manière permanente et à l'échelle du système (tous les utilisateurs, tous les processus), ajouter une variable d'ensemble

  3. Dans le devise.rbfichier de projet local :

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

Détails techniques:

  • Ubuntu 16.04
  • Concevoir (4.2.0)
  • rails 5.0.1
  • capistrano (3.7.1)
gotqn
la source
1

Ran dans le même problème avec Rails 5.2.0 et Devise 4.4.1

Déposez ce qui suit dans /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base
Benny Paulino
la source
1
cela est moins sûr en production et rend plus difficile le changement en cas de faille de sécurité.
lacostenycoder du
0

Essayer de donner une réponse un peu plus complète à celles ci-dessus: Comme mentionné dans la documentation du gem devise_auth_token

... De plus, vous pouvez configurer d'autres aspects du dispositif en créant manuellement le fichier traditionnel devise.rb à l'adresse config/initializers/devise.rb. Voici quelques exemples de ce que vous pouvez faire dans ce fichier:

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

J'ai eu le même problème, et comme indiqué ici, j'ai créé l'initialiseur de périphérique et y ai ajouté la config.secret_key = ENV['DEVISE_SECRET_KEY']ligne.

Amit Liber
la source
-1

Je ne connais pas la bonne solution mais ça marche. Tu peux l'essayer. J'ai été cloné mon projet à partir de mon compte GitLab et lorsque je l'exécute sur mon serveur local, j'ai un message d'erreur:

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

Ouvrez config/initializers/devise.rbet ajoutez cette ligne

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

Cette ligne de code est résolu mon problème.

OguzTR
la source
config n'évalue pas les fusées ruby <%= %>comme interpolation de chaîne. Votre clé sera alors littéralement ce que vous avez tapé dans la chaîne littérale' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder