7

我正在努力将 Omniauth 与我的新 Facebook 应用程序集成,并且我正在查看相当稀疏的文档以了解它是否提供了访问图形 API 的简单方法......我正在从非常简单的考拉搬家。

有没有人为此使用过Omniauth?我想从用户的相册中获取照片,并对他们进行排序并获取唯一的 URL。

4

6 回答 6

14

我终于发现:

1)包括这个宝石

2)使用宝石:

user = FbGraph::User.new('me', :access_token => session[:omniauth]["credentials"]["token"])

user.fetch

3) 检索您的信息 user.name

记住你可以从这里得到任何东西 ttp://developers.facebook.com/docs/reference/api/user

于 2010-10-25T17:09:23.180 回答
4

另一个不错的选择是考拉:https ://github.com/arsduo/koala

如果您只是使用 Facebook,考拉有自己的 OAuth 支持。它也适用于 OmniAuth。要将它们一起使用,请按照此 Railscast 设置 OmniAuth: http ://railscasts.com/episodes/235-omniauth-part-1

然后在 'authentications' 表中添加一个 'token' 列,以及用于检索令牌的任何支持方法。当应用程序需要与 Facebook 交互时,让考拉抓住令牌并做它的事情。在控制器中:

if @token = current_user.facebook_token
  @graph = Koala::Facebook::GraphAPI.new(@token)
  @friends = @graph.get_connections("me", "friends")
end
于 2010-11-22T20:39:26.237 回答
3

首先,我会选择 fb_graph,比较一下:

考拉

graph = Koala::Facebook::GraphAPI.new OAUTH_ACCESS_TOKEN
friends = graph.get_connections("me", "friends")
graph.put_object("me", "feed", :message => "I am writing on my wall!")

使用fb_graph

me = FbGraph::User.me OAUTH_ACCESS_TOKEN
my_friends = me.friends
me.feed! :message => "I am writing on my wall!"

使用omniauth时,每个用户都有许多授权(facebook、twitter、...)

对于每个用户授权,您应该将返回的 oauth令牌存储在您的 oauth 回调哈希中。

auth = Authorization.create!(:user => user,
                             :uid =>      hash['uid'],
                             :provider => hash['provider'],
                             :token =>    hash['credentials']['token'])

然后,无论您想访问相册和照片,请执行以下操作:

class User
  ...
  has_many :authorizations
  ...
  def grap_facebook_albums
    facebook = authorizations.where(:provider => :facebook).first
    fb_user = ::FbGraph::User.fetch facebook.uid, :access_token => facebook.token
    fb_albums = fb_user.albums
  end
  ...
end
于 2011-03-02T13:12:22.773 回答
2

所以我无法让 fb_graph 正常工作——我仍然是一个菜鸟,作为 Ruby On Rails 开发人员总共大约 8 到 10 周,因此对于必须要解决的明显问题没有直觉其他人。

然而,我发现了这篇很棒的小博客文章,它概述了一个简单的 facebook 客户端,并清楚地展示了它是如何连接在一起的。我发现它在获取 me/picture 对象时存在问题,因为 Facebook 返回的是 http302 而不是 http200,但这在作者的帮助下很容易解决。看看: http ://bnerd.de/misc/ruby-write-basic-client-for-facebook-graph-api/

我现在使用 Omniauth 来简化基于此演练的登录/注册交互:blog.railsrumble.com/blog/2010/10/08/intridea-omniauth 并使用我从中获得的令牌,我正在使用这个简单的FBClient 从上面的 bnerd 参考中访问 Graph API。希望我的发现对其他人有所帮助。

...这是我的 bnerd 代码版本,它对我有用:

    class FBClient

      def initialize(app, access_token = nil)
        @app = app
        @access_token = access_token
      end

      # request permission(s) from user
      def request(perms)
        #create a random verifier to identify user on fb callback
        verifier = (0...10).map{65.+(rand(25)).chr}.join
        uri = "https://graph.facebook.com/oauth/authorize?client_id=#{@app.app_id}&redirect_uri=#{@app.connect_url}?verifier=#{verifier}&scope=#{perms}"

        request = { :verifier => verifier, :uri => uri }
        return request

      end

      def connect(code, verifier)

        uri = URI.parse("https://graph.facebook.com/oauth/access_token?client_id=#{@app.app_id}&redirect_uri=#{@app.connect_url}?verifier=#{verifier}&client_secret=#{@app.secret}&code=#{CGI::escape(code)}")
        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = true

        request = Net::HTTP::Get.new(uri.path + "?" + uri.query)
        response = http.request(request)     
        data = response.body

        return data.split("=")[1]
      end

      # get, post
      def get(path, params = nil)
        uri = URI.parse("https://graph.facebook.com/" + path)
        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = true

        if params.nil?
          params = Hash.new
        end

        if params["access_token"].nil? 
          params["access_token"] = @access_token unless @access_token.nil?
        end

        request = Net::HTTP::Get.new(uri.path) 
        request.set_form_data( params )
        request = Net::HTTP::Get.new(uri.path + "?" + request.body)

        return response = http.request(request)
      end

      def post(path, params = nil)
        uri = URI.parse("https://graph.facebook.com/" + path)
        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = true        

        if params.nil?
          params = Hash.new
        end

        if params[:access_token].nil?
          params[:access_token] = @access_token unless @access_token.nil?
        end

        request = Net::HTTP::Post.new(uri.path) 
        request.set_form_data( params )
        request = Net::HTTP::Post.new(uri.path + "?" + request.body)

        response = http.request(request)
        response.code == "200" ? feed = JSON.parse(response.body) : raise("Sorry, an error occured. #{response.body}")
        return feed
      end
    end

我确信有比我更有经验的人可以改进这一点——我学习 Ruby 大约有 10 周的时间(这是我自 90 年代初在大学学习 Fortran 和 Pascal 以来的第一次编程!)。

于 2010-10-26T01:58:06.397 回答
0

我在让设计+Omniauth 解决方案正常工作时也遇到了问题。我不得不遇到问题:

  1. 会话 cookie 未存储初始化 fb_graph 和 koala 所需的 facebook 身份验证令牌。
  2. 在获得 facebook 身份验证令牌后,我无法初始化 fb_graph(但让考拉在工作后开始工作)。

我通过在 authentications_controller.rb 的创建方法中插入 'session[:omniauth] = omniauth' 解决了 #1。

我通过使用考拉解决了#2。似乎 fb_graph 需要 oauth2,并且设计 omniauth 集成使用 oauth。Koala 与 session[:omniauth]["credentials"]["token"] 存储的 facebook 身份验证令牌完美配合。

你像这样初始化考拉:
- @fbprofile = Koala::Facebook::GraphAPI.new( session[:omniauth]["credentials"]["token"] )

于 2011-04-23T15:31:20.550 回答
0

我确保卸载了 oauth 和 oauth2,然后安装了 oauth2。似乎现在omniauth 和fb_graph 正在工作......但可能需要更多地测试它。

于 2011-07-26T18:11:55.060 回答