如何解决错误“在生产环境下缺少'secret_key_base'”(Rails 4.1)?

189

我使用Rails 4.1从头开始创建了一个Rails应用程序,但我遇到了一个奇怪的问题,我无法解决。

每次我尝试在Heroku上部署我的应用程序时,都会出现500错误:

Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`

secret.yml文件包含以下配置:

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
在Heroku上,我使用rake secret命令的结果配置了"SECRET_KEY_BASE"环境变量。如果我启动heroku config,我可以看到正确名称和值的变量。为什么我仍然会收到这个错误?
答案:
在Heroku上配置了"SECRET_KEY_BASE"环境变量并使其具有正确的名称和值,但仍然出现错误。

1
我遇到了完全相同的问题,也很想知道为什么会发生这种情况。如果我找到原因,我会回来发布我的解决方案。 - danielricecodes
你的配置文件是叫做 secret.yml 还是 secrets.yml - James
2
我使用Rails生成的.gitignore文件重新配置了一遍,现在一切都正常工作了。 - Paolo Laurenti
当我们升级到Rails 4时,我们也遇到了这个问题。在我们的情况下,是因为我们有一个自定义的环境名称,而这并没有反映在secrets.yml中。我只需要在非标准名称的文件中添加一行,提交并重新部署即可解决问题。 - whognu
给未来的读者:这个答案可能是最简单和最准确的:stackoverflow.com/a/26541742/4880924 - BenKoshy
15个回答

-1

-1

我有一个补丁,我在Rails 4.1应用程序中使用它来让我继续使用旧版密钥生成器(因此可以与Rails 3向后兼容的会话),允许secret_key_base为空。

Rails::Application.class_eval do
  # the key_generator will then use ActiveSupport::LegacyKeyGenerator.new(config.secret_token)
  fail "I'm sorry, Dave, there's no :validate_secret_key_config!" unless instance_method(:validate_secret_key_config!)
  def validate_secret_key_config! #:nodoc:
    config.secret_token = secrets.secret_token
    if config.secret_token.blank?
      raise "Missing `secret_token` for '#{Rails.env}' environment, set this value in `config/secrets.yml`"
    end 
  end 
end

我已经重新格式化了补丁,并将其提交为Rails的Pull请求


-1

-2
在我的情况下,问题是config/master.key没有被纳入版本控制,并且我是在另一台电脑上创建的项目。
Rails创建的默认.gitignore文件排除了这个文件。由于没有这个文件就无法部署,因此需要将其纳入版本控制,以便能够从任何团队成员的计算机上进行部署。
解决方案:从创建项目的计算机中删除.gitignore中的config/master.key行,提交该文件,现在您可以在其他计算机上执行git pull并从中进行部署。
人们说不要将其中一些文件提交到版本控制中,但没有提供替代方案。只要您不是在开源项目上工作,我认为没有理由不提交运行项目所需的所有内容,包括凭据。

6
永远不要将你的主密钥文件提交到 git 上。这是你的应用程序存在的巨大安全漏洞。对于开源项目来说很困难,但是创建一个包含主密钥的密码保险箱并使用你喜欢的密码管理器是更好的选择。 - wsizoo
1
您在生产环境中设置了“RAILS_MASTER_KEY”环境变量。根据Rails文档,您的答案非常错误,并会导致不安全的情况。请更新或删除它。 - Robin Daugherty
1
@RobinDaugherty 请详细说明一下,“不安全的条件”是什么,我们应该如何避免它? - Andrew Koster
就像@wsizoo一样。将主密钥提交到版本控制中是不安全的,不应该这样做。它在.gitignore文件中有很好的理由。通过其他方式共享文件进行开发。遵循12因素应用程序原则,并将其放置在生产环境中。特别是对于开源项目,在生产中的主密钥不应与世界共享。 - Robin Daugherty

-4

2
正如到处都在重复的那样,不建议将 secrets.yml 或 secret_token.rb 提交到 git。 - cofiem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接