Rancang Kunci Rahasia belum disetel

99

Saya mengembangkan aplikasi Rails 4 menggunakan permata Active Admin untuk administrasi back end. Admin aktif pada gilirannya menggunakan Rancangan untuk otentikasi pengguna. Sekarang, ketika saya mencoba menerapkan aplikasi menggunakan capistranodi server VPS, saya mendapatkan kesalahan di bawah ini:

rake aborted!
Devise.secret_key was not set. Please add the following to your Devise initializer:
config.secret_key = '-- secret key --'

Pencarian Google tidak berbuat banyak untuk kesalahan ini. Adakah saran mengapa itu melempar kesalahan? Haruskah saya menambahkan kunci rahasia ke devisepenginisialisasi, karena saya tidak dapat menemukan tempat untuk menyetel kunci konfigurasi seperti itu initializers/devise.rb?

scarver2
sumber
@mrbrdo yes, pesan tersebut memberitahukan dengan tepat apa yang hilang, tetapi ketika Anda membuka file devise.rb tidak ada dokumentasi tentang secret key. Juga jika Anda menjalankan penginstalan baru, aplikasi harus mengurusnya. Berkat tiket di github.com/plataformatec/devise/issues/2554, masalah ini telah diselesaikan.

Jawaban:

87

Saya berlari bundle updatepagi ini dan mulai mendapatkan kesalahan yang sama.

Saya menambahkannya sebagai jalur masuk config/initializers/devise.rbdan kesalahan telah diperbaiki.

Ini tampaknya menjadi komitmen yang memperkenalkannya.

Brian Weiner
sumber
24
Calon Karyawan Google, Mulai tanggal 08-07-2014, stackoverflow.com/questions/18080910/… adalah jawaban yang lebih tepat untuk Rails 4+ untuk menghindari penyebaran rahasia ke seluruh konfigurasi.
Zachary Moshansky
3
Pada 2015-10-30, stackoverflow.com/a/32525855/1842747 adalah jawaban terbaik, tetapi saya sangat menyarankan untuk langsung menyetel SECRET_KEY_BASEvariabel lingkungan daripada menyalinnya secrets.ymlsehingga Anda tidak lupa bahwa "kunci rahasia" Anda tidak cukup rahasia!
monozok
38

Apa yang berhasil bagi saya di Rails 4.1 dan Devise 3.2.4 ada di config/initializers/devise.rb:

config.secret_key = ENV['DEVISE_SECRET_KEY'] if Rails.env.production?
Paul Odeon
sumber
Atau jika Anda menggunakan figaropermata:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander
33

Sejak Rancangan 3.2.3 untuk aplikasi Rails 4+, lokasi pengaturan kunci default ke YourAppName :: Application.config.secret_key_base ditemukan di config / initializers / secret_token.rb

Brandon Cook
sumber
2
Ah senang mengetahuinya. Saya mengerti bahwa itu adalah Hal yang Sangat Buruk untuk aplikasi sumber terbuka memiliki kunci rahasia Rancangan ada di suatu tempat dalam teks biasa di sumbernya, benar? Setidaknya default ini memungkinkan kita menyiapkan kunci rahasia dinamis di lebih sedikit tempat.
Perburuan Topher
4
Dapatkah seseorang menjelaskan apa yang harus dilakukan dengan informasi ini, untuk non-profesional? Terima kasih!
ahnbizcad
2
Saya tidak melihat file itu di aplikasi saya. Apakah ini berarti rails g devise: install tidak berhasil? Ataukah jawaban ini sudah ketinggalan zaman?
ahnbizcad
10
Usang. secret_token.rb tidak tersedia dengan Rails 4, telah diganti dengan config / secret.yml (lihat di sini untuk info lebih lanjut). Sedikit keluar dari topik, tetapi pastikan untuk menyertakan config / secret.yml di .gitignore Anda, seperti yang tertulis di komentar yang dibuat oleh Rails. Untuk mempelajari caranya, buka di sini .
brntsllvn
12

Ini memecahkan masalah saya:

Tambahkan kode di bawah ini ke file config / initializers / devise.rb Anda .

config.secret_key = '-- secret key --' 

Ganti '- kunci rahasia--' dengan kunci Anda sendiri. Saya merekomendasikan menyimpannya dalam variabel ENV untuk tujuan keamanan.

