未设置设计秘密密钥


99

我正在使用Active Admin gem开发用于管理后端的Rails 4应用程序。Active Admin依次使用Devise进行用户身份验证。现在,当我尝试capistrano在VPS服务器上使用部署应用程序时,出现以下错误:

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

Google搜索对于此错误的作用不大。有什么建议为什么会引发错误?我是否应该将私钥添加到devise初始化程序中,因为我找不到在其中设置此类配置密钥的位置initializers/devise.rb?


@mrbrdo是,该消息准确告诉您缺少的内容,但是当您打开devise.rb文件时,没有关于的文档secret key。另外,如果您运行的是全新安装,则应用程序应对此进行维护。感谢github.com/plataformatec/devise/issues/2554上的票证,此问题已解决。

Answers:


87

我bundle update今天早上跑了,开始遇到同样的错误。

我将其添加为一行,config/initializers/devise.rb并且此错误已修复。

这似乎是引入它的提交。


24
未来的Google员工,自2014年7月8日起,stackoverflow.com / questions / 18080910 /…是Rails 4+的更正确答案,以避免在整个配置中传播秘密。
— Zachary Moshansky 2014年

3
截至2015年10月30日,stackoverflow.com / a / 32525855/1842747是最佳选择,但我强烈建议您直接设置SECRET_KEY_BASE环境变量,而不是将其复制到其中,secrets.yml这样您就不会忘记“秘密密钥”还不够秘密!
— monozok 2015年

38

在Rails 4.1和Devise 3.2.4上对我有用的是config/initializers/devise.rb:

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

或者,如果您使用figaro宝石:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
— 亚历山大

33

从Devise 3.2.3 for Rails 4+应用程序开始,键设置位置默认为config / initializers / secret_token.rb中的YourAppName :: Application.config.secret_key_base


2
很高兴知道。我知道对于开源应用程序而言,将Devise秘密密钥放在源代码中的纯文本中是一件很不好的事情,对吗?至少此默认设置允许我们在更少的位置设置动态密钥。
— Topher Hunt 2014年

4
有人可以为非专业人士说明如何处理此信息吗?谢谢!
— ahnbizcad 2014年

2
我的应用程序中没有该文件。这是否意味着rails g devise:install无法成功工作?还是这个答案已经过时了?
— ahnbizcad 2014年

10
过时的。secret_token.rb不随Rails 4提供,已被config / secrets.yml取代(有关更多信息,请参见此处)。稍微偏离主题,但请确保在.gitignore中包含config / secrets.yml,就像在Rails生成的注释中所说的那样。要了解操作方法,请转到此处。
— brntsllvn 2015年

12

这解决了我的问题:

将以下代码添加到您的config / initializers / devise.rb文件中。

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

用您自己的密钥替换“-秘密密钥-”。为了安全起见,我建议将其存储在ENV变量中。


2
您如何\在何处执行操作,以及如何连接它们?
— ahnbizcad 2014年

3
^答案是使用figaro宝石。github.com/laserlemon/figaro您将所有实际密钥放入config / application.ymlfile中,对其进行gitignore使其保密,然后像这样在应用程序的其他地方引用它们ENV["your_particular_secret_key_name"]。然后,您的应用程序动态引用您的密钥。但是您已经忽略了密钥,那么如何将它们带入生产环境?您使用figaro将它们直接从本地开发环境推送到heroku,您的秘密密钥将作为环境变量最终出现在heroku上
— ahnbizcad 2015年

12

根据变更日志:

Devise将在Rails 4+应用程序上使用secret_key_base作为secret_key。您可以通过更改devise.rb初始化程序来更改此设置并使用自己的秘密。

我去了config/secrets.yml,改变了production价值。

之前:

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

后:

production: 
  secret_key_base: string of charaters

当然,应该将其设置为环境变量,稍后将对其进行设置,但这至少可以使其运行。我通过使用得到了我的弦bundle exec rake secret。


11
这是一种反模式。请不要签入生产密钥。
— 扎克布朗

10

可能是您没有参加比赛rails g devise:install?

rails generate devise User没有前一个命令运行不会导致此问题。


1
那是我的问题,但是如何解决呢?
— C404 2014年

创建用户后,应该可以重新运行“ rails g devise:install”。如果使用git,请创建测试分支并尝试。如果没有,请在您的项目副本上尝试。
— sascha.daniels 2014年

这就是我的问题。我删除了该应用程序(没有做太多事情),并且rails g devise user在尝试创建用户表并迁移之前做了删除。这解决了问题。
— 马特

