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?


@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.


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?

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


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.


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.


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.


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.


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!


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ó.


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

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.


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.


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)

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

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 "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

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.


-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.