Jean-Nicholas Hould
sumber
2
Bagaimana \ di mana Anda melakukannya, dan bagaimana Anda menghubungkannya?
ahnbizcad
3
^ jawabannya adalah dengan menggunakan permata figaro. github.com/laserlemon/figaro Anda meletakkan semua kunci Anda yang sebenarnya di config / application.ymlfile, gitignore sehingga tetap rahasia, dan referensikan di tempat lain dalam aplikasi Anda seperti itu ENV["your_particular_secret_key_name"]. Kemudian, aplikasi Anda mereferensikan kunci Anda secara dinamis. Tapi Anda telah mengabaikan kunci Anda, jadi bagaimana Anda memasukkannya ke lingkungan produksi? Anda mendorongnya langsung dari lingkungan pengembangan lokal Anda ke heroku menggunakan figaro, dan kunci rahasia Anda akan berakhir sebagai variabel lingkungan di heroku
ahnbizcad
12

Sesuai changelog :

Devise akan menggunakan secret_key_base pada aplikasi Rails 4+ sebagai secret_key-nya. Anda dapat mengubahnya dan menggunakan rahasia Anda sendiri dengan mengubah penginisialisasi devise.rb.

Saya pergi ke config/secrets.ymldan mengubah productionnilainya.

Sebelum:

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

Setelah:

production: 
  secret_key_base: string of charaters

Tentu saja, itu harus disetel ke variabel lingkungan, yang akan saya tetapkan nanti, tetapi ini setidaknya membuatnya berjalan. Saya mendapatkan string saya dengan menggunakan bundle exec rake secret.

Eric
sumber
11
Ini adalah anti pola. Harap jangan memeriksa kunci rahasia produksi Anda.
Zack Brown
10

Mungkinkah, Anda tidak lari rails g devise:install?

Berjalan rails generate devise Usertanpa perintah sebelumnya memang menyebabkan masalah ini.

sascha.daniels
sumber
1
Itu masalah saya tapi bagaimana cara memperbaikinya ...?
C404
Seharusnya mungkin untuk menjalankan kembali "rails g devise: install" setelah membuat pengguna. Jika Anda menggunakan git, buat cabang pengujian dan coba. Jika tidak, cobalah pada salinan proyek Anda.
sascha.daniels
Inilah masalah saya. Saya menghapus aplikasi (saya tidak melakukan banyak hal) dan melakukannya rails g devise usersebelum saya mencoba membuat tabel pengguna dan bermigrasi. Ini memperbaiki masalah.
Matt
ini memecahkan masalah yang sama untuk saya dengan Rails 5.0.0.beta4 & Devise 4.1.1 tetapi saya tidak yakin mengapa. Saya menjalankan diff dan satu-satunya baris yang berubah di devise.rb saya, selain kunci rahasia yang berbeda, adalah + 102: "config.stretches = Rails.env.test?? 1: 11"
Cleverlemming
10

Dalam config/initializers/devise.rbsaya menempatkan:

config.secret_key = ENV["SECRET_KEY_BASE"] if Rails.env.production?

Karena jika Anda memasukkan:

$ heroku config

Anda akan melihat a secret_key_baseuntuk mode tersebut production.

rld
sumber
2
Saya pikir ada masalah keamanan besar dengan jawaban ini. Jika Anda menempatkan tanda kutip tunggal di sekitar '<% = ENV ["SECRET_KEY_BASE"]%>' seperti yang disarankan oleh jawabannya, maka saya pikir Anda mendapatkan string karakter yang tepat daripada mendapatkan basis kunci rahasia yang diinterpolasi. Dengan kata lain, itu benar-benar mengeja ENV ["SECRET_KEY_BASE"], bukan?
pengguna1515295
Untuk memperjelas, gunakan tanda kutip ganda: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295
3
devise.rb adalah file ruby, bukan file erb. Tidak perlu sintaks <% =. Cukup gunakan config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan
6

Saya menyelesaikan masalah penginisialisasi saya dengan pendekatan jelek ini:

config.secret_key = 'some1234keyq23' if Rails.env == 'production'

di config / initializers / devise.rb Sekarang berfungsi dalam produksi dan juga dalam pengembangan!

Andrey Yasinishyn
sumber
6

Saya mengkloning repositori saya ke mesin baru dari git. Itu

config/secrets.yml 

file ada di daftar .gitignore saya, jadi file itu tidak ada, dan Devise tidak membuat file tersebut.

Saya menambahkan file, lalu menjalankan ulang

rails generate devise MODEL

dan itu berhasil.

jgrumps
sumber
1
INI. Github berpikir itu membantu dengan menambahkan secrets.ymlke .gitignorefile saya . Saya tidak memberikannya pembacaan menyeluruh, dan samar-samar terkesan bahwa itu menyertakan lebih dari .gitignorefile Rails yang dihasilkan . : facepalm:
steve
Ya, inilah masalah saya. Saya kembali ke git commit lama dan file secret.yml hilang.
ddonche
Baru saja mengalami masalah yang sama. Sebuah aplikasi yang saya gunakan untuk mengikuti tutorial untuk sesuatu yang tidak ingin berfungsi, jadi saya mengkloning ke direktori baru dan menyalin komit dari penulis tutorial. Tidak melihat masalah, jadi saya menyetel config.secret_key secara manual. Hanya ditemukan saat mem-boot server rel saya. Memberi Anda suara positif sehingga ini bisa lebih tinggi!
Joe
5

Periksa apakah Anda config\initializers\secret_token.rbmemiliki:

YourAppName::Application.config.secret_token

Harus:

YourAppName::Application.config.secret_key_base
zurbergram.dll
sumber
4

Saya memiliki masalah yang sama. Masalahnya disebabkan oleh baris-baris berikut di routes.rb:

devise_for :users, :skip => [:registrations]                                                   
as :user do
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'              
  put 'users' => 'devise/registrations#update', :as => 'user_registration'                      
  get '/users/sign_out' => 'devise/sessions#destroy'                                            
end

Saya mengomentari mereka dan setelah itu saya menjalankan:

$ rails generate devise:install

Dan itu telah dievaluasi dengan sempurna. Dan setelah itu saya menghapus tanda komentar.

ExiRe
sumber
Sempurna, terima kasih. Mengalami masalah ini saat menyiapkan proyek baru, dan lupa rails generate devise:installsebelum membuat model rancangan pertama saya. Sesuai jawaban ini, beri komentar pada baris devise_for di rute lalu jalankan perintah buat, dan berhasil.
pengguna208769
saya mengomentari devise_forbaris untuk mendapatkan rake db saya: bermigrasi untuk bekerja .. tidak tahu mengapa
Clam
1

Nah, saya telah mengikuti posting ini dan mencoba hampir semuanya di sini. Saya telah menambahkan kunci kedevise.rb . Tapi saya masih mendapatkan kesalahan yang sama.

Mungkin jawaban yang bodoh, tetapi yang harus saya lakukan hanyalah mendorong devise.rbkunci ke repositori.

Philip John
sumber
1

Memperbaiki:

  1. Di server produksi:

    sudo -H nano /etc/environment
  2. Kemudian di file tambahkan:

    export SECRET_KEY_BASE="yourkey"
    export DEMO03_DATABASE_PASSWORD="yourpass"

    untuk mengatur ini secara permanen, dan sistem luas (semua pengguna, semua proses) tambahkan variabel set

  3. Di devise.rbfile proyek lokal :

    config.secret_key = ENV["SECRET_KEY_BASE"] if Rails.env.production?

Detail teknis:

  • Ubuntu 16.04
  • Rancangan (4.2.0)
  • rel 5.0.1
  • capistrano (3.7.1)
gotqn
sumber
1

Mengalami masalah yang sama dengan Rails 5.2.0 dan Devise 4.4.1

Masukkan perintah berikut ke /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base
Benny Paulino
sumber
1
hal ini kurang aman dalam produksi dan mempersulit perubahan jika terjadi pelanggaran keamanan.
lacostenycoder
0

Mencoba untuk memberikan jawaban agak lebih lengkap untuk yang di atas: Seperti disebutkan di permata devise_auth_token ini dokumentasi

... Selain itu, Anda dapat mengkonfigurasi aspek lain dari perangkat dengan secara manual membuat file devise.rb tradisional di config/initializers/devise.rb. Berikut beberapa contoh yang dapat Anda lakukan pada file ini:

Devise.setup do |config|   
# The e-mail address that mail will appear to be sent from   
# If absent, mail is sent from "[email protected]"  
config.mailer_sender = "[email protected]"

# If using rails-api, you may want to tell devise to not use ActionDispatch::Flash   
# middleware b/c rails-api does not include it.   
# See: http://stackoverflow.com/q/19600905/806956  
config.navigational_formats = [:json] end

Saya memiliki masalah yang sama, dan seperti yang saya bahas di sini, saya membuat penginisialisasi devise, dan menambahkan config.secret_key = ENV['DEVISE_SECRET_KEY']baris ke dalamnya.

Amit Liber
sumber
-1

Saya tidak tahu solusi yang tepat tetapi berhasil. Kamu bisa mencobanya. Saya mengkloning proyek saya dari akun GitLab saya dan ketika saya menjalankan di server lokal saya, saya mengalami pesan kesalahan:

rake aborted! Devise.secret_key was not set. Please add the following to your Devise initializer: config.secret_key = '-- secret key --'

Buka config/initializers/devise.rbdan tambahkan baris ini

config.secret_key = '<%= ENV["SECRET_KEY_BASE"] %>'

Baris kode ini memecahkan masalah saya.

OguzTR
sumber
config tidak akan mengevaluasi roket ruby <%= %>sebagai interpolasi string. Kunci Anda kemudian benar-benar akan menjadi apa yang telah Anda ketikkan di dalam string literal' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder