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

bca*_*lla 31 ruby-on-rails

我有一个Rails-API应用程序.或多或少"开箱即用",但我想添加回基于cookie的会话存储.这就是我所做的:

应用程序/控制器/ application_controller.rb

+ include ::ActionController::Cookies
Run Code Online (Sandbox Code Playgroud)

配置/ application.rb中

+ config.middleware.insert_after ActiveRecord::QueryCache, ActionDispatch::Cookies
+ config.middleware.insert_after ActionDispatch::Cookies, ActionDispatch::Session::CookieStore
Run Code Online (Sandbox Code Playgroud)

创建了config/initializers/secret_token.rb

+ Namespace::Application.config.secret_token = 'token'
Run Code Online (Sandbox Code Playgroud)

创建了config/initializers/session_store.rb

+ Namespace::Application.config.session_store :cookie_store, :key => '_namespace_key'
Run Code Online (Sandbox Code Playgroud)

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

<Rack::Session::Abstract::SessionHash:0x3fdadc5daa24 not yet loaded>
Run Code Online (Sandbox Code Playgroud)

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

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

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

jst*_*nno 39

如果你on Rails的5,并且想保留config.api_only = true你可以扩展中间件添加会话层,之后加入该代码class Application < Rails::Applicationconfig/application.rb

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'
Run Code Online (Sandbox Code Playgroud)

当您想要api-only启用rails 应用但必须使用ActiveAdmin或Rails_Admin等管理面板管理用户会话时,这可能会派上用场.

  • 这可能是显而易见的,但“config.session_store”在这种情况下不再有用;现在只需要这个`config.middleware.use`东西。此外,像“key: '_namespace_key'”这样的选项也应该移动到“config.middleware.use”语句中。 (2认同)
  • 根据这个 [Rails issue](https://github.com/rails/rails/issues/24239#issuecomment-199409912),你可能还需要在 `include AbstractController::Helpers` 和 `include ActionController::Cookies` 中控制器除了启用中间件。 (2认同)

Mau*_*res 13

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

config.api_only = false
Run Code Online (Sandbox Code Playgroud)

如果session_store初始化程序中有某个位置(您有),则可以按照您的方式启用会话管理.这没有明确记录,但这就是你应该做的.

这里的例子.

  • 虽然这可以解决问题,但这样做并没有多大意义.我使用rails-api来保持我的堆栈纤细和修剪.将`config.api_only = false`设置为只使用常规的完整Rails堆栈....在这种情况下,使用rails-api毫无意义. (13认同)
  • @turboladen是对的 - 这违背了使用rails-api的目的.如果您只想包含具体选项的特定中间件,那么有一种非常简洁的方法 - 就像rails-api本身所做的那样[这里](https://github.com/rails-api/rails- API /斑点/ V0.4.0/LIB /导轨-API /应用/ default_rails_four_middleware_stack.rb#L13) (2认同)

Isa*_*esh 7

忽略此行,因为您没有使用完整的Rails堆栈:

::Rails.application.config.session_store :cookie_store,
  :key => '_namespace_key'
Run Code Online (Sandbox Code Playgroud)

因此,您的会话使用此处设置的默认会话密钥.但是,您可以通过替换来直接传递这些参数:

config.middleware.insert_after 
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore
Run Code Online (Sandbox Code Playgroud)

有:

config.middleware.insert_after
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
  :key => '_namespace_key'
Run Code Online (Sandbox Code Playgroud)

这里是您可以传递的完整选项列表(大致了解它们的默认值,因为有些可能被Rails中的模块覆盖).


Fel*_*ger 6

这在 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)
Run Code Online (Sandbox Code Playgroud)

如果要设置自定义键(是的,必须设置两次):

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')
Run Code Online (Sandbox Code Playgroud)

最后,如果您想添加到期日期 - 在这里完成:

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')
Run Code Online (Sandbox Code Playgroud)

本来希望链接到文档,但没有。