ruby-on-rails - 将 session 和 session_store 添加回 Rails 5 API( session 不持久)

标签 ruby-on-rails session ruby-on-rails-5 rails-api session-store

我正在尝试在 Rails 5 API 中设置基于 session 的基本身份验证策略。

我想我主要是遇到了配置困惑,因为每个请求都会生成一个新 session 。

我已将 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

我没有在数据库中存储 session 。

我有一个 session Controller ,当用户成功通过身份验证时,它会为 session 对象设置一个 current_user_id key 。
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 设置的身份验证策略有效。在查看 session#create 中的 session 时,它成功地将用户 ID 设置为 session 。

sessions#create

但是 session 似乎不会持久化或存储在浏览器中。登录后的 sessionStorage 长度为 0

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

sessions#destroy



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

最佳答案

您还需要将您的应用程序 Controller 更改为:

类 ApplicationController < ActionController::Base

关于ruby-on-rails - 将 session 和 session_store 添加回 Rails 5 API( session 不持久),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40347396/

相关文章:

ruby-on-rails - 如何在 Rails 中将一个模型的内容分配给另一个模型?

ruby-on-rails - 使用 devise 和 Rails 3 重定向到特定页面

ruby-on-rails - Rails 5.1 + Webpack .... CSS 中的图像?

ruby-on-rails - rails : How to use BIGINT as Primary Key

ruby-on-rails - 检测通过应用程序(即 Twitter)浏览 Rails 站点的 iOS 设备

ruby-on-rails - Ruby 图片审查 gem

javascript - 使用 Javascript 读取 session ID

PHPSESSID 在每次请求时都会更改而不是持久化

session - express redisStore :- can i store session as Array instead of String?

nginx - RoR 5.0.0 ActionCable wss WebSocket 握手 : Unexpected response code: 301