0

Rails 2.3で書かれたアプリがあります。このアプリは認証にdeviseを使用しています。Worpdress などの他のプロジェクトで SSO を作成する必要があります。

Devise の新しいバージョンには omniauth サポートが含まれているため、認証エンドポイントとして中間アプリを作成する必要があります。このツールは、ユーザーを検証し、ユーザーがログに記録された状態で 2.3 アプリにリダイレクトするだけです。

フローは次のとおりです。

2.3 アプリへのユーザー ログ => 3.2 アプリへのリクエスト => 外部システムでの OAuth => 2.3 アプリへのログイン

必要なすべての構成を行いました。基本的に、同じキーとシークレットを共有して、アプリがセッションを共有できるようにします。問題は、ログインが成功した後、2.3 アプリで次のエラーが発生することです。

Status: 500 Internal Server Error
Session contains objects whose class definition isn\'t available.
Remember to require the classes for all objects kept in the session.
(Original exception: #{const_error.message} [#{const_error.class}])

このエラーは、セッションに 2.3 アプリがインスタンス化する方法がわからないクラスが含まれていることを意味していると思います。どのクラスがどのクラスであるかを見つける方法がわかりません。

4

1 に答える 1

1

解決しました。問題は、3.2Railsアプリに追加されたFlashメッセージでした。このメッセージのクラスはActionDispatch::Flash :: FlashHashであり、2.3アプリのクラスはActionController :: Flash::FlashHashです。

私の場合の解決策は、set_flash_messageの呼び出しを削除することでした。3.2 => 2.3を解いたので、3.2アプリに戻る必要があるかもしれません。2.3アプリは「間違った」クラスのFlashメッセージを追加するため、3.2アプリにこの新しいクラスの定義を追加する必要があります。

# config/initializers/session_store.rb
module ActionController
  module Flash
    class FlashHash < Hash
      def method_missing(m, *a, &;b)
      end
    end
  end
end

参照:

Rails 3.2=>2.3。この郵便受け

Rails 2.3=>3.2この投稿

于 2013-02-21T20:15:50.460 に答える