アプリケーションのユーザーがログインした後、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_hash
のprocess_omniauth
ブロックで実行すると、この情報はアプリケーションの他の部分へのセッションで利用できますが、user_id
これを行うと忘れられているようです!
何か案は?