Добавление хранилища сеансов 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).