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?

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

Brian Weiner
fonte
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?
Paul Odeon
fonte
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

Brandon Cook
fonte
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.

Jean-Nicholas Hould
fonte
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.

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

sascha.daniels
fonte
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.

rld
fonte
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!

Andrey Yasinishyn
fonte
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.

saltos
fonte
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
zurbergram
fonte
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.

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

Philip John
fonte
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)
gotqn
fonte
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
Benny Paulino
fonte
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 "[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

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.

Amit Liber
fonte
-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.

OguzTR
fonte
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