Meskipun Anda dapat menggunakan inisialisasi seperti jawaban lain, cara Rails 4.1+ konvensional adalah dengan menggunakan config/secrets.yml
. Alasan bagi tim Rails untuk memperkenalkan ini berada di luar cakupan jawaban ini tetapi TL; DR adalah yang secret_token.rb
mengonfigurasi konfigurasi dan kode serta menjadi risiko keamanan karena token tersebut diperiksa ke dalam sejarah kendali sumber dan satu-satunya sistem yang perlu tahu token rahasia produksi adalah infrastruktur produksi.
Anda harus menambahkan file ini .gitignore
seperti Anda tidak akan menambahkan config/database.yml
kontrol sumber juga.
Merujuk kode Heroku sendiri untuk pengaturan config/database.yml
dari DATABASE_URL
dalam Buildpack mereka untuk Ruby , saya akhirnya mengambil repo mereka dan memodifikasinya untuk dibuat config/secrets.yml
dari SECRETS_KEY_BASE
variabel lingkungan.
Karena fitur ini diperkenalkan di Rails 4.1, saya merasa pantas untuk mengedit ./lib/language_pack/rails41.rb
dan menambahkan fungsi ini.
Berikut ini cuplikan dari buildpack modifikasi yang saya buat di perusahaan saya:
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
Tentu saja Anda dapat memperluas kode ini untuk menambahkan rahasia lain (mis. Kunci API pihak ketiga, dll.) Untuk dibaca dari variabel lingkungan Anda:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
Dengan cara ini, Anda dapat mengakses rahasia ini dengan cara yang sangat standar:
Rails.application.secrets.third_party_api_key
Sebelum mempekerjakan kembali aplikasi Anda, pastikan untuk mengatur variabel lingkungan Anda terlebih dahulu:
Kemudian tambahkan buildpack Anda yang dimodifikasi (atau Anda dipersilakan untuk menautkan ke tambang) ke aplikasi Heroku Anda (lihat dokumentasi Heroku ) dan gunakan kembali aplikasi Anda.
Buildpack akan secara otomatis membuat Anda config/secrets.yml
dari variabel lingkungan Anda sebagai bagian dari proses pembangunan dyno setiap kali Anda git push
ke Heroku.
EDIT: Dokumentasi Heroku sendiri menyarankan config/secrets.yml
untuk membuat membaca dari variabel lingkungan tetapi ini menyiratkan Anda harus memeriksa file ini ke dalam kontrol sumber. Dalam kasus saya, ini tidak berfungsi dengan baik karena saya memiliki rahasia hardcoded untuk pengembangan dan pengujian lingkungan yang saya lebih suka tidak memeriksa.