将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' 

当我在控制器中检查会话时,它会导致:

  

但是看起来确实正在写入和使用数据。

但是,在我的浏览器中,cookie本身被命名为’_session_id’而不是’_namespace_key’

我以为我添加了基于cookie的会话存储所需的每一件,但我似乎缺少别的东西。 有任何想法吗?

您需要从application.rb文件中删除这些中间件声明并添加以下内容:

 config.api_only = false 

如果初始化程序中有某个配置的session_store (您拥有),这将以您希望的方式启用会话管理。 这没有明确记录, 但这就是你应该做的 。

这里的例子。

如果您使用的是Rails 5,并希望保留config.api_only = true ,则可以扩展中间件以添加会话层,在config/application.rb class Application < Rails::Application之后添加此代码

 config.middleware.use ActionDispatch::Cookies config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key' 

当您想要一个api-only支持rails api-only应用程序但必须使用ActiveAdmin或Rails_Admin等管理面板管理用户会话时,这可能会派上用场。

忽略此行,因为您没有使用完整的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中的模块覆盖)。