【问题标题】:Does Rails 4.2 use secret_token?Rails 4.2 使用 secret_token 吗?
【发布时间】:2015-04-30 06:46:49
【问题描述】:

在 Rails 4.2 中生产是否需要 secret_key_base 和 secret_token?设置都不会导致以下异常消息:

“生产”缺少 secret_tokensecret_key_base 环境,在config/secrets.yml中设置这些值

4.2 升级指南 (http://railsapps.github.io/updating-rails.html) 是这样说的:

当您使用 rails new 命令创建一个新的 Rails 应用程序时, 生成唯一的密钥并将其写入 config/initializers/secret_token.rb 文件。

但是当我生成我的应用程序时没有创建这样的文件,并且在 config/secrets.yml 中没有对 secret_token 的引用

我假设错误消息是错误的,并且只需要 secret_key_base。当我在开发机器上在生产环境中运行我的应用程序时,它仅以 secret_key_base 开头,但在 Engineyard 中,设置 secret_key_base(通过环境变量)不起作用。我仍然得到错误。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 engineyard


    【解决方案1】:

    您在 Engine Yard 上看到的问题是因为 secret_key_base 环境变量在默认情况下(尚)不存在。这是我们正在努力的事情。您可以使用自定义厨师自行设置;我建议与我们的支持团队联系以了解更多信息。

    至于您遇到的实际错误,我刚刚测试了一个全新的 Rails 4.2 应用程序(“rails new foo”),看看它是否正在生成 secret_token.rb,但事实并非如此。我认为您需要在这里创建 config/secrets.yml,该文件应如下所示:

    development:
      secret_key_base: somekey
    
    test:
      secret_key_base: someotherkey
    
    # Do not keep production secrets in the repository,
    # instead read values from the environment.
    production:
      secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
    

    现在,当您看到 ENV["SECRET_KEY_BASE"] 时,这就是 Engine Yard 有点扭曲的地方 - 我们还没有开箱即用地提供它。只要您的仓库是私有的,您就可以自己在其中硬编码一些东西。否则,使用自定义厨师可以通过创建一个密钥库并将其放入负责启动您的应用程序工作进程的包装脚本中(例如,我们平台上的 config/env.custom)来解决您的问题。

    希望这会有所帮助。

    【讨论】:

    • 另外,这可能会回答您关于 secret_token 与 secret_key_base 的一些问题:guides.rubyonrails.org/upgrading_ruby_on_rails.html#action-pack
    • 感谢您的快速回复。我生成应用程序时也没有获得 secret_token.rb 文件(所以我假设它不再使用),并且我的自动生成的 secrets.yml 文件看起来就像您在此处发布的一样。至于不支持 ENV["SECRET_KEY_BASE"] 开箱即用,我可以使用 dotenv gem 而不是将其放入文件中吗?
    • dotenv gem 无法在我们的平台上运行,因为我们有自己的包装脚本,用于在应用服务器(例如 Unicorn)执行之前设置环境变量。因此,虽然它可以在您的本地机器上进行开发,但在生产中,您需要修改 /data//shared/config/env.custom,这是一个应该由自定义厨师修改的文件,因为所有文件都应该被视为一次性的,配置管理被认为是最佳/必需的做法。
    • 我必须创建一个 secret_token.rb 文件并将我的 secret_token 放在那里,除非它是从环境中加载的。这对我有用。
    【解决方案2】:

    4.2 确实使用了密钥,并且您发布的链接具有您正在寻找的解决方案。

    在最终没有激活密钥的环境中,您需要使用rake secret 生成它,然后将控制台的输出放入您的config/initializers/secret_token.rb 文件中(如果没有,您可以制作一个一)。

    您可以选择避免使用secrets.yml。许多人更喜欢使用另一个 gem/procedure(例如figaro)来处理秘密信息。为了简化您的生活,您可以将这些信息放入 secret_token.rb 文件中并继续 - 或者您可以学习处理这种情况的各种其他惯用方法。

    【讨论】:

    • 但是为什么Rails的错误信息说secret_key_base和secret_token都需要设置呢?这只是一个错误吗?而且我使用环境变量在secrets.yml 中设置secret_key_base,而不是将密钥放入文件中。这样我就不必 gitignore 它,也不必在每次部署时手动重新创建它。
    • @JPlato 我认为错误只是分别引用了 secret_key_base 和 secret_token,但传统上您只需在 secret_token.rb 文件中设置 secret_key_base 即可。老实说,我不太确定错误的细节,我只知道我有一个使用这个 secret_key_base 的 4.2 应用程序,并且在我的部署过程中几乎没有注意到它的配置。所以解决方案必须简单,看起来错误信息只是让事情看起来比他们需要的更混乱。我还更新了我的答案以更清楚。
    • 谢谢,@Ecnalyr。我认为你是对的。根据 J. Austin Hughley 的回复,我认为我遇到的问题是 Engineyard 无法通过 ENV 进行设置。
    【解决方案3】:

    至少 Rails 4.2.2 给了我同样的错误,但是在rails 用户的.bash_profile 文件中设置环境变量SECRET_KEY_BASE 解决了我的问题,所以关于secret_token 的内容似乎是假的-- 可能是早期版本的保留。

    通过命令rake secret 生成秘密,然后在文件.bash_profile 中使用生成的字符串,如下所示:

    export SECRET_KEY_BASE='the_output_of_the_rake_secret_command'
    

    【讨论】:

      【解决方案4】:

      我建议重新生成一个安装了最新版本 Rails 的新应用。

      这个文件是在我上一个项目中自动生成的:

      # config/secrets.yml
      # Be sure to restart your server when you modify this file.
      
      # Your secret key is used for verifying the integrity of signed cookies.
      # If you change this key, all old signed cookies will become invalid!
      
      # Make sure the secret is at least 30 characters and all random,
      # no regular words or you'll be exposed to dictionary attacks.
      # You can use `rake secret` to generate a secure secret key.
      
      # Make sure the secrets in this file are kept private
      # if you're sharing your code publicly.
      
      development:
        secret_key_base: fooooo
      
      test:
        secret_key_base: fooooo
      
      # Do not keep production secrets in the repository,
      # instead read values from the environment.
      production:
        secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
      

      我还建议您通过railsdiff 站点(例如:http://railsdiff.org/4.1.10.rc2/4.2.1.rc2)比较生成的文件,因为这听起来像是从旧版本升级。

      【讨论】:

      • 我使用的是 Rails 4.2.0,我有与您显示的相同的自动生成的 secrets.yml 文件。但根据我的问题,secret_token 在哪里发挥作用?错误消息说要设置两者,我假设这是不正确的。升级指南说生成了一个 config/secret_token.rb 文件——你的应用程序有吗?
      • 您指的是非官方来源 - 该 railsapp 网站已过时,因此您看到的问题。没有根据应用程序生成器创建 secret_token.rb 文件(默认情况下)。有关发动机场的具体信息,请参阅 Austin Hughey 的回答。谢谢!
      • 好的,谢谢,迈克尔。但仅供参考 - Rails 4.2 生成的实际错误消息也说两者都需要设置(在我原来的问题中引用),所以有点令人困惑。
      • 嘿@JPlato,我记得看到过-可能是报告的错误中的错误;现在可能已经修复了。
      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 2015-05-03
      • 2015-03-27
      • 2015-07-09
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多