Devise Secret Key chưa được đặt


99

Tôi đang phát triển ứng dụng Rails 4 bằng cách sử dụng đá quý Active Admin cho phần quản trị phía sau. Đến lượt mình, Active Admin sử dụng Devise để xác thực người dùng. Bây giờ, khi tôi cố gắng triển khai ứng dụng bằng cách sử dụngcapistrano máy chủ VPS, tôi gặp lỗi dưới đây:

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

Tìm kiếm trên Google không giải quyết được nhiều lỗi này. Bất kỳ đề xuất tại sao nó đang ném một lỗi? Tôi có nên thêm khóa bí mật vào trình devisekhởi tạo, vì tôi không thể tìm thấy bất kỳ nơi nào để đặt khóa cấu hình đó initializers/devise.rb?


@mrbrdo vâng, thông báo cho biết chính xác những gì bị thiếu, nhưng khi bạn mở tệp devise.rb thì không có tài liệu nào về secret key. Ngoài ra, nếu bạn đang chạy một bản cài đặt mới, ứng dụng sẽ đảm nhận việc đó. Nhờ vé tại github.com/plataformatec/devise/issues/2554, nó đã được giải quyết.

Câu trả lời:


87

Tôi đã chạy bundle updatesáng nay và bắt đầu gặp lỗi tương tự.

Tôi đã thêm nó dưới dạng một dòng config/initializers/devise.rbvà lỗi đã được sửa.

Đây dường như là cam kết đã giới thiệu nó.


24
Nhân viên Google trong tương lai, kể từ 2014-07-08, stackoverflow.com/questions/18080910/… là câu trả lời thích hợp hơn cho Rails 4+ để tránh phát tán bí mật trong toàn bộ cấu hình.
Zachary Moshansky

3
Kể từ ngày 10 tháng 10 năm 2015, stackoverflow.com/a/32525855/1842747 là câu trả lời tốt nhất, nhưng tôi thực sự khuyên bạn nên đi thẳng vào việc đặt SECRET_KEY_BASEbiến môi trường thay vì sao chép nó vào secrets.ymlđể bạn không quên rằng "khóa bí mật" của mình là không đủ bí mật!
monozok,

38

Những gì làm việc cho tôi trên Rails 4.1 và Devise 3.2.4 là ở config/initializers/devise.rb:

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

Hoặc nếu bạn sử dụng figarođá quý:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander

33

Kể từ Devise 3.2.3 cho các ứng dụng Rails 4+, vị trí cài đặt khóa được mặc định thành YourAppName :: Application.config.secret_key_base được tìm thấy trong config / initializers / secret_token.rb


2
Ah tốt để biết. Tôi hiểu rằng việc một ứng dụng nguồn mở có khóa bí mật Devise nằm ở đâu đó dưới dạng văn bản thuần túy trong nguồn là một Điều Rất Xấu, đúng không? Ít nhất thì mặc định này cho phép chúng tôi thiết lập khóa bí mật động ở ít nơi hơn.
Topher Hunt

4
Ai đó có thể giải thích phải làm gì với thông tin này, cho những người không chuyên nghiệp? cảm ơn!
ahnbizcad

2
Tôi không thấy tệp đó trong ứng dụng của mình. Điều này có nghĩa là rails g devise: install không hoạt động thành công? Hay là câu trả lời này đã lỗi thời?
ahnbizcad

10
Đã lỗi thời. secret_token.rb không có sẵn trong Rails 4, đã được thay thế bằng config / secret.yml (xem tại đây để biết thêm thông tin). Hơi lạc đề, nhưng hãy đảm bảo bao gồm config / secret.yml trong .gitignore của bạn, giống như nó đã nói trong phần nhận xét do Rails tạo. Để tìm hiểu cách thực hiện, hãy truy cập vào đây .
brntsllvn

12

Điều này đã giải quyết vấn đề của tôi:

Thêm mã bên dưới vào tệp config / initializers / devise.rb của bạn .

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

Thay thế '- khóa bí mật--' bằng khóa của riêng bạn. Tôi khuyên bạn nên lưu trữ nó trong một biến ENV cho mục đích bảo mật.


2
Bạn làm việc đó bằng cách nào và làm cách nào để kết nối chúng?
ahnbizcad

