No se configuró la clave secreta del dispositivo

99

Estoy desarrollando una aplicación Rails 4 utilizando la gema Active Admin para el back-end de administración. Active Admin, a su vez, utiliza Devise para la autenticación de usuarios. Ahora, cuando intento implementar la aplicación capistranoen el servidor VPS, aparece el siguiente error:

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

Una búsqueda en Google no hace mucho por este error. ¿Alguna sugerencia de por qué está arrojando un error? ¿Debo agregar la clave secreta al deviseinicializador, ya que no puedo encontrar ningún lugar para configurar dicha clave de configuración initializers/devise.rb?

scarver2
fuente
@mrbrdo sí, el mensaje dice exactamente lo que falta, pero cuando abre el archivo devise.rb no hay documentación sobre secret key. Además, si está ejecutando una instalación nueva, la aplicación debería encargarse de eso. Gracias al ticket en github.com/plataformatec/devise/issues/2554 se ha resuelto.

Respuestas:

87

Corrí bundle updateesta mañana y comencé a recibir el mismo error.

Lo agregué como una línea config/initializers/devise.rby se solucionó el error.

Este parece ser el compromiso que lo introdujo.

Brian Weiner
fuente
24
Futuros Googlers, a partir de 2014-07-08, stackoverflow.com/questions/18080910/… es la respuesta más adecuada para Rails 4+ para evitar la difusión de secretos a través de la configuración.
Zachary Moshansky
3
A partir de 2015-10-30, stackoverflow.com/a/32525855/1842747 es la mejor respuesta, pero recomiendo encarecidamente ir directamente a configurar la SECRET_KEY_BASEvariable de entorno en lugar de copiarla secrets.ymlpara que no olvide su "clave secreta" no es lo suficientemente secreto!
monozok
38

Lo que funcionó para mí en Rails 4.1 y Devise 3.2.4 está en config/initializers/devise.rb:

config.secret_key = ENV['DEVISE_SECRET_KEY'] if Rails.env.production?
Paul Odeon
fuente
O si usa figarogema:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander
33

A partir de Devise 3.2.3 para las aplicaciones Rails 4+, la ubicación de la configuración de clave predeterminada es YourAppName :: Application.config.secret_key_base que se encuentra en config / initializers / secret_token.rb

Brandon Cook
fuente
2
Ah, bueno saberlo. Entiendo que es muy malo que una aplicación de código abierto tenga la clave secreta de Devise en algún lugar en texto sin formato en la fuente, ¿correcto? Al menos este valor predeterminado nos permite configurar claves secretas dinámicas en menos lugares.
Topher Hunt
4
¿Alguien puede explicar qué hacer con esta información, para los no profesionales? ¡Gracias!
ahnbizcad
2
No veo ese archivo en mi aplicación. ¿Significa esto que rails g devise: install no funcionó correctamente? ¿O esta respuesta ya está desactualizada?
ahnbizcad
10
Anticuado. secret_token.rb no viene con Rails 4, ya que ha sido reemplazado por config / secrets.yml (ver aquí para más información). Un poco fuera de tema, pero asegúrese de incluir config / secrets.yml en su .gitignore, como dice en los comentarios generados por Rails. Para saber cómo, vaya aquí .
brntsllvn
12

Esto resolvió mi problema:

Agregue el código siguiente a su archivo config / initializers / devise.rb .

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

Reemplace '- clave secreta--' con su propia clave. Recomiendo almacenarlo en una variable ENV por motivos de seguridad.

Jean-Nicholas Hould
fuente
2
¿Cómo \ dónde haces eso y cómo los conectas?
ahnbizcad
3
^ la respuesta a eso es usar la gema figaro. github.com/laserlemon/figaro Pones todas tus claves reales en un archivo config / application.ymlfile, gitignore para que se mantengan en secreto y haz referencia a ellas en otra parte de tu aplicación ENV["your_particular_secret_key_name"]. Luego, su aplicación hace referencia a sus claves de forma dinámica. Pero ha ignorado sus claves, entonces, ¿cómo las lleva a su entorno de producción? Los empuja directamente desde su entorno de desarrollo local a heroku usando figaro, y sus claves secretas terminarán como variables de entorno en heroku
ahnbizcad
12

Según el registro de cambios :

Devise usará secret_key_base en las aplicaciones Rails 4+ como su secret_key. Puede cambiar esto y usar su propio secreto cambiando el inicializador devise.rb.

Fui a config/secrets.ymly cambié el productionvalor.

Antes de:

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

Después:

production: 
  secret_key_base: string of charaters

Por supuesto, eso debería establecerse en la variable de entorno, que estableceré más adelante, pero esto al menos lo ejecutó. Obtuve mi cuerda usando bundle exec rake secret.

Eric
fuente
11
Este es un anti-patrón. No registre su clave secreta de producción.
Zack Brown
10

¿Podría ser que no corriste rails g devise:install?

Ejecutar rails generate devise Usersin el comando anterior causa este problema.

sascha.daniels
fuente
1
Ese es mi problema pero ¿cómo solucionarlo ...?
C404
Debería ser posible volver a ejecutar "rails g devise: install" después de crear usuarios. Si usa git, cree una rama de prueba y pruébela. Si no es así, pruébelo en una copia de su proyecto.
sascha.daniels
Este es mi problema. Eliminé la aplicación (no había hecho mucho) y lo hice rails g devise userantes de intentar crear la tabla de usuarios y migrar. Esto solucionó el problema.
Matt
esto me resolvió el mismo problema con Rails 5.0.0.beta4 & Devise 4.1.1 pero no estoy seguro de por qué. Ejecuté una diferencia y la única línea que cambió en mi devise.rb, aparte de una clave secreta diferente, fue + 102: "config.stretches = Rails.env.test?? 1: 11"
Cleverlemming
10

