Chociaż możesz używać inicjatorów, tak jak inne odpowiedzi, konwencjonalnym sposobem Rails 4.1+ jest użycie config/secrets.yml
. Powód, dla którego zespół Railsów to wprowadził, wykracza poza zakres tej odpowiedzi, ale TL; DR jest to, że secret_token.rb
łączy konfigurację i kod, a także stanowi zagrożenie bezpieczeństwa, ponieważ token jest sprawdzany w historii kontroli źródła i jest jedynym systemem, który musi wiedzieć, że tajny token produkcji to infrastruktura produkcyjna.
Powinieneś dodać ten plik .gitignore
tak, jak nie byłbyś dodawany config/database.yml
do kontroli źródła.
Odwołując się do własnego kodu Heroku do konfiguracji config/database.yml
z DATABASE_URL
ich Buildpack for Ruby , skończyłem rozwidlając ich repozytorium i zmodyfikowałem je, aby utworzyć config/secrets.yml
ze SECRETS_KEY_BASE
zmiennej środowiskowej.
Odkąd ta funkcja została wprowadzona w Railsach 4.1, uznałem, że należy ją edytować ./lib/language_pack/rails41.rb
i dodawać.
Poniżej znajduje się fragment zmodyfikowanego pakietu kompilacji, który utworzyłem w mojej firmie:
class LanguagePack::Rails41 < LanguagePack::Rails4
# ...
def compile
instrument "rails41.compile" do
super
allow_git do
create_secrets_yml
end
end
end
# ...
# writes ERB based secrets.yml for Rails 4.1+
def create_secrets_yml
instrument 'ruby.create_secrets_yml' do
log("create_secrets_yml") do
return unless File.directory?("config")
topic("Writing config/secrets.yml to read from SECRET_KEY_BASE")
File.open("config/secrets.yml", "w") do |file|
file.puts <<-SECRETS_YML
<%
raise "No RACK_ENV or RAILS_ENV found" unless ENV["RAILS_ENV"] || ENV["RACK_ENV"]
%>
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
SECRETS_YML
end
end
end
end
# ...
end
Możesz oczywiście rozszerzyć ten kod, aby dodać inne wpisy tajne (np. Klucze API stron trzecich itp.), Które będą odczytywane ze zmiennej środowiskowej:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
W ten sposób możesz uzyskać dostęp do tego sekretu w bardzo standardowy sposób:
Rails.application.secrets.third_party_api_key
Przed ponownym wdrożeniem aplikacji pamiętaj, aby najpierw ustawić zmienną środowiskową:
Następnie dodaj swój zmodyfikowany buildpack (lub możesz dodać link do mojego) do swojej aplikacji Heroku (zobacz dokumentację Heroku ) i ponownie wdróż aplikację.
Buildpack automatycznie utworzy twoją config/secrets.yml
zmienną środowiskową jako część procesu budowania hamowni za każdym razem, gdy będziesz git push
w Heroku.
EDYCJA: Własna dokumentacja Heroku sugeruje tworzenie config/secrets.yml
do odczytu ze zmiennej środowiskowej, ale oznacza to, że powinieneś sprawdzić ten plik w kontroli źródła. W moim przypadku nie działa to dobrze, ponieważ mam zakodowane na stałe sekrety środowisk programistycznych i testowych, których wolałbym nie sprawdzać.