如何在secrets.yml中动态生成Rails 4.1中的秘密令牌?

新的轨道。 遵循Hartl的教程,他使用此代码为config / initializers / secret_token.rb动态生成秘密标记

require 'securerandom'

def secure_token
  token_file = Rails.root.join('.secret')
  if File.exist?(token_file)
    # Use the existing token.
    File.read(token_file).chomp
  else
    # Generate a new token and store it in token_file.
    token = SecureRandom.hex(64)
    File.write(token_file, token)
    token
  end
end

SampleApp::Application.config.secret_key_base = secure_token

我试图通过使用secrets.yml来遵循新的Rails 4.1方式,并删除secret_token.rb:

development:
  secret_key_base: 79c1389c2fadc5a5a1918a5104ab34eb700c

test:
  secret_key_base: fdb4edcde14173d62963705ca4d7876b5307790924

production:
  secret_key_base: 85172605030a8225c083d886d066da2cb4aac1f0

但是我认为你不能像yml文件中的secret_token.rb那样运行ruby脚本。 你会如何动态地在秘密中动态生成秘密标记。 这应该怎么做? 什么是最佳做法?


给定一个函数secret_token,其唯一的工作是在每次应用程序访问secrets.yml文件时生成新的标记字符串,因为秘密标记会更改对该函数的每次调用,所以Cookie和最可能的其他类似会话的行为将无法正常工作。

首选的安全方法是在开发和测试环境中使用secrets.yml文件中的任何旧密钥(您可以通过在命令行上发出rake secret来生成一个秘密字符串),然后使用生产服务器知道的环境变量,所以secrets.yml文件看起来像:

production:
 secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

例如,在Heroku上,使用heroku config:set SECRET_KEY_BASE="insert key here"来设置环境变量,并且您拥有它。 不要害怕检查secrets.yml文件到scm中......只要你没有将生产密钥保存到文件中(而是使用我刚刚描述的环境变量方法),将文件检入scm不构成威胁。


您实际上可以在YML文件中运行ERB代码。 就像是:

development:
  secret_key_base: <%= secret_token %>

应该工作(如果任何进程读取YML文件可以访问secure_token方法)。

链接地址: http://www.djcxy.com/p/77305.html

上一篇: How to dynamicly generate secret tokens in Rails 4.1 with secrets.yml?

下一篇: Render view component with parameters into named outlet ember.js