En config/initializers/devise.rbpongo:

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

Porque si pones:

$ heroku config

Verá un secret_key_basepara el modo production.

rld
fuente
2
Creo que hay un gran problema de seguridad con esta respuesta. Si pones las comillas simples alrededor de '<% = ENV ["SECRET_KEY_BASE"]%>' como sugiere la respuesta, entonces creo que obtienes esa cadena exacta de caracteres en lugar de obtener la base de claves secretas interpoladas. En otras palabras, literalmente deletrea ENV ["SECRET_KEY_BASE"], ¿verdad?
user1515295
Para aclarar, use comillas dobles: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295
3
devise.rb es un archivo ruby, no un archivo erb. No se necesita la sintaxis <% =. Simplemente use config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan
6

Resuelvo mi problema de inicializador con este desagradable enfoque:

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

en config / initializers / devise.rb ¡Ahora funciona tanto en producción como en desarrollo!

Andrey Yasinishyn
fuente
6

Cloné mi repositorio en una nueva máquina de git. los

config/secrets.yml 

El archivo estaba en mi lista .gitignore, por lo que ese archivo no existía y Devise no crea el archivo.

Agregué el archivo, luego volví a ejecutar

rails generate devise MODEL

Y funcionó.

jgrumps
fuente
1
ESTA. Github pensó que estaba siendo útil agregar secrets.ymla mi .gitignorearchivo. No le di una lectura completa y me impresionó vagamente que incluyera mucho más que el .gitignorearchivo Rails generado . : facepalm:
steve
Sí, este es mi problema. Volví a un antiguo git commit y el archivo secrets.yml desapareció.
ddonche
Acabo de tener este mismo problema. Una aplicación que estoy usando para seguir un tutorial para algo que no quería funcionar, así que cloné en un nuevo directorio y copié las confirmaciones del autor del tutorial. No vi el problema, así que configuré manualmente config.secret_key. Solo lo descubrí al arrancar mi servidor rails. ¡Te di un voto a favor para que esto pueda ser más alto!
Joe
5

Compruebe si config\initializers\secret_token.rbtiene:

YourAppName::Application.config.secret_token

Debería ser:

YourAppName::Application.config.secret_key_base
zurbergram
fuente
4

Tengo el mismo problema. El problema fue causado por estas líneas en 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

Los comenté y después de eso ejecuto:

$ rails generate devise:install

Y ha evaluado perfectamente. Y después de eso descomenté las rutas.

Exire
fuente
Perfecto gracias. Tuve este problema al configurar un nuevo proyecto y lo olvidé rails generate devise:installantes de crear mi primer modelo de dispositivo. Según esta respuesta, comentó la línea devise_for en las rutas, luego ejecute el comando generate y funciona.
user208769
Comenté la devise_forlínea para obtener mi rake db: migrar al trabajo ... aunque no tengo idea de por qué
Clam
1

Bueno, he estado siguiendo esta publicación y probé casi todo aquí. He agregado la clave adevise.rb . Pero seguía recibiendo el mismo error.

Quizás una respuesta estúpida, pero todo lo que tenía que hacer era presionar la devise.rbclave del repositorio.

Felipe Juan
fuente
1

Reparar:

  1. En el servidor de producción:

    sudo -H nano /etc/environment
  2. Luego en el archivo agregue:

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

    para establecer esto de forma permanente, y en todo el sistema (todos los usuarios, todos los procesos) agregue la variable de conjunto

  3. En el devise.rbarchivo del proyecto local :

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

Detalles técnicos:

  • Ubuntu 16.04
  • Diseñar (4.2.0)
  • rieles 5.0.1
  • capistrano (3.7.1)
gotqn
fuente
1

Me encontré con el mismo problema con Rails 5.2.0 y Devise 4.4.1

Coloque lo siguiente en /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base
Benny Paulino
fuente
1
esto es menos seguro en la producción y dificulta el cambio en caso de que se produzca una violación de la seguridad.
lacostenycoder
0

Tratando de dar una respuesta algo más completa a los de arriba: Como se mencionó en la gema de devise_auth_token documentación

... Además, puede configurar otros aspectos de devise creando manualmente el archivo tradicional devise.rb en config/initializers/devise.rb. A continuación, se muestran algunos ejemplos de lo que puede hacer en este archivo:

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

Tuve el mismo problema y, como se menciona aquí, creé el inicializador del dispositivo y le agregué la config.secret_key = ENV['DEVISE_SECRET_KEY']línea.

Amit Liber
fuente
-1

No conozco la solución correcta, pero está funcionando. Puedes probarlo. Me clonaron mi proyecto de mi cuenta de GitLab y cuando lo ejecuto en mi servidor local, tengo un mensaje de error:

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

Abre config/initializers/devise.rby agrega esta línea

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

Esta línea de código ha resuelto mi problema.

OguzTR
fuente
config no evaluará los cohetes ruby <%= %>como interpolación de cadenas. Su clave será literalmente lo que ha escrito dentro del literal de cadena' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder