ไม่ได้ตั้งค่าคีย์ลับของ Devise


99

ฉันกำลังพัฒนาแอพ Rails 4 โดยใช้อัญมณี Active Admin สำหรับแบ็คเอนด์การดูแลระบบ ผู้ดูแลระบบที่ใช้งานอยู่จะใช้ Devise สำหรับการตรวจสอบผู้ใช้ ตอนนี้เมื่อฉันพยายามปรับใช้แอพโดยใช้capistranoบนเซิร์ฟเวอร์ VPS ฉันได้รับข้อผิดพลาดด้านล่าง:

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

การค้นหาโดย Google ไม่ได้ทำอะไรมากสำหรับข้อผิดพลาดนี้ ข้อเสนอแนะใด ๆ ว่าเหตุใดจึงเกิดข้อผิดพลาด? ฉันควรเพิ่มรหัสลับในโปรแกรมdeviseเริ่มต้นเนื่องจากฉันไม่พบสถานที่ใด ๆ ในการตั้งค่าคีย์การกำหนดค่าดังกล่าวinitializers/devise.rb?


@mrbrdo ใช่ข้อความบอกสิ่งที่ขาดหายไป แต่เมื่อคุณเปิดไฟล์ devise.rb จะไม่มีเอกสารเกี่ยวกับsecret key. นอกจากนี้หากคุณใช้งานการติดตั้งใหม่แอปพลิเคชันควรดูแล ขอบคุณตั๋วที่github.com/plataformatec/devise/issues/2554มันได้รับการแก้ไขแล้ว

คำตอบ:


87

เมื่อbundle updateเช้านี้ฉันวิ่งและเริ่มได้รับข้อผิดพลาดเดียวกัน

ฉันเพิ่มเป็นบรรทัดconfig/initializers/devise.rbและข้อผิดพลาดได้รับการแก้ไข

นี่ดูเหมือนจะเป็นการกระทำที่แนะนำมัน


24
Googler ในอนาคต ณ วันที่ 2014-07-08 stackoverflow.com/questions/18080910/…เป็นคำตอบที่เหมาะสมกว่าสำหรับ Rails 4+ เพื่อหลีกเลี่ยงการแพร่กระจายความลับตลอดการกำหนดค่า
Zachary Moshansky

3
ตั้งแต่วันที่ 2015-10-30 stackoverflow.com/a/32525855/1842747เป็นคำตอบที่ดีที่สุด แต่ฉันขอแนะนำให้ตั้งค่าSECRET_KEY_BASEตัวแปรสภาพแวดล้อมโดยตรงแทนที่จะคัดลอกลงในsecrets.ymlนั้นดังนั้นอย่าลืมว่า "คีย์ลับ" ของคุณ ยังไม่ลับพอ!
monozok

38

สิ่งที่ใช้ได้ผลสำหรับฉันใน Rails 4.1 และ Devise 3.2.4 อยู่ในconfig/initializers/devise.rb:

config.secret_key = ENV['DEVISE_SECRET_KEY'] if Rails.env.production?

หรือถ้าคุณใช้figaroอัญมณี:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander

33

จากDevise 3.2.3สำหรับแอ็พพลิเคชัน Rails 4+ ตำแหน่งการตั้งค่าคีย์จะเริ่มต้นเป็นYourAppName :: Application.config.secret_key_base ที่พบใน config / initializers / secret_token.rb


2
อ่าน่ารู้ ฉันเข้าใจว่ามันเป็นสิ่งที่เลวร้ายมากสำหรับแอปโอเพนซอร์สที่มีคีย์ลับ Devise อยู่ที่ไหนสักแห่งในข้อความธรรมดาในแหล่งที่มาถูกต้องหรือไม่? อย่างน้อยค่าเริ่มต้นนี้ทำให้เราสามารถตั้งค่าคีย์ลับแบบไดนามิกได้ในจำนวนที่น้อยลง
Topher Hunt

4
ใครบางคนสามารถสะกดว่าจะทำอย่างไรกับข้อมูลนี้สำหรับผู้ที่ไม่ใช่มืออาชีพ? ขอบคุณ!
ahnbizcad

2
ฉันไม่เห็นไฟล์นั้นในแอปของฉัน นี่หมายถึงราง g ประดิษฐ์: ติดตั้งไม่สำเร็จหรือไม่? หรือคำตอบนี้ล้าสมัยแล้ว?
ahnbizcad

10
เก่า. secret_token.rb ไม่ได้มาพร้อมกับ Rails 4 โดยถูกแทนที่ด้วยconfig / secret.yml (ดูข้อมูลเพิ่มเติมที่นี่ ) ปิดหัวข้อเล็กน้อย แต่อย่าลืมใส่ config / secret.yml ไว้ใน. gitignore ของคุณเหมือนที่ระบุไว้ในความคิดเห็นที่สร้าง Rails ต้องการเรียนรู้วิธีไปที่นี่
brntsllvn

12

สิ่งนี้ช่วยแก้ปัญหาของฉัน:

เพิ่มรหัสด้านล่างในไฟล์config / initializers / devise.rb ของคุณ

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

แทนที่ '- คีย์ลับ -' ด้วยคีย์ของคุณเอง ขอแนะนำให้เก็บไว้ในตัวแปร ENV เพื่อความปลอดภัย


2
คุณทำอย่างไรและคุณเชื่อมต่ออย่างไร
ahnbizcad

3
^ คำตอบคือการใช้อัญมณี figaro github.com/laserlemon/figaro คุณใส่กุญแจที่เกิดขึ้นจริงของคุณทั้งหมดใน config / application.ymlfile, gitignore มันเพื่อให้พวกเขาอยู่ที่ลับและอ้างอิงพวกเขาที่อื่น ๆ ENV["your_particular_secret_key_name"]ในใบสมัครของคุณเช่นดังนั้น จากนั้นแอปของคุณจะอ้างอิงคีย์ของคุณแบบไดนามิก แต่คุณได้ปรับแต่งคีย์ของคุณแล้วคุณจะนำคีย์นั้นเข้าสู่สภาพแวดล้อมการผลิตของคุณได้อย่างไร? คุณผลักดันพวกเขาโดยตรงจากสภาพแวดล้อมการพัฒนาในพื้นที่ของคุณไปยัง heroku โดยใช้ figaro และกุญแจลับของคุณจะกลายเป็นตัวแปรสภาพแวดล้อมใน heroku
ahnbizcad

12

ตามการเปลี่ยนแปลง :

Devise จะใช้ secret_key_base บนแอพพลิเคชั่น Rails 4+ เป็น secret_key คุณสามารถเปลี่ยนสิ่งนี้และใช้ความลับของคุณเองได้โดยการเปลี่ยนค่าเริ่มต้น devise.rb

ฉันไปconfig/secrets.ymlและเปลี่ยนproductionค่า

ก่อน:

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

หลังจาก:

production: 
  secret_key_base: string of charaters

แน่นอนว่าควรตั้งค่าเป็นตัวแปรสภาพแวดล้อมซึ่งฉันจะตั้งค่าในภายหลัง แต่อย่างน้อยก็ทำให้มันทำงานได้ ฉันได้สตริงโดยใช้bundle exec rake secret.


11
นี่คือการต่อต้านรูปแบบ โปรดอย่าตรวจสอบรหัสลับการผลิตของคุณ
Zack Brown

10

เป็นไปได้ไหมที่คุณไม่ได้วิ่งrails g devise:install?

การรันrails generate devise Userโดยไม่มีคำสั่งก่อนหน้านี้จะทำให้เกิดปัญหานี้


1
นั่นคือปัญหาของฉัน แต่จะแก้ไขอย่างไร ... ?
C404

ควรเรียกใช้ "rail g devise: install" อีกครั้งหลังจากสร้างผู้ใช้ หากคุณใช้คอมไพล์ให้สร้างสาขาทดสอบแล้วลองใช้ หากไม่เป็นเช่นนั้นให้ลองใช้สำเนาโครงการของคุณ
sascha.daniels

นี่คือปัญหาของฉัน ฉันลบแอพ (ฉันไม่ได้ทำอะไรมากมาย) และทำrails g devise userก่อนที่ฉันจะพยายามสร้างตารางผู้ใช้และย้ายข้อมูล สิ่งนี้ช่วยแก้ปัญหาได้
Matt

สิ่งนี้แก้ปัญหาเดียวกันสำหรับฉันด้วย Rails 5.0.0.beta4 & Devise 4.1.1 แต่ฉันไม่แน่ใจว่าทำไม ฉันวิ่ง diff และบรรทัดเดียวที่เปลี่ยนใน devise.rb ของฉันนอกเหนือจากคีย์ลับอื่นคือ + 102: "config.stretches = Rails.env.test?? 1: 11"
Cleverlemming

10

ในconfig/initializers/devise.rbฉันใส่:

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

เพราะถ้าคุณใส่:

$ heroku config

คุณจะเห็นสำหรับโหมดsecret_key_baseproduction


2
ฉันคิดว่ามีปัญหาด้านความปลอดภัยที่ยิ่งใหญ่กับคำตอบนี้ หากคุณใส่เครื่องหมายคำพูดเดี่ยวรอบ '<% = ENV ["SECRET_KEY_BASE"]%> ตามที่คำตอบแนะนำฉันคิดว่าคุณจะได้สตริงอักขระที่แน่นอนแทนที่จะได้รับฐานคีย์ลับที่ถูกแก้ไข กล่าวอีกนัยหนึ่งมันสะกดว่า ENV ["SECRET_KEY_BASE"] อย่างแท้จริงใช่ไหม
user1515295

เพื่อความชัดเจนให้ใช้เครื่องหมายคำพูดคู่: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295

3
devise.rb เป็นไฟล์ทับทิมไม่ใช่ไฟล์ erb ไม่จำเป็นต้องใช้ไวยากรณ์ <% = เพียงใช้ config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan

6

ฉันแก้ปัญหาการเริ่มต้นด้วยวิธีการที่น่าเกลียดนี้:

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

ใน config / initializers / devise.rb ตอนนี้ใช้งานได้ในการผลิตและในการพัฒนา!


6

ฉันโคลนที่เก็บของฉันไปยังเครื่องใหม่จาก git

config/secrets.yml 

ไฟล์อยู่ในรายการ. gitignore ของฉันไฟล์นั้นจึงไม่มีอยู่และ Devise ไม่ได้สร้างไฟล์

ฉันเพิ่มไฟล์แล้วรีรัน

rails generate devise MODEL

และมันได้ผล


1
นี้. Github คิดว่าการเพิ่มไฟล์secrets.ymlของฉันมี.gitignoreประโยชน์ ฉันไม่ได้อ่านอย่างละเอียดและรู้สึกประทับใจอย่างมากที่มันมีมากกว่า.gitignoreไฟล์Rails ที่สร้างขึ้น : facepalm:
สตีฟ

ใช่นี่คือปัญหาของฉัน ฉันเปลี่ยนกลับไปใช้คอมมิตคอมแบบเก่าและไฟล์ secret.yml ก็หายไป
ddonche

เพิ่งมีปัญหาเดียวกันนี้ แอปที่ฉันใช้ทำตามบทช่วยสอนสำหรับบางสิ่งที่ไม่ต้องการทำงานฉันจึงโคลนลงในไดเรกทอรีใหม่และคัดลอกคำสั่งของผู้เขียนบทช่วยสอน ไม่เห็นปัญหาดังนั้นฉันจึงตั้งค่า config.secret_key ด้วยตนเอง พบเฉพาะเมื่อบูตเซิร์ฟเวอร์รางของฉัน ให้คะแนนโหวตเพื่อให้สูงขึ้น!
โจ


4

ฉันมีปัญหาเดียวกัน ปัญหาเกิดจากบรรทัดเหล่านี้ใน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

ฉันแสดงความคิดเห็นพวกเขาและหลังจากนั้นฉันก็เรียกใช้:

$ rails generate devise:install

และมีการประเมินอย่างสมบูรณ์แบบ และหลังจากนั้นฉันก็ไม่มีคอมเมนต์เส้นทาง


