3

我正在尝试从 Facebook 获取朋友列表。通过 Facebook 登录不是问题,但问题是获取人的朋友 - 因为access token.

puts request.env["omniauth.auth"].inspect
puts '==='
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
@fb_user = FbGraph::User.fetch(@user.uid).friends
puts @fb_user.inspect

问题出在第 4 行 - 在这种情况下,我遇到了错误

OAuthException :: An access token is required to request this resource.

当我把这样的东西放在那里时:

@fb_user = FbGraph::User.fetch(request.env["omniauth.auth"].credentials.token).friends

我去拿

OAuthException :: (#803) Some of the aliases you requested do not exist: PRINTED OUT TOKEN

获得的正确方法是access token什么?

编辑:当前流量

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
    @fb_user = FbGraph::User.fetch(request.env["omniauth.auth"].credentials.token).friends
    if !@user
      flash[:error] = 'This email address is already used in the system.'
      redirect_to :back
    elsif @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

用户模型中:

  def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
    data = access_token.extra.raw_info
    if user = User.where(:provider => 'facebook', :uid => data.id).first
      user
    elsif user = User.where('email = ? AND provider IS NULL', data.email).first
      return false
    else
      ...saving data...
    end
    return user if user
  end
4

1 回答 1

4

您可以通过Facebook Graph API Explorer获取用于测试目的的访问令牌。确保选择了要访问的正确字段,然后单击“获取访问令牌”。一个更持久的解决方案是在 Facebook 上注册您的应用程序,这样您就可以在令牌不死的情况下不断地发出请求。

您应该查看Facebook OAuth 对话

我假设您正在尝试使用 OAuth2 策略而不是 Javascript SDK。确保您已设置回调 url,如下所示:

client.redirect_uri = "http://your.client.com/facebook/callback"

在处理回调的控制器中,您应该执行以下操作:

client.authorization_code = params[:code] 
access_token = client.access_token! :client_auth_body 
FbGraph::User.me(access_token).fetch

确保你已经让 fb_graph 知道你的应用的 id 和 secret 是什么。您应该查看此 stackoverflow以确保您的应用程序信息安全。

我还要塞考拉宝石

于 2013-08-07T15:48:41.583 回答