Rails API + engine + omniauth + session/flash

问题描述 投票:0回答:0

我这里有一个棘手的场景,我自己还找不到解决方案。

这是设置。

  • Rails API (6.1.6)
  • 2 个引擎通过子域安装
    1. 主要 API -
      MainAPI
      -> api.lvh.me:3003
    2. 用户临时前台
      TempFront
      (将在几个月内删除)。 -> temp.lvh.me:3003

TempFront
上,我已经设置了 Rails API 上缺少的内容,以便能够提供前端。除 omniauth 重定向外,一切正常。我一直在追踪错误,直到WardenManager#call

重定向后,会话不存储。我显然已经跳过了

protect_from_forgery
基于FAQ的回调方法,但它仍然无法正常工作。

Flash 也不共享。我认为它可能与同一问题有关。我很确定它来自某个地方的自定义配置,但我找不到确切的位置。

本地我正在使用 ngrok 进行回调。网址是

api.ngrok.my-domain.com
(与
*.lvh.me
不匹配但直接指向正确的引擎
MainAPI
)。

手动

sign_in(@user, event: :authentication)
后,有一个正确的会话密钥
warden.user.v1_user.key
,值为[user_id]。这是正确的行为。这个相同的键在重定向后消失了。

这是我在

temp_front/lib/temp_front/engine.rb

上设置的初始化器
require 'webpacker'

module TempFront
  ##
  # Engine initializers
  class Engine < ::Rails::Engine
    isolate_namespace TempFront

    initializer 'webpacker.proxy' do |app|
      insert_middleware =
          begin
            TempFront.webpacker.config.dev_server.present?
          rescue StandardError
            nil
          end
      next unless insert_middleware

      app.middleware.insert_before(
          0, Rails::VERSION::MAJOR >= 5 ?
                 Webpacker::DevServerProxy : 'Webpacker::DevServerProxy',
          ssl_verify_none: true,
          webpacker: TempFront.webpacker
      )
    end

    initializer 'use action cookies and dispatch flash' do |app|
      app.config.session_store :cookie_store, { key: '_my_app', domain: :all }
      app.config.middleware.insert_before(Warden::Manager, ActionDispatch::Cookies)
      app.config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
                                     opts)
      app.config.middleware.insert_after(ActionDispatch::Session::CookieStore, ActionDispatch::Flash)
      # https://guides.rubyonrails.org/configuring.html#configuring-middleware
      # Rack::MethodOverride allows the method to be overridden
      # if params[:_method] is set.
      # This is the middleware which supports
      # the PATCH, PUT, and DELETE HTTP method types.
      app.config.middleware.use Rack::MethodOverride
    end
  end
end

这是我的回调控制器:

module MainAPI
  class OmniauthCallbacksController < Devise::OmniauthCallbacksController

    before_action :some_callbacks_to_handle_data

    def facebook
      sign_in @user, event: :authentication
      flash[:notice] = 'You have done it!'
      redirect_to mod_temp_front_engine.profile_url(subdomain: 'temp')
    end
  end
end

有人有解决这个问题的其他想法吗?

ruby-on-rails session devise omniauth rails-flash
© www.soinside.com 2019 - 2024. All rights reserved.