Rails 5 API Omniauth 使用 ActiveRecord 会话存储

Rails 5 API Omniauth use ActiveRecord Session Store

目前我们正在使用 Omniauth 和 DeviseTokenAuth 实施 Rails 5 API。

初始部分似乎工作得很好,但是当尝试验证令牌并做任何进一步的事情时,我们收到 CookieOverflow 错误。我们推断这是由于我们从 Omniauth 登录中存储了 >4KB 的信息。

我们试图转向数据库存储的会话,但继续从 Omniauth 收到错误

NoSessionError: You must provide a session to use OmniAuth

我们正在使用

gem 'activerecord-session_store'

我们的数据库迁移如下

class AddSessionsTable < ActiveRecord::Migration
  def change
    create_table :sessions do |t|
      t.string :session_id, :null => false
      t.text :data
      t.timestamps
    end

    add_index :sessions, :session_id, :unique => true
    add_index :sessions, :updated_at
  end
end

最后我们确实在 config/application.rb 上设置了会话存储

config.session_store :active_record_store, :key => '_my_app_session'

我不确定为什么会继续收到“您必须提供会话才能使用 OmniAuth”的错误。如果我们将其切换回 cookiestore

config.middleware.use ActionDispatch::Flash
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore

应用识别会话但抛出 CookieOverflow 错误。

您需要在 application.rb 文件中设置 config.api_only=false。会话存储的中间件仅在设置为 false 时添加。

手动添加中间件不起作用,因为在这种情况下中间件未正确实例化。

您可以在此处查看 Rails 中的代码:https://github.com/rails/rails/blob/92703a9ea5d8b96f30e0b706b801c9185ef14f0e/railties/lib/rails/application/default_middleware_stack.rb#L58