Добавление сессий и session_store обратно в Rails 5 API (сеансы не сохраняются)

Я пытаюсь настроить базовую стратегию аутентификации на основе сеансов в Rails 5 API.

Я думаю, что я в основном сталкиваюсь с путаницей конфигурации, потому что новый сеанс генерируется при каждом запросе.

Я добавил в приложение промежуточное ПО для файлов cookie и магазина cookie.

config/application.rb

  class Application < Rails::Application
        # Settings in config/environments/* take precedence over those specified here.
        # Application configuration should go into files in config/initializers
        # -- all .rb files in that directory are automatically loaded.

        # Only loads a smaller set of middleware suitable for API only apps.
        # Middleware like session, flash, cookies can be added back manually.
        # Skip views, helpers and assets when generating a new resource.
        config.middleware.use ActionDispatch::Cookies
        config.middleware.use ActionDispatch::Session::CookieStore

        config.api_only = false
      end

Кажется, я должен установить api_only в false или я получаю #<ActionDispatch::Request::Session:0x7fd40b2eec80 not yet loaded>

Я добавил инициализатор session_store и cookie_serializer:

config/initializers/session_store.rb

Rails.application.config.session_store :cookie_store, key: '_tunr_sol_json_api_session'

config/initializers/cookie_serializer.rb

Rails.application.config.action_dispatch.cookies_serializer = :json

Я не храню сессии в базе данных.

У меня есть контроллер сессий, который устанавливает ключ current_user_id для объекта сессий, когда пользователь успешно аутентифицирован.

app/controllers/sessions_controller.rb

class SessionsController < ApplicationController
  def create
    user = User.find_by(username: params[:user][:username])
    if user && user.authenticate(params[:user][:password])
      session[:current_user_id] = user.id
      render json: {status: 201, message: "session created", user: user}
    else
      render json: {status: 401, message: "unauthorized"}
    end
  end

  def destroy
    session[:current_user_id] = nil
    render json: {status: 204, message: "no content"}
  end
end

Поведение

Стратегия аутентификации, которую я настроил с помощью bcrypt и has_secure_password, работает. И при просмотре сеанса в сеансах # create он успешно устанавливает идентификатор пользователя для сеанса.

сессий # создать

Но сессия, похоже, не сохраняется и не сохраняется в браузере. sessionStorage после входа в систему имеет длину 0

Когда я выхожу и проверяю сеанс, он создает новый сеанс.

сессий # уничтожить

Вопрос

Не уверен, какая конфигурация мне не хватает или неправильно, чтобы настроить эту функцию с API.

1 ответ

Вам также необходимо изменить контроллер приложений на:

Класс ApplicationController

Другие вопросы по тегам