3
^ câu trả lời cho điều đó là sử dụng đá quý figaro. github.com/laserlemon/figaro Bạn đặt tất cả các khóa thực của mình vào config / application.ymlfile, giới thiệu nó để chúng giữ bí mật và tham khảo chúng ở những nơi khác trong ứng dụng của bạn như vậy ENV["your_particular_secret_key_name"]. Sau đó, ứng dụng của bạn tham chiếu động đến các khóa của bạn. Nhưng bạn đã bỏ qua các khóa của mình, vậy làm cách nào để đưa chúng vào môi trường sản xuất của bạn? Bạn đẩy chúng trực tiếp từ môi trường phát triển địa phương của bạn để sử dụng Heroku Figaro, và khóa bí mật của mình sẽ kết thúc như biến môi trường trên Heroku
ahnbizcad

12

Theo changelog :

Devise sẽ sử dụng secret_key_base trên các ứng dụng Rails 4+ làm secret_key của nó. Bạn có thể thay đổi điều này và sử dụng bí mật của riêng mình bằng cách thay đổi trình khởi tạo devise.rb.

Tôi đã đi đến config/secrets.ymlvà thay đổi productiongiá trị.

Trước:

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

Sau:

production: 
  secret_key_base: string of charaters

Tất nhiên, điều đó nên được đặt thành biến môi trường, mà tôi sẽ đặt sau, nhưng điều này ít nhất đã làm cho nó chạy. Tôi đã nhận được chuỗi của mình bằng cách sử dụng bundle exec rake secret.


11
Đây là một mô hình chống. Vui lòng không kiểm tra khóa bí mật sản xuất của bạn.
Zack Brown

10

Nó có thể được, rằng bạn đã không chạy rails g devise:install?

Chạy rails generate devise Usermà không có lệnh trước đó gây ra sự cố này.


1
Đó là vấn đề của tôi, nhưng làm thế nào để bạn sửa chữa nó ...?
C404

Có thể chạy lại "rails g devise: install" sau khi tạo người dùng. Nếu bạn sử dụng git, hãy tạo nhánh kiểm tra và thử nó. Nếu không, hãy thử nó trên một bản sao của dự án của bạn.
sascha.daniels

Đây là vấn đề của tôi. Tôi đã xóa ứng dụng (tôi chưa làm gì nhiều) và đã làm rails g devise usertrước khi tôi cố gắng tạo bảng người dùng và di chuyển. Điều này đã khắc phục sự cố.
Matt

điều này đã giải quyết vấn đề tương tự cho tôi với Rails 5.0.0.beta4 & Devise 4.1.1 nhưng tôi không chắc tại sao. Tôi chạy một diff và dòng duy nhất mà thay đổi trong devise.rb tôi, ngoài một khóa bí mật khác nhau, là + 102: "config.stretches = Rails.env.test 1: 11?"
Cleverlemming

10

Trong config/initializers/devise.rbtôi đặt:

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

Bởi vì nếu bạn đặt:

$ heroku config

Bạn sẽ thấy một secret_key_basechế độ production.


2
Tôi nghĩ rằng có một vấn đề lớn về bảo mật với câu trả lời này. Nếu bạn đặt các dấu ngoặc kép xung quanh '<% = ENV ["SECRET_KEY_BASE"]%>' như câu trả lời gợi ý, thì tôi nghĩ bạn nhận được chuỗi ký tự chính xác đó thay vì lấy cơ sở khóa bí mật được nội suy. Nói cách khác, nó phát âm theo nghĩa đen là ENV ["SECRET_KEY_BASE"], phải không?
dùng1515295

Để làm rõ, hãy sử dụng dấu ngoặc kép: "<% = ENV [" SECRET_KEY_BASE "]%>"
user1515295

3
devise.rb là tệp ruby, không phải tệp erb. Không cần cú pháp <% =. Chỉ cần sử dụng config.secret_key = ENV ["SECRET_KEY_BASE"]
John Hinnegan

6

Tôi giải quyết vấn đề trình khởi tạo của mình bằng cách tiếp cận xấu xí này:

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

trong config / initializers / devise.rb Nó hiện hoạt động trong sản xuất cũng như phát triển!


6

Tôi đã sao chép kho lưu trữ của mình vào một máy mới từ git. Các

config/secrets.yml 

tệp nằm trong danh sách .gitignore của tôi, vì vậy tệp đó không tồn tại và Devise không tạo tệp.

Tôi đã thêm tệp, sau đó chạy lại

rails generate devise MODEL

va no đa hoạt động.


1
ĐIỀU NÀY. Github nghĩ rằng việc thêm secrets.ymlvào .gitignoretệp của tôi sẽ rất hữu ích . Tôi đã không đọc qua nó một cách kỹ lưỡng và mơ hồ bị ấn tượng rằng nó bao gồm nhiều thứ hơn cả .gitignoretệp Rails được tạo . : facepalm:
steve

