Devise: Missing devise secret key with Rails 5.2.0.beta2

Created on 28 Nov 2017  路  9Comments  路  Source: heartcombo/devise

It seems like Devise expects the secret key base to be set, but by default in Rails 5.2.0.beta2 it isn't:

Rails.application.secrets
=> {:secret_key_base=>nil, :secret_token=>nil}

Environment

  • Ruby 2.4.2
  • Rails 5.2.0.beta1
  • Devise 4.3.0

Current behavior

When I create a new rails app and add Devise to the gemfile and then run:

rails generate devise:install
rails generate devise User
rails console

Then I see this stack trace:

$ rails c
/Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/devise-4.3.0/lib/devise/rails/routes.rb:498:in `raise_no_secret_key': Devise.secret_key was not set. Please add the following to your Devise initializer:

  config.secret_key = 'd3b88254cd6893a72a7e24ffb1885b68edea336711b644a08b2336dc2e41115a9e5f939a81da0477c6facf73122a91d54b199ab1da4227fd708187964eaf8207'

Please ensure you restarted your application after installing Devise or setting the key.
 (RuntimeError)
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/devise-4.3.0/lib/devise/rails/routes.rb:226:in `devise_for'
    from /Users/jcoyne/workspace/foo/config/routes.rb:2:in `block in <main>'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionpack-5.2.0.beta2/lib/action_dispatch/routing/route_set.rb:422:in `instance_exec'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionpack-5.2.0.beta2/lib/action_dispatch/routing/route_set.rb:422:in `eval_block'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionpack-5.2.0.beta2/lib/action_dispatch/routing/route_set.rb:404:in `draw'
    from /Users/jcoyne/workspace/foo/config/routes.rb:1:in `<main>'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.1.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `load'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.1.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `load'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0.beta2/lib/active_support/dependencies.rb:277:in `block in load'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0.beta2/lib/active_support/dependencies.rb:249:in `load_dependency'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0.beta2/lib/active_support/dependencies.rb:277:in `load'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/routes_reloader.rb:57:in `block in load_paths'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/routes_reloader.rb:57:in `each'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/routes_reloader.rb:57:in `load_paths'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/routes_reloader.rb:20:in `reload!'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/routes_reloader.rb:43:in `block in updater'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0.beta2/lib/active_support/file_update_checker.rb:83:in `execute'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/routes_reloader.rb:44:in `updater'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/routes_reloader.rb:33:in `execute_if_updated'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application/finisher.rb:130:in `block in <module:Finisher>'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/initializable.rb:32:in `instance_exec'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/initializable.rb:32:in `run'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/initializable.rb:61:in `block in run_initializers'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:228:in `block in tsort_each'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:431:in `each_strongly_connected_component_from'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:349:in `block in each_strongly_connected_component'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `each'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `call'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `each_strongly_connected_component'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:226:in `tsort_each'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:205:in `tsort_each'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/initializable.rb:60:in `run_initializers'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0.beta2/lib/rails/application.rb:360:in `initialize!'
    from /Users/jcoyne/workspace/foo/config/environment.rb:5:in `<main>'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.1.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.1.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0.beta2/lib/active_support/dependencies.rb:283:in `block in require'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0.beta2/lib/active_support/dependencies.rb:249:in `load_dependency'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0.beta2/lib/active_support/dependencies.rb:283:in `require'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:102:in `preload'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:153:in `serve'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:141:in `block in run'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:135:in `loop'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:135:in `run'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application/boot.rb:19:in `<top (required)>'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:59:in `require'
    from /Users/jcoyne/.rbenv/versions/2.4.2/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:59:in `require'
    from -e:1:in `<main>'

Expected behavior

No stack trace.

PR attached

Most helpful comment

Before this change is released (as of today it still seems to be an issue), you can try:

# config/initializers/devise.rb
...
config.secret_key = Rails.application.credentials.secret_key_base
...

All 9 comments

Perhaps devise should look first at Rails.application.secret_key_base (which is set in 5.2.0.beta2) prior to looking at Rails.application.secrets[:secret_key_base]

I've sent a PR. That PR will solve this problem.

Before this change is released (as of today it still seems to be an issue), you can try:

# config/initializers/devise.rb
...
config.secret_key = Rails.application.credentials.secret_key_base
...

Update for Rails 5.2.0.rc1

Make sure your master_key hasn't changed after upgrade. That file is not tracked in Git.

... (previous comment is no longer valid, deleted).

@januszm, I am checking this at the moment and will report back with a merge if necessary.

@januszm, I double checked with Rails v5.2.0-rc1.

$ bundle exec rails credentials:edit

Output:

# aws:
#  access_key_id: 123
#  secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one $
secret_key_base: fd48be30aa33f5934ef1178c3f83221de9b6b58418f7270dbd6b4fed5d8d2139f762c975d05a2e3db470b31a227efc6c15185a94ff9ab10f7917e22804ca31da $

...Let's check the values if correctly loaded to devise:

$ puts app.credentials.secret_key_base
> fd48be30aa33f5934ef1178c3f83221de9b6b58418f7270dbd6b4fed5d8d2139f762c975d05a2e3db470b31a227efc6c15185a94ff9ab10f7917e22804ca31da #correct

$ puts app.secret_key_base
> cab7d1f9e4d2e0540d1620a9f6eba187 # wrong

Are you sure this has changed on 5.2.0-rc1? I see nothing has changed.

Attn: @tegon

Additional note: If you mean outside of devise, like Rails.cre... than my test does not cover that part. And sorry for the misunderstanding.

@gencer you're right, it was a different issue on my end, upgrade from Rails 5.2.0.beta2 to 5.2.0.rc1 broke my master_key and credentials became unusable. After fixing the master key, or dropping the new credentials feature completely the solution that I proposed earlier still works.

For those who encounter the same problem: if you have this issue, then most probably your master_key changed.

In my case I believe it's the gem devise_auth_token that overrides my config.secret configuration. Renaming devise.rb to zdevise.rb or something likewise did the trick.

you can try this (config/secrets.yml):

development:
secret_key_base: 83aa0c7d6e2ed4574099514eb64bc3896fb8a71a344935fbd54705e0dd65adb897bc062fe477d03395a4d65675c833ba73ed340166be3874bfc01f43d6076385

test:
secret_key_base: 513fb7657945b56098db290394bf23f5e11463c473fb228719428a30fd34b8b899dff3f6173c32d7e6bc028dc3276f15dcba11b684d27983d8203fb5634ce8ae

Do not keep production secrets in the repository,

instead read values from the environment.

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

Was this page helpful?
0 / 5 - 0 ratings