【问题标题】:Rails + OmniAuth Facebook: how to obtain Access Token?Rails + OmniAuth Facebook:如何获取访问令牌?
【发布时间】:2013-08-09 00:38:46
【问题描述】:

我正在尝试从 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

【问题讨论】:

    标签: ruby-on-rails ruby facebook omniauth access-token


    【解决方案1】:

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

    您应该查看Facebook OAuth dialogue

    我假设您尝试使用 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 是什么。您应该查看this stackoverflow 以确保您的应用信息安全。

    我也会插入koala gem

    【讨论】:

    • 谢谢你的回答。我已经在developers.facebook.com 上注册了Facebook 应用程序。我正在使用 fb_graph 宝石。我需要在 Facebook 应用中允许什么自动接收访问令牌?
    • 您应该能够在developers.facebook.com 网站上找到您应用的ID 和密码——我相信这两者都是登录过程所必需的。请务必查看Facebook login flow。要专门解决您的问题,您需要使用应用程序的 id 和密钥以及 Facebook 的回调位置来发送握手的其他部分。查看 fb_graph gem 的 this page
    • akells,我在原始帖子中添加了Facebook身份验证的当前流程。我不明白关于重定向的事情 - 我应该如何重定向用户?当他从 FB 重定向到我的应用程序时,我应该将他重定向回 Facebook?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2013-09-12
    • 2011-07-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多