我们使用rails、devise和omniauth通过facebook注册和登录。我们托管在 Heroku 上,运行两个网络 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