将会话和 session_store 添加回 Rails 5 API(会话不持久)

col*_*bot 5 session ruby-on-rails session-store rails-api ruby-on-rails-5

我正在尝试在 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
Run Code Online (Sandbox Code Playgroud)

看来我必须将 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'
Run Code Online (Sandbox Code Playgroud)

config/initializers/cookie_serializer.rb

Rails.application.config.action_dispatch.cookies_serializer = :json
Run Code Online (Sandbox Code Playgroud)

我没有将会话存储在数据库中。

我有一个会话控制器,当用户成功通过身份验证时,它将 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
Run Code Online (Sandbox Code Playgroud)

行为

我使用 bcrypt 和 has_secure_password 设置的身份验证策略有效。在session#create 中查看会话时,它成功地将用户ID 设置为会话。

会话#创建

但会话似乎没有持续存在或存储在浏览器中。登录后sessionStorage长度为0

当我注销并检查会话时,它会创建一个新会话。

会话#destroy

问题

不确定我缺少什么配置或错误地使用 api 设置此功能。

Gle*_*len 0

您还需要将应用程序控制器更改为:

类 ApplicationController < ActionController::Base