Ruby on rails 将cookie会话存储添加回Rails API应用程序

Ruby on rails 将cookie会话存储添加回Rails API应用程序,ruby-on-rails,Ruby On Rails,我有一个Rails API应用程序。或多或少是“开箱即用”,但我想添加回基于cookie的会话存储。以下是我所做的: app/controllers/application_controller.rb + include ::ActionController::Cookies config/application.rb + config.middleware.insert_after ActiveRecord::QueryCache, ActionDispatch::Cookies + con

我有一个Rails API应用程序。或多或少是“开箱即用”,但我想添加回基于cookie的会话存储。以下是我所做的:

app/controllers/application_controller.rb

+ include ::ActionController::Cookies
config/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'
当我在控制器中检查会话时,结果是:

<Rack::Session::Abstract::SessionHash:0x3fdadc5daa24 not yet loaded>

但是,数据似乎正在写入和使用

但是,在我的浏览器中,cookie本身被命名为“\u session\u id”,而不是“\u namespace\u key”


我以为我添加了基于cookie的会话存储所需的每一部分,但我似乎缺少了其他东西。有什么想法吗?

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

config.api_only = false
如果您的初始化器(您有)中有一个已配置的
session\u存储
,这将以您想要的方式启用会话管理。这是没有明确记录


示例。

由于未使用完整的Rails堆栈,因此忽略此行:

::Rails.application.config.session_store :cookie_store,
  :key => '_namespace_key'
因此,您的会话使用的是默认会话密钥。但是,可以通过替换以下内容直接传递这些参数:

config.middleware.insert_after 
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore
与:


以下是(大致了解它们的默认设置,因为有些默认设置可能会被Rails中的模块覆盖)。

如果您在Rails 5上,并且希望保留
config.api\u only=true
您可以扩展中间件以添加会话层,在
config/Application.rb

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

当你想要一个只支持rails
api的应用程序,但必须使用诸如ActiveAdmin或rails\u Admin之类的管理面板来管理用户会话时,这可能会很方便。

这对我在rails 6.0,
application.rb中的工作非常有效:

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore)
如果要设置自定义密钥(是,必须设置两次):

最后,如果要添加过期日期,请在此处完成:

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_your_app', expire_after: 20.years 
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, key: '_your_app')

本想链接到文档,但没有。

虽然这可能会解决问题,但这样做确实没有意义。我使用rails api来保持堆栈的苗条和整洁。设置
config.api_only=false本质上是说只使用常规的、完整的Rails堆栈。。。在这种情况下,使用rails api毫无意义。@TurboLoaded是正确的——这违背了使用rails api的目的。如果您只想包含特定的中间件和特定的选项,那么有一种非常干净的方法可以做到这一点——就像rails api本身做这件事的方法一样——真是糟糕!赞美主的这个问题和答案!经过数小时的代码追踪,我几乎要勒死自己了,试图弄明白为什么#$%^!它没有使用我的会话(U选项!)如果人们不想禁用
api_only
,我将在这个答案中添加一个替代选项。好的,我的编辑被拒绝了,我猜(?)但是请参见下面@IsaacBetesh的答案以了解这个想法。我还为Rails指南添加了一个PR,以解释尝试将会话中间件添加回Rails api_only应用程序的特殊情况:我也有同样的问题,您是否最终禁用了
api_only
?似乎这不是一个好的解决方案。要在Rails 5 API应用程序上启用ActiveAdmin,除了上面的步骤之外,您还必须执行一些其他步骤。具体来说,您必须创建两个基本控制器,一个用于继承自
ActionController::base
的ActiveAdmin,另一个用于继承自
ActionController::API
的API控制器。您还需要一些中间件来获得仪表板视图渲染。我写了所有的步骤。希望有帮助!这可能是显而易见的,但在这种情况下,
config.session\u存储
不再有用;现在只需要这个
config.middleware.use
工具。此外,像
key:“\u namespace\u key”
这样的选项也应该移动到
config.middleware。使用
语句。根据这一点,除了启用中间件之外,您可能还需要在控制器中
包括AbstractController::Helpers
包括ActionController::Cookies
。另外,在每个环境文件中分别声明这一点很重要。特别是如果您使用的是omniauth(取决于在
session\u store
上设置的域)。
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_your_app'
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, key: '_your_app')
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_your_app', expire_after: 20.years 
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, key: '_your_app')