デバイスの秘密鍵が設定されていません


99

管理バックエンドにActive Admin gemを使用してRails 4アプリを開発しています。アクティブ管理者は、ユーザー認証にDeviseを使用します。ここでcapistrano、VPSサーバーでアプリをデプロイしようとすると、次のエラーが発生します。

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

グーグル検索はこのエラーに対してあまり効果がありません。エラーがスローされる理由はありますか?deviseそのような設定キーを設定する場所が見つからないため、イニシャライザに秘密キーを追加する必要がありますかinitializers/devise.rb


@mrbrdo yesメッセージには欠落しているものが正確に示されますが、devise.rbファイルを開いたときにに関するドキュメントはありませんsecret key。また、フレッシュインストールを実行している場合は、アプリケーションで処理する必要があります。github.com/plataformatec/devise/issues/2554のチケットのおかげで解決されました。

回答:


87

私はbundle update今朝走り、同じエラーが出始めました。

それを行として追加しconfig/initializers/devise.rb、エラーを修正しました。

これはそれを導入したコミットのようです。


24
今後のGoogle社員、2014年7月8日現在、Stackoverflow.com / questions / 18080910 / は、設定全体にシークレットを拡散しないようにするためのRails 4+のより適切な回答です。
ザカリーモシャンスキー2014

3
2015-10-30現在、stackoverflow.com / a / 32525855/1842747が最良の答えですが、SECRET_KEY_BASE環境変数をコピーするのではなく直接設定しsecrets.ymlて、「秘密鍵」を忘れないようにすることを強くお勧めします秘密が足りない!
monozok 2015年

38

何Railsの4.1と工夫3.2.4に私のために働いたことですconfig/initializers/devise.rb

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

または、figarogem を使用する場合:config.secret_key = Figaro.env.devise_secret_key if Rails.env.production?
Alexander

33

以下のよう工夫3.2.3 Railsの4+アプリケーションに場所のデフォルトを設定するキーのApplication.config.secret_key_baseはYourAppName ::設定/初期化子/ secret_token.rbで見つかりました


2
知ってよかった。オープンソースアプリがソースのプレーンテキストのどこかにDevise秘密鍵を置くのは非常に悪いことだと私は理解しています。少なくともこのデフォルトでは、動的な秘密鍵をより少ない場所にセットアップできます。
Topher Hunt

4
プロではない人のために、誰かがこの情報をどうするかを説明できますか?ありがとう!
ahnbizcad 14

2
アプリにそのファイルが表示されません。これは、rails g devise:installが正常に機能しなかったことを意味しますか?または、この回答はすでに古くなっていますか?
ahnbizcad 14

10
時代遅れ。secret_token.rbはRails 4には付属していません。config / secrets.ymlで置き換えられています(詳細はこちらを参照)。少しトピックから外れていますが、Railsで生成されたコメントにあるように、必ず.gitignoreにconfig / secrets.ymlを含めてください。方法については、こちらをご覧ください
brntsllvn

12

これは私の問題を解決しました:

以下のコードをconfig / initializers / devise.rbファイルに追加します。

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

「-秘密鍵-」を自分の鍵に置き換えます。セキュリティ上の理由から、それをENV変数に格納することをお勧めします。


2
どのようにしてどこで、どのように接続しますか?
ahnbizcad 14

3
^その答えは、フィガロの宝石を使用することです。github.com/laserlemon/figaro config / application.ymlfileに実際のキーをすべて入れ、それをgitignoreして秘密に保ち、アプリケーション内の他の場所でそれらを参照できるようにしますENV["your_particular_secret_key_name"]。次に、アプリはキーを動的に参照します。しかし、あなたはあなたのキーを無視したので、どうやってそれらをあなたのプロダクション環境に導くのですか?figaroを使用して、ローカル開発環境からherokuに直接プッシュすると、秘密鍵がherokuの環境変数として最終的に作成されます
ahnbizcad

12

変更ログに従って:

Deviseは、Rails 4+アプリケーションのsecret_key_baseをその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
これはアンチパターンです。本番用の秘密鍵はチェックインしないでください。
ザックブラウン

10

あなたは走らなかったのrails g devise:installでしょうか?

rails generate devise User前のコマンドなしで実行すると、この問題が発生します。


1
それは私の問題ですが、どのように修正するのですか...?
C404 2014年

ユーザーを作成した後、「rails g devise:install」を再実行できるはずです。gitを使用している場合は、testingブランチを作成して試してください。そうでない場合は、プロジェクトのコピーで試してください。
sascha.daniels 2014年

これが私の問題でした。私はアプリを削除し(私はあまり行っていません)rails g devise user、ユーザーテーブルを作成して移行する前に削除しました。これで問題が解決しました。
マット

これにより、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_baseモードのが表示されますproduction


2
この答えにはセキュリティ上の大きな問題があると思います。答えが示唆するように '<%= ENV ["SECRET_KEY_BASE"]%>'を一重引用符で囲むと、補間された秘密鍵ベースを取得するのではなく、その正確な文字列が得られると思います。言い換えれば、文字通りENV ["SECRET_KEY_BASE"]と綴りますよね?
user1515295 2017

明確にするには、二重引用符を使用します: "<%= ENV [" SECRET_KEY_BASE "]%>"
user1515295

3
devise.rbはrubyファイルであり、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ファイルに追加することで役立つと考えました。完全なリードスルーを提供しなかったので、生成されたRails .gitignoreファイルよりもはるかに多く含まれていることに漠然と感銘を受けました。:facepalm:
steve

はい、これが私の問題でした。古いgit commitに戻したところ、secrets.ymlファイルがなくなっていました。
ddonche

ちょうどこれと同じ問題がありました。チュートリアルをフォローするために使用しているアプリが機能しないため、新しいディレクトリにクローンを作成し、チュートリアルの作成者のコミットをコピーしました。問題が見つからなかったので、config.secret_keyを手動で設定しました。私のRailsサーバーを起動したときにのみわかりました。これが高くなるようにあなたに賛成票を与えてください!
ジョー

5

あなたconfig\initializers\secret_token.rbが持っているかどうかを確認してください:

YourAppName::Application.config.secret_token

そのはず:

YourAppName::Application.config.secret_key_base

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行をコメント化してから、generateコマンドを実行すると機能します。
user208769 2014年

私はコメントアウトdevise_for...全く分からない理由しかし仕事への移行:私のすくいデシベルを取得するためのラインを
ハマグリ

1

さて、私はこの投稿をフォローしていて、ここでほとんどすべてを試しました。にキーを追加しましたdevise.rb。しかし、私はまだ同じエラーが発生していました。

ばかげた答えかもしれませんが、私がしなければならなかったのはdevise.rb、リポジトリにキーをプッシュすることだけでした。


1

修正:

  1. 本番サーバー:

    sudo -H nano /etc/environment
  2. 次に、ファイルに次を追加します。

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

    これを永続的に設定するには、システム全体(すべてのユーザー、すべてのプロセス)にset変数を追加します

  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 gemのドキュメントで述べたように

...さらに、で従来のdevise.rbファイルを手動で作成することにより、deviseの他の側面を構成できます 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

同じ問題があり、ここで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'
とおりに
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.