A chave secreta do Devise não foi definida


99

Estou desenvolvendo um aplicativo Rails 4 usando a gem Active Admin para o back-end de administração. O Active Admin, por sua vez, usa o Devise para autenticação do usuário. Agora, quando tento implantar o aplicativo usando capistranoo servidor VPS, recebo o erro abaixo:

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

Uma pesquisa no Google não ajuda muito a esse erro. Alguma sugestão de por que está gerando um erro? Devo adicionar a chave secreta ao deviseinicializador, pois não consigo encontrar nenhum lugar para definir essa chave de configuração initializers/devise.rb?


@mrbrdo sim a mensagem diz exatamente o que está faltando, mas quando você abre o arquivo devise.rb não há documentação sobre secret key. Além disso, se você estiver executando uma instalação nova, o aplicativo deve cuidar disso. Graças ao tíquete em github.com/plataformatec/devise/issues/2554, ele foi resolvido.

Respostas:


87

Corri bundle updateesta manhã e comecei a receber o mesmo erro.

Eu adicionei como uma linha config/initializers/devise.rbe o erro foi corrigido.

Este parece ser o commit que o introduziu.


24
Googlers do futuro, a partir de 08/07/2014, stackoverflow.com/questions/18080910/… é a resposta mais adequada para Rails 4+ para evitar espalhar segredos por toda a configuração.
— Zachary Moshansky

3
A partir de 2015-10-30, stackoverflow.com/a/32525855/1842747 é a melhor resposta, mas eu recomendo ir direto para a configuração da SECRET_KEY_BASEvariável de ambiente em vez de copiá-la para secrets.ymlnão esquecer que sua "chave secreta" não é segredo o suficiente!
— monozok

38

O que funcionou para mim no Rails 4.1 e no Devise 3.2.4 está em config/initializers/devise.rb:

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

Ou se você usar figarogema:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
— Alexander

33

A partir do Devise 3.2.3 para aplicativos Rails 4+, o local de configuração da chave é padronizado como YourAppName :: Application.config.secret_key_base encontrado em config / initializers / secret_token.rb


2
Ah, bom saber. Eu entendo que é uma coisa muito ruim para um aplicativo de código aberto ter a chave secreta do Devise em algum lugar em texto simples na fonte, correto? Pelo menos esse padrão nos permite configurar chaves secretas dinâmicas em menos lugares.
— Topher Hunt

4
Alguém pode explicar o que fazer com essas informações, para os não profissionais? obrigado!
— ahnbizcad

2
Não vejo esse arquivo em meu aplicativo. Isso significa que o rails g devise: install não funcionou com sucesso? Ou esta resposta já está desatualizada?
— ahnbizcad

10
Desatualizado. secret_token.rb não vem com Rails 4, tendo sido substituído por config / secrets.yml (veja aqui para mais informações). Um pouco fora do tópico, mas certifique-se de incluir config / secrets.yml em seu .gitignore, como diz nos comentários gerados pelo Rails. Para saber como, clique aqui .
— brntsllvn

12

Isso resolveu meu problema:

Adicione o código abaixo ao seu arquivo config / initializers / devise.rb .

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

Substitua '- chave secreta--' por sua própria chave. Eu recomendo armazená-lo em uma variável ENV para fins de segurança.


2
Como \ onde você faz isso e como você os conecta?
— ahnbizcad

3
^ a resposta para isso é usar a gema figaro. github.com/laserlemon/figaro Você coloca todas as suas chaves reais em um config / application.ymlfile, gitignore-o para que permaneçam secretas e faça referência a elas em outro lugar em seu aplicativo ENV["your_particular_secret_key_name"]. Em seguida, seu aplicativo faz referência a suas chaves dinamicamente. Mas você ignorou suas chaves, então como colocá-las em seu ambiente de produção? Você os envia diretamente do seu ambiente de desenvolvimento local para o heroku usando figaro, e suas chaves secretas acabarão como variáveis ​​de ambiente no heroku
— ahnbizcad

12

De acordo com o changelog :

O Devise usará secret_key_base nos aplicativos Rails 4+ como sua secret_key. Você pode alterar isso e usar seu próprio segredo, alterando o inicializador devise.rb.

Eu fui config/secrets.ymle alterei o productionvalor.

Antes:

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

Depois de:

production: 
  secret_key_base: string of charaters

Claro, isso deve ser definido para a variável de ambiente, que irei definir mais tarde, mas pelo menos isso o fez funcionar. Peguei minha corda usando bundle exec rake secret.


11
Este é um antipadrão. Não verifique sua chave secreta de produção.
— Zack Brown de

10

Será que você não correu rails g devise:install ?

Executar rails generate devise Usersem o comando anterior causa esse problema.


1
Esse é o meu problema, mas como corrigi-lo ...?
— C404

Deve ser possível executar novamente "rails g devise: install" após a criação de usuários. Se você usa git, faça o branch de teste e tente. Caso contrário, experimente em uma cópia do seu projeto.
— sascha.daniels

Este é o meu problema. Excluí o aplicativo (não tinha feito muito) e fiz rails g devise userantes de tentar criar a tabela de usuários e migrar. Isso resolveu o problema.
— Matt

