未设置设计秘密密钥


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.