设计+ omniauth facebook:current_user nil在sign_in之后

时间:2012-10-16 16:13:41

标签: ruby-on-rails heroku devise omniauth

我们通过facebook使用rails,devise和omniauth进行注册和登录。我们在Heroku上托管了两个网络dynos。

有时使用facebook登录失败。我们的应用程序和Facebook之间的实际握手很好。实际上,在下面的代码中@user是一个实际的User模型实例,omniauth数据Hash包含来自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。如果登录过程重复几次,最终会有效。

我们正在

  • Rails 3.2
  • Devise 2.1.2
  • Omniauth-facebook 1.4.0
  • Ruby 1.9.3 p194

1 个答案:

答案 0 :(得分:-2)

我不知道这是否真的是你所描述的解决方案,但我不知道是否:

  

@user = User.find_for_facebook(env [&#34; omniauth.auth&#34;]。extra.raw_info,current_user)

应该读作这个?

  

@user = User.find_for_facebook(request.env [&#34; omniauth.auth&#34;] .extra.raw_info,current_user)

无论如何,我的方式如何。确实无法解释为什么你的应用程序随意让用户登录。