5

Rails、devise、および omniauth を使用して、facebook 経由で登録およびログインしています。私たちは Heroku でホストされ、2 つの Web dyno を実行しています。

facebook でのログインに失敗することがあります。アプリと Facebook の間の実際のハンドシェイクは問題ありません。実際、以下のコードでは、@user は実際の User モデル インスタンスであり、omniauth データ ハッシュには FB からのすべてのデータが含まれており、sign_in は成功したように見え、さらに current_user が設定されています。

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.find_for_facebook(env["omniauth.auth"].extra.raw_info, current_user)

    logger.info ">>>>>> OMNIAUTH FB BEGIN >>>>>>"
    logger.info env["omniauth.auth"].inspect
    logger.info "User is: #{@user.inspect}"

    session["devise.facebook_data"] = request.env["omniauth.auth"].except("extra")

    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
    res = sign_in(:user, @user)

    logger.info "Sign In Result: #{res.inspect}"
    logger.info "CURRENT_USER: #{current_user.inspect}"
    logger.info "<<<<<< OMNIAUTH FB END <<<<<<"

    respond_to do |format|
      format.json
    end
  end
end

クライアント側は、ログインに成功すると、サイトの別の URL にリダイレクト (ログイン コンテキストに基づくさまざまなアクション) を実行します。その URL で、current_user をチェックしますが、current_user は nil を返します。ログインプロセスを数回繰り返すと、最終的には機能します。

私たちはオンです

  • レール3.2
  • 考案 2.1.2
  • Omniauth-facebook 1.4.0
  • ルビー 1.9.3 p194
4

1 に答える 1

-2

これが本当にあなたが説明したことに対する解決策であるかどうかはわかりませんが、次のことかどうか疑問に思います:

@user = User.find_for_facebook(env["omniauth.auth"].extra.raw_info, current_user)

このように読むべきですか?

@user = User.find_for_facebook(request.env["omniauth.auth"].extra.raw_info, current_user)

私のはとにかくそうです。ただし、アプリがユーザーのサインインを恣意的に許可している理由を説明できるかどうかはよくわかりません。

于 2014-04-15T21:52:39.750 に答える