สมบูรณ์แบบขอบคุณ มีปัญหานี้ในการตั้งค่าโครงการใหม่และลืมrails generate devise:installก่อนที่จะสร้างแบบจำลองแรกของฉัน ตามคำตอบนี้แสดงความคิดเห็นในบรรทัด devise_for ในเส้นทางจากนั้นเรียกใช้คำสั่ง create และใช้งานได้
user208769

ฉันแสดงความคิดเห็นในdevise_forบรรทัดเพื่อรับฐานข้อมูลคราดของฉัน: ย้ายไปทำงาน .. ไม่รู้ว่าทำไม
Clam

1

ฉันได้ติดตามโพสต์นี้และลองเกือบทุกอย่างที่นี่ ฉันได้เพิ่มคีย์ไปที่devise.rb . แต่ฉันยังคงได้รับข้อผิดพลาดเดิม

อาจจะเป็นคำตอบที่โง่ ๆ แต่สิ่งที่ฉันต้องทำคือกดdevise.rbคีย์ไปที่ที่เก็บ


1

แก้ไข:

  1. ในเซิร์ฟเวอร์การผลิต:

    sudo -H nano /etc/environment
  2. จากนั้นในไฟล์เพิ่ม:

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

    เพื่อตั้งค่านี้อย่างถาวรและทั้งระบบ (ผู้ใช้ทั้งหมดกระบวนการทั้งหมด) เพิ่มตัวแปรชุด

  3. ในdevise.rbไฟล์โปรเจ็กต์โลคัล:

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

รายละเอียดทางเทคนิค:

  • Ubuntu 16.04
  • ประดิษฐ์ (4.2.0)
  • ราง 5.0.1
  • คาปิสตราโน (3.7.1)

1

พบปัญหาเดียวกันกับ Rails 5.2.0 และ Devise 4.4.1

ปล่อยสิ่งต่อไปนี้ลงใน /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base

1
สิ่งนี้มีความปลอดภัยน้อยกว่าในการผลิตและทำให้ยากต่อการเปลี่ยนแปลงในกรณีที่มีการละเมิดความปลอดภัย
lacostenycoder

0

พยายามให้คำตอบที่ค่อนข้างสมบูรณ์กว่าสำหรับคำตอบข้างต้น: ดังที่กล่าวไว้ในเอกสารของอัญมณี devise_auth_token

... นอกจากนี้คุณสามารถกำหนดค่าด้านอื่น ๆ ของการประดิษฐ์ได้โดยสร้างไฟล์ devise.rb แบบดั้งเดิมด้วยตนเองที่ config/initializers/devise.rb. นี่คือตัวอย่างบางส่วนของสิ่งที่คุณทำได้ในไฟล์นี้:

Devise.setup do |config|   
# The e-mail address that mail will appear to be sent from   
# If absent, mail is sent from "please-change-me-at-config-initializers-devise@example.com"  
config.mailer_sender = "support@myapp.com"

# 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

ฉันมีปัญหาเดียวกันและเหมือน metioned ที่นี่ฉันสร้างเครื่องมือเริ่มต้นประดิษฐ์และเพิ่มconfig.secret_key = ENV['DEVISE_SECRET_KEY']บรรทัดลงไป


-1

ฉันไม่รู้วิธีแก้ปัญหาที่ถูกต้อง แต่มันใช้งานได้ คุณสามารถลอง ฉันถูกโคลนโครงการของฉันจากบัญชี GitLab ของฉันและเมื่อฉันเรียกใช้ในเซิร์ฟเวอร์ภายในของฉันฉันมีข้อความแสดงข้อผิดพลาด:

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

เปิดconfig/initializers/devise.rbและเพิ่มบรรทัดนี้

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

บรรทัดรหัสนี้แก้ไขปัญหาของฉันได้


config จะไม่ประเมินจรวดทับทิม<%= %>เป็นการแก้ไขสตริง จากนั้นคีย์ของคุณจะเป็นสิ่งที่คุณพิมพ์ไว้ในตัวอักษร' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.