Adding cookie session store back to Rails API app
You need to remove these middleware declarations from your application.rb
file and add this:
config.api_only = false
This will enable session management the way you want if there is a configured session_store
somewhere in your initialisers (which you have). This isn't clearly documented, but that's what you're supposed to do.
Example here.
If you're on Rails 5, and want to preserve config.api_only = true
you could extend the middleware to add the sessions layer, adding this code after class Application < Rails::Application
in config/application.rb
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'
This could come in handy when you want to have a rails api-only
enabled app but have to manage user sessions with an administration panel like ActiveAdmin or Rails_Admin.
This line is ignored because you are not using the full Rails stack:
::Rails.application.config.session_store :cookie_store,
:key => '_namespace_key'
So instead, your session is using the default session key set here. However, you can pass these arguments directly by replacing:
config.middleware.insert_after
ActionDispatch::Cookies, ActionDispatch::Session::CookieStore
with:
config.middleware.insert_after
ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
:key => '_namespace_key'
Here's a full list of options you can pass (with a rough idea of their defaults, since some may be overridden by modules in Rails).
This worked for me in Rails 6.0, application.rb
:
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore)
If you want to set custom key (yes, it has to be set twice):
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_your_app'
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, key: '_your_app')
And lastly, if you want to add expiration date - it's done here:
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_your_app', expire_after: 20.years
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, key: '_your_app')
Would have loved linking to documentation, but there's none.