Đúng, đây là vấn đề của tôi. Tôi đã hoàn nguyên về một cam kết git cũ và tệp secret.yml đã biến mất.
ddonche

Chỉ có cùng một vấn đề này. Một ứng dụng tôi đang sử dụng để làm theo hướng dẫn cho một thứ gì đó không hoạt động, vì vậy tôi đã sao chép vào một thư mục mới và sao chép cam kết của tác giả hướng dẫn. Không thấy sự cố, vì vậy tôi đã đặt config.secret_key theo cách thủ công. Chỉ được phát hiện khi khởi động máy chủ rails của tôi. Đã tặng bạn một ủng hộ để mức này có thể cao hơn!
Joe

5

Kiểm tra xem bạn config\initializers\secret_token.rbcó:

YourAppName::Application.config.secret_token

Nó phải là:

YourAppName::Application.config.secret_key_base

4

Tôi có cùng một vấn đề. Sự cố do những dòng này gây ra trong 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

Tôi nhận xét chúng và sau đó tôi chạy:

$ rails generate devise:install

Và nó đã đánh giá hoàn hảo. Và sau đó tôi bỏ ghi các tuyến đường.


Hoàn hảo, cảm ơn. Gặp sự cố này khi thiết lập một dự án mới và quên mất việc rails generate devise:installtrước khi tạo mô hình phát minh đầu tiên của tôi. Theo câu trả lời này, hãy nhận xét dòng devise_for trong các tuyến sau đó chạy lệnh create và nó hoạt động.
user208769

i nhận xét ra devise_fordòng để có được db cào của tôi: di chuyển đến làm việc .. không biết lý do tại sao mặc dù
Clam

1

Vâng, tôi đã theo dõi bài đăng này và đã thử hầu hết mọi thứ ở đây. Tôi đã thêm khóa vàodevise.rb . Nhưng tôi vẫn gặp lỗi tương tự.

Có thể là một câu trả lời ngu ngốc, nhưng tất cả những gì tôi phải làm là đẩy devise.rbchìa khóa vào kho lưu trữ.


1

Sửa chữa:

  1. Trong máy chủ sản xuất:

    sudo -H nano /etc/environment
  2. Sau đó, trong tệp thêm:

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

    để đặt điều này vĩnh viễn và trên toàn hệ thống (tất cả người dùng, tất cả các quy trình) hãy thêm biến tập hợp

  3. Trong devise.rbtệp dự án cục bộ :

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

Chi tiết kỹ thuật:

  • Ubuntu 16.04
  • Devise (4.2.0)
  • đường ray 5.0.1
  • capistrano (3.7.1)

1

Gặp phải rắc rối tương tự với Rails 5.2.0 và Devise 4.4.1

Thả phần sau vào /config/initializers/devise.rb

config.secret_key = Rails.application.credentials.secret_key_base

1
điều này kém an toàn hơn trong quá trình sản xuất và khó thay đổi hơn trong trường hợp vi phạm bảo mật.
lacostenycoder

0

Cố gắng đưa ra câu trả lời hơi đầy đủ hơn cho những câu ở trên: Như đã đề cập trong tài liệu của gem devise_auth_token

... Ngoài ra, bạn có thể định cấu hình các khía cạnh khác của devise bằng cách tạo thủ công tệp devise.rb truyền thống tại config/initializers/devise.rb. Dưới đây là một số ví dụ về những gì bạn có thể làm trong tệp này:

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

Tôi đã gặp vấn đề tương tự, và giống như đã phân loại ở đây, tôi đã tạo trình khởi tạo devise và thêm config.secret_key = ENV['DEVISE_SECRET_KEY']dòng vào nó.


-1

Tôi không biết giải pháp đúng nhưng nó đang hoạt động. Bạn có thể thử nó. Tôi đã sao chép dự án của mình từ tài khoản GitLab của mình và khi tôi chạy trong máy chủ cục bộ của mình, tôi gặp phải Thông báo lỗi:

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

Mở config/initializers/devise.rbvà thêm dòng này

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

Dòng mã này đã được giải quyết vấn đề của tôi.


cấu hình sẽ không đánh giá tên lửa ruby <%= %>dưới dạng nội suy chuỗi. Chìa khóa của bạn sau đó sẽ theo nghĩa đen là những gì bạn đã gõ bên trong chuỗi chữ' what ever the %he!@#$ you type here is your key no matter what characters'
lacostenycoder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.