Ruby on Rails,从secrets.yml检索API密钥

时间:2016-07-02 03:19:37

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

如果我将API密钥存储到 secrets.yml ,有人可以帮助我了解如何检索API密钥吗?

如果我有某种谷歌API密钥'yt_key'

secrets.yml

development:
  secret_key_base: 390257802398523094820 #some key
  yt_key: A423092389042430 #some key

test:
  secret_key_base: 43208947502938530298525#some key
  yt_key: A423092389042430 #some key

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

我只是按照这些例子,这就是我如何正确设置它?

因此,如果我将其发布到制作中,我会将A423092389042430保存在heroku中并保存在YT_KEY下,是吗?

但在开发过程中,我会这样做以检索数据:

/config/application.rb

中的

Yt.configure do |config|
  config.api_key = '<%= ENV["YT_KEY"] %>'
end

或者应该在课堂上:

module Sample
  class Application < Rails::Application

    Yt.configure do |config|
      config.api_key = '<%= ENV["YT_KEY"] %>'
    end

    config.active_record.raise_in_transactional_callbacks = true
  end
end

或者我是否设置了配置错误?

3 个答案:

答案 0 :(得分:3)

ENV["YT_KEY"]引用您必须使用environment variable设置的'YT_KEY'Heroku config variable

在您的应用中,您可以访问这样的秘密:

Rails.application.secrets.key_name

由于您只在生产中将'YT_KEY'存储为环境变量,因此您应该像这样配置Yt:

(您可以在位于app/initializers/yt.rb的初始化文件中执行此操作)

Yt.configure do |config|
  config.api_key = Rails.application.secrets.yt_key
end

这样,将在每个环境中设置正确的密钥。

最好为每个环境使用不同的密钥,因此应为生产环境获取另一个密钥。此外,您应该避免在代码中存储秘密生产环境密钥。这就是为什么将ENV变量用于生产密钥的常见原因。

如果您需要任何澄清,请告诉我们!

答案 1 :(得分:1)

这样做,我们这样做很长一段时间,并为我们工作得很好,这也是一个很好的约定。

secrets.yml

development:
  secret_key_base: 390257802398523094820 #some key
  yt_key: A423092389042430 #some key

test:
  secret_key_base: 43208947502938530298525#some key
  yt_key: A423092389042430 #some key

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

将这些行添加到您的application.rb文件

 config_files = ['secrets.yml']

    config_files.each do |file_name|
      file_path = File.join(Rails.root, 'config', file_name)
      config_keys = HashWithIndifferentAccess.new(YAML::load(IO.read(file_path)))[Rails.env]
      config_keys.each do |k,v|
        ENV[k.upcase] ||= v
      end
    end

现在您可以yt_key ENV["YT_KEY"]some_key添加ENV["SOME_KEY"]secret.yml

通常建议您不要将自定义密钥放在app_keys.yml中,而是创建另一个文件$("#needColor tr:even").css("background-color", "yellow"); 并将所有密钥放在那里。

答案 2 :(得分:0)

您也可以使用Figaro gem

安装完成后,您将拥有config/application.yml个文件。在它里面你可以存储你的api键等:

SENDGRID_USERNAME: a-name
SENDGRID_PASSWORD: password

现在,.rb文件中的任何位置都可以使用vars引用它:

# Noticed how I keep my vars uppercase throughout.

ENV["SENDGRID_USERNAME"]
ENV["SENDGRID_PASSWORD"]

# Production vars go below the `production` line

production:
  ENV["MY_PRODUCTION_VAR"]

如果在env中使用这些html.erb密钥,则需要将其与<%= ... %>

包起来