我正在尝试在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设置的auth策略有效。在查看会话#中的会话时,创建它会成功将用户ID设置为会话。
但是会话似乎不会持续存在或存储在浏览器中。登录后的sessionStorage长度为0
当我退出并检查会话时,它会创建一个新会话。
不确定我使用api设置此功能时缺少或错误的配置。
答案 0 :(得分:0)
您还需要将应用程序控制器更改为:
class ApplicationController&lt;的ActionController ::基