【问题标题】:Devise Secret Key was not set未设置设计密钥
【发布时间】:2013-08-07 12:04:09
【问题描述】:

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

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 的票证,问题已解决。

标签: ruby-on-rails devise


【解决方案1】:

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

我将它添加为config/initializers/devise.rb 中的一行,错误已修复。

这似乎是介绍它的commit

【讨论】:

  • 未来的 Google 员工,截至 2014 年 7 月 8 日,stackoverflow.com/questions/18080910/… 是 Rails 4+ 更合适的答案,以避免在整个配置中传播秘密。
  • 截至 2015 年 10 月 30 日,stackoverflow.com/a/32525855/1842747 是最佳答案,但我强烈建议直接设置 SECRET_KEY_BASE 环境变量,而不是将其复制到 secrets.yml 中,这样你就不会不要忘记你的“密钥”不够秘密!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    难道你没有运行rails g devise:install

    在没有上一个命令的情况下运行rails generate devise User 会导致这个问题。

    【讨论】:

    • 这是我的问题,但你如何解决它...?
    • 创建用户后应该可以重新运行“rails g devise:install”。如果您使用 git,请创建测试分支并尝试它。如果没有,请在您的项目副本上试一试。
    • 这就是我的问题所在。在我尝试创建用户表并迁移之前,我删除了该应用程序(我没有做太多)并做了rails g devise user。这解决了问题。
    • 这为我解决了 Rails 5.0.0.beta4 和 Devise 4.1.1 的同样问题,但我不知道为什么。我运行了一个 diff,我的 devise.rb 中唯一改变的行,除了不同的密钥,是 + 102: "config.stretches = Rails.env.test? ? 1 : 11"
    【解决方案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 行,然后运行生成命令,它就可以工作了。
    • 我注释掉了 devise_for 行,让我的 rake db:migrate 开始工作.. 不知道为什么
    【解决方案5】:

    这解决了我的问题:

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

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

    用您自己的密钥替换“-- 密钥--”。出于安全考虑,我建议将其存储在 ENV 变量中。

    【讨论】:

    • 你如何\在哪里做到这一点,你如何连接它们?
    • ^ 答案是使用 figaro gem。 github.com/laserlemon/figaro 您将所有实际密钥放在 config/application.yml 文件中,对其进行 gitignore 处理以使其保密,并在应用程序的其他位置引用它们,例如 ENV["your_particular_secret_key_name"]。然后,您的应用程序会动态引用您的密钥。但是您已经忽略了您的密钥,那么如何将它们带到您的生产环境中呢?您使用 figaro 将它们直接从本地开发环境推送到 heroku,您的密钥最终将作为 heroku 上的环境变量
    【解决方案6】:

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

    【讨论】:

    • 啊,很高兴知道。我知道对于开源应用程序来说,让 Devise 密钥以纯文本形式位于源代码中的某个位置是一件非常糟糕的事情,对吗?至少这个默认值允许我们在更少的地方设置动态密钥。
    • 有人可以为非专业人士详细说明如何处理这些信息吗?谢谢!
    • 我在我的应用程序中没有看到该文件。这是否意味着 rails g devise:install 没有成功运行?还是这个答案已经过时了?
    • 过时了。在 Rails 4 中,secret_token.rb 不存在,已替换为 config/secrets.yml(有关更多信息,请参阅 here)。稍微偏离主题,但请确保在您的 .gitignore 中包含 config/secrets.yml,就像它在 Rails 生成的 cmets 中所说的那样。要了解如何操作,请转至here
    【解决方案7】:

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

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

    【讨论】:

    • 或者如果你使用figaro gem:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
    【解决方案8】:

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

    YourAppName::Application.config.secret_token
    

    应该是:

    YourAppName::Application.config.secret_key_base
    

    【讨论】:

      【解决方案9】:

      根据changelog

      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 得到了我的字符串。

      【讨论】:

      • 这是一种反模式。请不要签入您的生产密钥。
      【解决方案10】:

      config/initializers/devise.rb 我输入:

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

      因为如果你把:

      $ heroku config
      

      您将看到secret_key_base 模式production

      【讨论】:

      • 我认为这个答案存在很大的安全问题。如果您按照答案建议将单引号放在 '' 周围,那么我认为您会得到确切的字符串,而不是得到内插的密钥库。换句话说,它的字面意思是 ENV["SECRET_KEY_BASE"],对吧?
      • 为了澄清,使用双引号:""
      • devise.rb 是 ruby​​ 文件,而不是 erb 文件。不需要
      【解决方案11】:

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

      config/secrets.yml 
      

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

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

      rails generate devise MODEL
      

      它成功了。

      【讨论】:

      • 这个。 Github 认为将secrets.yml 添加到我的.gitignore 文件会很有帮助。我没有彻底通读它,并且隐约印象深刻的是它包含的内容比生成的 Rails .gitignore 文件要多得多。 :facepalm:
      • 是的,这就是我的问题所在。我恢复到旧的 git commit 并且 secrets.yml 文件不见了。
      • 刚刚遇到同样的问题。我用来遵循教程的应用程序不想工作,所以我克隆到一个新目录并复制了教程作者的提交。没看出问题,所以手动设置了config.secret_key。仅在启动我的 Rails 服务器时才发现。给你一个赞成票,这样可以更高!
      【解决方案12】:

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

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

      【讨论】:

        【解决方案13】:

        试图对上述问题给出一个更完整的答案: 如 devise_auth_token gem 的documentation 中所述

        ...此外,您可以手动配置设计的其他方面 在以下位置创建传统的 devise.rb 文件 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
        

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

        【讨论】:

          【解决方案14】:

          修复:

          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)

          【讨论】:

            【解决方案15】:

            Rails 5.2.0 和 Devise 4.4.1 遇到了同样的问题

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

            config.secret_key = Rails.application.credentials.secret_key_base
            

            【讨论】:

            • 这在生产中的安全性较低,并且在发生安全漏洞时更难更改。
            【解决方案16】:

            我不知道正确的解决方案,但它正在工作。你可以试试看。我从我的 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 = '&lt;%= ENV["SECRET_KEY_BASE"] %&gt;'

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

            【讨论】:

            • config 不会将 ruby​​ 火箭 &lt;%= %&gt; 评估为字符串插值。然后,您的密钥实际上就是您在字符串文字 ' what ever the %he!@#$ you type here is your key no matter what characters' 中键入的内容
            猜你喜欢
            • 1970-01-01
            • 2014-09-10
            • 1970-01-01
            • 2020-02-16
            • 1970-01-01
            • 2014-04-26
            • 2015-09-09
            • 2017-10-29
            • 2012-03-10
            相关资源
            最近更新 更多