最近、アプリを Rails 4 にアップグレードしました。omniauth を介したカスタム openid ポートのみを使用してユーザーを認証しています。
コントローラー (Omniauth コールバック)
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def openid
@user = User.where(provider: auth_hash["provider"], uid: auth_hash["uid"]).first_or_initialize
@user.name = auth_hash["information"]["name"]
@user.email = auth_hash["information"]["email"]
@user.save!
sign_in_and_redirect @user, :event => :authentication
end
protected
def auth_hash
request.env['omniauth.auth']
end
end
ルート
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
devise_scope :user do
get 'sign_in', :to => 'devise/sessions#new', :as => :new_user_session
get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
end
root :to => "users#front"
[...]
問題
extern サービスで正しくログインした後、ユーザーは にリダイレクトされOmniauthCallback#openid
ます。ユーザーは問題なく正しく作成されています。その後、ユーザーは問題なく root にリダイレクトされます。しかし、その時点で彼はまだログインしていません!
私のセッションもデータベースに正しく保存されています。エラーは発生しません。単に正常に動作しませんsign_in_and_redirect @user, :event => :authentication
。セッションをユーザーに適切にバインドするにはどうすればよいですか?
アップデート
データベースの代わりに Cookie を使用してセッションを保存しても解決しません。
ページを使用sign_in @user
してリロードしても解決しません。代わりに
使用しても解決しません。@user.save
@user.save!
どんなアイデアにも感謝します。