Добавление хранилища сеансов cookie обратно в приложение Rails API

У меня есть приложение Rails-API. Более или менее "из коробки", но я хочу добавить обратно хранилище сеансов на основе файлов cookie. Вот что я сделал:

приложение/контроллеры/application_controller.rb

+ include ::ActionController::Cookies

конфигурации/application.rb

+ config.middleware.insert_after ActiveRecord::QueryCache, ActionDispatch::Cookies
+ config.middleware.insert_after ActionDispatch::Cookies, ActionDispatch::Session::CookieStore

создан config/initializers/secret_token.rb

+ Namespace::Application.config.secret_token = 'token'

создан config/initializers/session_store.rb

+ Namespace::Application.config.session_store :cookie_store, :key => '_namespace_key'

Когда я проверяю сеанс в контроллере, он выводит результат:

<Rack::Session::Abstract::SessionHash:0x3fdadc5daa24 not yet loaded>

Однако, похоже, что данные записываются и используются.

Но в моем браузере сам файл cookie называется "_session_id" вместо "_namespace_key"

Мне показалось, что я добавил все, что требуется для хранилища сеансов на основе файлов cookie, но, похоже, мне не хватает чего-то другого. Любые идеи?

Ответ 1

Вам нужно удалить эти объявления промежуточного слоя из вашего файла application.rb и добавить это:

config.api_only = false

Это позволит управлять сеансом так, как вы хотите, если есть сконфигурированный session_store где-то в ваших инициализаторах (который у вас есть). Это явно не документировано, но это то, что вы должны делать.

Пример здесь.

Ответ 2

Если вы используете Rails 5 и хотите сохранить config.api_only = true, вы можете расширить промежуточное программное обеспечение, чтобы добавить уровень сеансов, добавив этот код после class Application < Rails::Application в config/application.rb

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'

Это может пригодиться, если вы хотите иметь приложение с поддержкой rails api-only, но должны управлять сеансами пользователя с помощью панели администрирования, такой как ActiveAdmin или Rails_Admin.

Ответ 3

Эта строка игнорируется, потому что вы не используете полный стек Rails:

::Rails.application.config.session_store :cookie_store,
  :key => '_namespace_key'

Итак, ваш сеанс использует ключ сеанса по умолчанию здесь. Однако вы можете передать эти аргументы напрямую, заменив:

config.middleware.insert_after 
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore

с:

config.middleware.insert_after
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
  :key => '_namespace_key'

Здесь полный список опций, которые вы можете передать (с приблизительным представлением об их значениях по умолчанию, поскольку некоторые могут быть переопределены модулями в Rails).