这对我用Rails 5.0.0.beta4和Devise 4.1.1解决了同样的问题,但是我不确定为什么。我运行了一个差异文件,除不同的密钥外,我的devise.rb中唯一更改的行是+ 102:“ config.stretches = Rails.env.test??1:11”
— Cleverlemming

10

在config/initializers/devise.rb我说:

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

因为如果您输入:

$ heroku config

您会看到secret_key_base模式的production。


2
我认为此答案存在很大的安全性问题。如果按照答案的建议,将单引号放在'<%= ENV [“ SECRET_KEY_BASE”]%>'周围,那么我认为您将获得确切的字符串,而不是获得内插的秘密基数。换句话说,它确实拼写出ENV [“ SECRET_KEY_BASE”],对吗?
— user1515295

为澄清
— 起见

3
devise.rb是ruby文件,而不是erb文件。无需<%=语法。只需使用config.secret_key = ENV [“ SECRET_KEY_BASE”]
— 约翰·辛尼根

6

我用这种丑陋的方法解决了初始化程序的问题:

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

在config / initializers / devise.rb中,它现在既可以在生产中使用,也可以在开发中使用!


6

我将存储库从git克隆到了新机器上。的

config/secrets.yml 

该文件位于我的.gitignore列表中,因此该文件不存在,并且Devise不会创建该文件。

我添加了文件,然后重新运行

rails generate devise MODEL

而且有效。


1
这个。Github认为添加secrets.yml到我的.gitignore文件会有所帮助。我没有对其进行彻底的通读,并且隐含的印象是它所包含的内容远远超过生成的Rails .gitignore文件。:facepalm:
— 史蒂夫·

是的,这就是我的问题。我恢复为旧的git commit,secrets.yml文件消失了。
— ddonche '17

只是有同样的问题。我用来跟随教程的某个应用由于某些问题而无法正常工作,因此我将其克隆到新目录中,并复制了教程作者的提交。没看到问题,所以我手动设置了config.secret_key。仅在引导我的rails服务器时才发现。给您点赞,这样可以更高!
— 乔

5

检查您config\initializers\secret_token.rb是否具有:

YourAppName::Application.config.secret_token

它应该是:

YourAppName::Application.config.secret_key_base

4

我有同样的问题。问题是由以下行引起的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

我评论了它们,然后运行:

$ rails generate devise:install

而且它的评估非常完美。在那之后我没有评论路线。


很好,谢谢。rails generate devise:install创建新项目时遇到了这个问题,在创建我的第一个设计模型之前就忘记了。按照这个答案,在路由中的devise_for行中注释掉,然后运行generate命令,它可以工作。
— user208769 2014年

我注释掉了devise_for行,以使我的耙db:migrate上班..不知道为什么
— 蛤

1

好吧,我一直在关注这篇文章,并在这里尝试了几乎所有内容。我已将密钥添加到devise.rb。但是我仍然遇到同样的错误。

也许这是一个愚蠢的答案,但是我要做的就是将devise.rb密钥推到存储库中。


1

固定:

  1. 在生产服务器中:

    sudo -H nano /etc/environment
  2. 然后在文件中添加:

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

    永久设置,系统范围(所有用户,所有进程)添加设置变量

  3. 在本地项目devise.rb文件中:

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

技术细节:

  • Ubuntu 16.04
  • 设计(4.2.0)
  • 轨道5.0.1
  • Capistrano(3.7.1)

1

在Rails 5.2.0和Devise 4.4.1中遇到同样的麻烦

将以下内容放入/config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base

1
这在生产中不太安全,并且在发生安全漏洞时很难进行更改。
— lacostenycoder

0

尝试对上述问题给出更完整的答案:如devise_auth_token gem的文档中所述

...此外,您可以通过在手动创建传统的devise.rb文件来配置devise的其他方面 config/initializers/devise.rb。以下是您可以在此文件中执行的操作的一些示例:

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

我遇到了同样的问题,就像这里提到的那样,我创建了devise初始化程序,并将config.secret_key = ENV['DEVISE_SECRET_KEY']行添加到其中。


-1

我不知道正确的解决方案,但它正在起作用。你可以试试。我从GitLab帐户克隆了我的项目,当我在本地服务器上运行时,出现错误消息:

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

打开config/initializers/devise.rb并添加此行

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

此代码行解决了我的问题。


配置不会将红宝石火箭评估<%= %>为字符串插值。然后,您的密钥将按字面意思是您在字符串文字中键入的内容' what ever the %he!@#$ you type here is your key no matter what characters'
— lacostenycoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.