2

アプリケーションのユーザーがログインした後、OpenID を自分のアカウントに関連付けられるようにする必要があります。

OmniAuth に従う前に最後にアクセスしたコントローラーで、ユーザー ID をセッションに設定しました。関連するコードは次のとおりです。

class UsersController < ApplicationController
  def confirm
    session[:user_id] = @user.id
  end
end

次に、ユーザーは にリンクし/auth/openidます。これは期待どおりに機能します。OmniAuth 初期化子は次のとおりです。

require 'openid/store/filesystem'
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :open_id, :store => OpenID::Store::Filesystem.new('/tmp'), :name => 'openid'
end

ユーザーが OpenID から戻ってきたら、次のようにセッション コントローラーにルーティングします (routes.rb 内):

match 'auth/:provider/callback', to: 'sessions#process_omniauth'

以下は、sessions_controller.rb からの関連コードです。

class SessionsController < ApplicationController
  def process_omniauth
    auth_hash = request.env['omniauth.auth']
    puts "SESSION: #{session}"
    # ...
  end
end

奇妙なことに、session変数は前のコントローラーの user_id で初期化されていないようです。

アプリケーションで別のページに移動すると、user_id は期待どおりにセッション中です。

ただし、OmniAuth ハッシュをセッション変数に割り当てようとすると、以前にあったセッションがすべて消去されます。たとえば、上記session[:omniauth] = auth_hashprocess_omniauthブロックで実行すると、この情報はアプリケーションの他の部分へのセッションで利用できますが、user_idこれを行うと忘れられているようです!

何か案は?

4

1 に答える 1

2

私も同じ問題を抱えていました。見つかったのは、OmniAuth が私に電話をかけ直し、session両方request.env['rack.session']とも空だったrequest.env['action_dispatch.request.unsigned_session_cookie']が、すべてのセッション キーを持っているということでした。

なぜ不一致なのかはわかりませんでした。

最終的に私はここで答えを見つけました:

OmniAuth - 現在のセッションが OpenID コールバックにロードされていません

于 2013-10-10T18:19:29.713 に答える