如何防止非第一次会话调用Facebook API ?



我的应用程序通过OmniAuth通过Facebook对用户进行身份验证,它工作得很好,但每次用户必须创建会话并登录时,对Facebook的请求需要长达一分钟,因为它通过API调用了大量信息。我如何重构下面的代码,以便在执行|| User.create_with_omniauth(auth,omniauth)时只调用图形对象(profile, likes, friends) ?

def create  
  auth = request.env["omniauth.auth"]
  omniauth = request.env["omniauth.auth"]
  user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth,omniauth)     
  session[:user_id] = user.id  
  session['fb_auth'] = request.env['omniauth.auth']
  session['fb_access_token'] = omniauth['credentials']['token']
  session['fb_error'] = nil
  @graph = Koala::Facebook::GraphAPI.new(current_user.token)
  current_user.profile = @graph.get_object("me")
  current_user.likes = @graph.get_connections("me", "likes")
  current_user.friends = @graph.get_connections("me", "friends")
  current_user.save
  redirect_to root_url 
end

最简单的方法是将您正在执行的最后一部分提取到异步作业中。在创建用户之前,您似乎没有必要获得所有这些信息,并且应该卸载对外部服务的任何非当前需要的请求。

我正在做同样的事情与Facebook目前,我正在使用Redis/Resque更新用户的详细信息后,他们被创建/认证。

最新更新