Как правильно определить secret_key_base в Rails 6? - PullRequest
1 голос
/ 16 марта 2020

Как правильно определить secret_key_base в Rails 6 теперь, когда у нас есть учетные данные для среды?

В моей среде есть переменная SECRET_KEY_BASE, но Rails не принимает ее. Я попытался определить secret_key_base в config\credentials\production.yml.enc, но это не влияет на Rails.application.credentials.secret_key_base

Я знаю, config/secrets.yml с

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

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

работает, но в том, что Rails 6 способ

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Правильный способ доступа и проверки для secret_key_base в Rails 6 больше не существует: ~

Rails.application.credentials.secret_key_base

теперь это:

Rails.application.secret_key_base

Я не уверен, если это Rails 6 или так было всегда. Это становится довольно ясно, если взглянуть на этот метод и его реализацию:

https://github.com/rails/rails/blob/09a2979f75c51afb797dd60261a8930f84144af8/railties/lib/rails/application.rb#L410 -L427

# The secret_key_base is used as the input secret to the application's key generator, which in turn
# is used to create all MessageVerifiers/MessageEncryptors, including the ones that sign and encrypt cookies.
#
# In development and test, this is randomly generated and stored in a
# temporary file in <tt>tmp/development_secret.txt</tt>.
#
# In all other environments, we look for it first in ENV["SECRET_KEY_BASE"],
# then credentials.secret_key_base, and finally secrets.secret_key_base. For most applications,
# the correct place to store it is in the encrypted credentials file.
def secret_key_base
  if Rails.env.development? || Rails.env.test?
    secrets.secret_key_base ||= generate_development_secret
  else
    validate_secret_key_base(
      ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || secrets.secret_key_base
    )
  end
end

И режим разработки, и тестовый режим имеют свой собственный способ генерация и хранение базы секретных ключей. Для всего остального, это записывает это из окружающей среды, или учетных данных или секретов, в этом порядке.

0 голосов
/ 16 марта 2020

Я пытался решить эту проблему несколько дней go.

И что я узнал:

Первая попытка

I попробуйте использовать учетные данные для каждой среды с

$ EDITOR=nano rails credentials:edit --environment development

$ EDITOR=nano rails credentials:edit --environment staging

$ EDITOR=nano rails credentials:edit --environment production

Мои файлы кредитов и ключи были помещены в config/credentials.

Я установил необходимые переменные прямо там. Это удобное решение, но мы столкнулись с проблемой при нашем развертывании в кластере Kubernetes, когда наши devopses хотят использовать helm config. Поэтому предопределенные учетные данные для этого случая неприменимы.


Вторая попытка

После этого я попытался использовать переменные ENV в моих файлах учетных данных. К сожалению, это тоже не работает:

secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>

Последняя попытка

Наконец, я сделал постепенное снижение до gem config с настройками по умолчанию, когда вы размещаете настройки для каждой среды:

config/settings.yml
config/settings/development.yml
config/settings/production.yml
config/settings/test.yml

А мой settings.yml файл состоит только из переменных ENV, например:

secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>

db:
  host: <%= ENV['DB_HOST'] %>
  port: <%= ENV['DB_PORT'] %>
  pool: <%= ENV['DB_POOL'] %>
  user: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  database: <%= ENV['DB_DATABASE'] %>

...

Это работоспособное решение, но кажется шагом назад.

Как я теперь знаю, мы не можем использовать ENV-переменные в учетных данных любым простым способом.

...