isso resolveu o mesmo problema para mim com Rails 5.0.0.beta4 e Devise 4.1.1, mas não tenho certeza do porquê. Corri um diff e a única linha que mudou em meu devise.rb, além de uma chave secreta diferente, foi + 102: "config.stretches = Rails.env.test?? 1: 11"
— Cleverlemming

10

Em config/initializers/devise.rbeu coloquei:

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

Porque se você colocar:

$ heroku config

Você verá um secret_key_basepara o modo production.


2
Acho que há um grande problema de segurança com essa resposta. Se você colocar as aspas simples em torno de '<% = ENV ["SECRET_KEY_BASE"]%>' como a resposta sugere, então acho que você obtém aquela seqüência exata de caracteres em vez de obter a base da chave secreta interpolada. Em outras palavras, ele literalmente soletra ENV ["SECRET_KEY_BASE"], certo?
— user1515295

Para esclarecer, use aspas duplas: "<% = ENV [" SECRET_KEY_BASE "]%>"
— usuário1515295

3
devise.rb é um arquivo ruby, não um arquivo erb. Não há necessidade da sintaxe <% =. Basta usar config.secret_key = ENV ["SECRET_KEY_BASE"]
— John Hinnegan

6

Resolvo meu problema de inicializador com esta abordagem feia:

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

em config / initializers / devise.rb Agora funciona tanto em produção quanto em desenvolvimento!


6

Clonei meu repositório em uma nova máquina a partir do git. o

config/secrets.yml 

arquivo estava na minha lista .gitignore, então esse arquivo não existia e o Devise não cria o arquivo.

Eu adicionei o arquivo e executei novamente

rails generate devise MODEL

e funcionou.


1
ISTO. O Github achou que estava sendo útil adicionando secrets.ymlao meu .gitignorearquivo. Eu não dei uma leitura completa e fiquei vagamente impressionado que incluía muito mais do que o .gitignorearquivo Rails gerado . : facepalm:
— steve

Sim, esse é o meu problema. Eu reverti para um antigo git commit e o arquivo secrets.yml havia sumido.
— ddonche

Só tive esse mesmo problema. Um aplicativo que estou usando para seguir um tutorial de algo que não queria funcionar, então clonei em um novo diretório e copiei os commits do autor do tutorial. Não vi o problema, então configurei manualmente o config.secret_key. Só descobri ao inicializar meu servidor Rails. Deu a você um voto positivo para que isso possa ser maior!
— Joe,

5

Verifique se o seu config\initializers\secret_token.rbtem:

YourAppName::Application.config.secret_token

Deveria ser:

YourAppName::Application.config.secret_key_base

4

Eu tenho o mesmo problema. O problema foi causado por estas linhas em 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

Eu comentei e depois disso eu corro:

$ rails generate devise:install

E foi avaliado perfeitamente. E depois disso, descomentei as rotas.


Perfeito, obrigado. Tive esse problema ao configurar um novo projeto, e esqueci o rails generate devise:installantes de criar meu primeiro modelo de desenvolvimento. De acordo com esta resposta, comentei a linha devise_for nas rotas e execute o comando generate, e funciona.
— user208769

Eu comentei a devise_forlinha para obter o meu rake db: migrate to work .. embora não tenha ideia do porquê
— Clam

1

Bom, tenho acompanhado esse post e experimentei quase tudo aqui. Eu adicionei a chave a devise.rb. Mas ainda estava recebendo o mesmo erro.

Talvez uma resposta estúpida, mas tudo que tive que fazer foi empurrar a devise.rbchave para o repositório.


1

Consertar:

  1. No servidor de produção:

    sudo -H nano /etc/environment
  2. Em seguida, no arquivo, adicione:

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

    para definir isso permanentemente, e em todo o sistema (todos os usuários, todos os processos), adicione definir a variável

  3. No devise.rbarquivo de projeto local :

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

Detalhes técnicos:

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

1

Teve o mesmo problema com Rails 5.2.0 e Devise 4.4.1

Solte o seguinte em /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base

1
isso é menos seguro na produção e torna mais difícil alterar no caso de uma violação de segurança.
— lacostenycoder de

0

Tentando dar uma resposta um pouco mais completa para as acima: Como mencionado na documentação da gem devise_auth_token

... Além disso, você pode configurar outros aspectos do devise criando manualmente o arquivo devise.rb tradicional em config/initializers/devise.rb. Aqui estão alguns exemplos do que você pode fazer neste arquivo:

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

Eu tive o mesmo problema e, como mencionado aqui, criei o inicializador do devise e adicionei a config.secret_key = ENV['DEVISE_SECRET_KEY']linha a ele.


-1

Não sei a solução certa mas está funcionando. Você pode experimentá-lo. Fui clonado meu projeto de minha conta GitLab e quando executo em meu servidor local, recebo uma mensagem de erro:

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

Abra config/initializers/devise.rbe adicione esta linha

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

Esta linha de código resolveu meu problema.


config não avalia foguetes ruby <%= %>como interpolação de string. Sua chave será literalmente o que você digitou dentro da string literal' what ever the %he!@#$ you type here is your key no matter what characters'
— lacostenycoder
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.