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.