Rails 4.2 是否使用 secret_token?

Does Rails 4.2 use secret_token?

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

Missing secret_token and secret_key_base for 'production' environment, set these values in config/secrets.yml

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

When you create a new Rails application using the rails new command, a unique secret key is generated and written to the config/initializers/secret_token.rb file.

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

中没有对 secret_token 的引用

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

我建议重新生成一个安装了最新版本 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)比较生成的文件,因为这听起来像是您从旧版本升级。

4.2 确实使用了密钥,您发布的 link 有您正在寻找的解决方案。

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

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

您在 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 在我们的平台上)。

希望对您有所帮助。

至少 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'