Учетные данные Rails 5.2: редактировать не нравится secret_key_base - PullRequest
0 голосов
/ 04 июня 2018

Я пытался отладить файл учетных данных на моем промежуточном сервере.Всякий раз, когда я пытаюсь отредактировать учетные данные на моем промежуточном сервере, я получаю следующую ошибку:

/var/www/bundle/ruby/2.5.0/gems/railties-5.2.0/lib/rails/application.rb:583:in `validate_secret_key_base': `secret_key_base` for staging environment must be a type of String`

Мой database.yml файл выглядит следующим образом:

---
default: &default
  adapter: postgresql
development:
  <<: *default
  database: dev_db
  host: <%= Rails.application.credentials.database.fetch(:development).fetch(:host) %>
  username: <%= Rails.application.credentials.database.fetch(:development).fetch(:username) %>
  password: <%= Rails.application.credentials.database.fetch(:development).fetch(:password) %>
  secret_key_base: <%= Rails.application.credentials.secret_key_base.fetch(:development) %>
test:
  <<: *default
  database: test_db
  host: <%= Rails.application.credentials.database.fetch(:development).fetch(:host) %>
  username: <%= Rails.application.credentials.database.fetch(:development).fetch(:username) %>
  password: <%= Rails.application.credentials.database.fetch(:development).fetch(:password) %>
  secret_key_base: <%= Rails.application.credentials.secret_key_base.fetch(:development) %>
staging:
  <<: *default
  database: <%= Rails.application.credentials.database.fetch(:staging).fetch(:name) %>
  host: <%= Rails.application.credentials.database.fetch(:staging).fetch(:host) %>
  username: <%= Rails.application.credentials.database.fetch(:staging).fetch(:username) %>
  password: <%= Rails.application.credentials.database.fetch(:staging).fetch(:password) %>
  secret_key_base: <%= Rails.application.credentials.secret_key_base.fetch(:staging) %>
production:
  <<: *default
  database: <%= Rails.application.credentials.database.fetch(:production).fetch(:name) %>
  host: <%= Rails.application.credentials.database.fetch(:production).fetch(:host) %>
  username: <%= Rails.application.credentials.database.fetch(:production).fetch(:username) %>
  password: <%= Rails.application.credentials.database.fetch(:production).fetch(:password) %>
  secret_key_base: <%= Rails.application.credentials.secret_key_base.fetch(:production) %>

Я думаю, что моя постановка secret_key_base имеет тип String.Я сгенерировал secret_key_base, используя rails secret.Локально, когда я поднимаю консоль rails, я могу просмотреть secret_key_base s для моей промежуточной среды:

[1] pry(main)> Rails.application.credentials.secret_key_base.fetch(:staging)
\=> "generated_using_rails_secret"

Возвращается строка, но я все равно получаю сообщение об ошибке выше всякий раз, когда пытаюсь получить доступ к учетным даннымв моей постановочной среде.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

В итоге я посмотрел на трассировку стека и углубился в самоцвет railties-5.2.0.

Сокращенная трассировка стека:

ArgumentError: `secret_key_base` for staging environment must be a type of String`
/var/www/bundle/ruby/2.5.0/gems/railties-5.2.0/lib/rails/application.rb:583:in `validate_secret_key_base'
/var/www/bundle/ruby/2.5.0/gems/railties-5.2.0/lib/rails/application.rb:432:in `secret_key_base'
/var/www/bundle/ruby/2.5.0/gems/railties-5.2.0/lib/rails/application.rb:176:in `key_generator'
/var/www/bundle/ruby/2.5.0/gems/railties-5.2.0/lib/rails/application.rb:205:in `message_verifier'

В итоге я посмотрел на railties-5.2.0/lib/rails/application.rb:432: и увиделследующий фрагмент кода:

# 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 test and development, this is simply derived as a MD5 hash of the application's name.
#
# 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.test? || Rails.env.development?
    Digest::MD5.hexdigest self.class.name
  else
    validate_secret_key_base(
      ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || secrets.secret_key_base
    )
  end
end

Я ошибочно подумал, что могу указать SECRET_KEY_BASE для отдельной среды.Вместо этого я мог указать только одну базу секретных ключей.База секретных ключей, очевидно, не имеет ничего общего с database.yml.Мне нужно прочитать об этом и о том, что он на самом деле делает.

0 голосов
/ 04 июня 2018

Если вы запустите rails credentials:edit из командной строки, он расшифрует файл config/credentials.yml.enc.

Затем вы можете отредактировать этот файл, добавив секретные ключи на основе окружения, как вы ранее добавляли к config/secrets.yml,

Когда вы сохраните этот файл, он будет снова зашифрован с добавлением новой информации.

Нет никакой причины иметь «secret_key_base» в вашем файле database.yml, поскольку это не окажет никакого влияния.

Хорошая статья о новых учетных данных Rails

Кроме того, из-за того, что rails теперь больше генерирует файл config/secrets.yml для вас, как и для rails 5.2, добавление одного будет работатькак и в предыдущих выпусках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...