3

最近、アプリを 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!

どんなアイデアにも感謝します。

4

1 に答える 1

2

私はついに何かを理解しました。「sign_in_and_redirect @user」の前に、oauth コールバック メソッドに次の行を追加しました。

session[:user_id] = @user.id

その後、 current_user が適切に設定されます。これが誰かに役立つことを願っています。

于 2014-12-25T06:25:03.353 に答える