Предоставляет ли OmniAuth простые подключения к Facebook Graph API?

Я работаю над интеграцией Omniauth с моим новым приложением Facebook, и я просматриваю довольно скудную документацию, чтобы понять, дает ли она простые способы доступа к графическому API... Я перехожу с Koala, который был довольно простым.

Кто-нибудь уже использовал Omniauth для этого? Я хочу получить фотографии из альбомов пользователей, отсортировать и получить для них уникальные URL-адреса.


person Richard Jordan    schedule 24.10.2010    source источник


Ответы (6)


Я наконец узнал:

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

person apneadiving    schedule 25.10.2010
comment
спасибо - я попробую это... я пытался работать с кодом здесь: bnerd.de/misc/ruby-write-basic-client-for-facebook-graph-api, который, безусловно, многому меня научил. - person Richard Jordan; 25.10.2010
comment
проблема, с которой я сталкиваюсь при использовании кода bnerd.de, заключается в том, что вызовы графического API Facebook, кажется, возвращают 302 перенаправления, а не 200 ответов ok http, и я недостаточно умен, чтобы переписать код bnerd, чтобы приспособиться к этому.. я попытаюсь использовать FbGraph Gem и если мне повезет больше, чем вам, я опубликую обновление - person Richard Jordan; 25.10.2010
comment
Я получаю неинициализированную постоянную ошибку для User::FBGraph. Я пытаюсь вызвать FBGraph из имеющейся у меня функции создания модели пользователя... Я добавил fb_graph в свой файл gems - не уверен, что еще я могу сделать, чтобы убедиться, что он работает. .. Есть предположения? - person Richard Jordan; 26.10.2010
comment
Ну, ничего о вашей собственной модели пользователя. 'FbGraph::User' встроен в гем. - person apneadiving; 26.10.2010
comment
о, я понял... я просто добавлял контекст для проблемы - я вызываю FBGraph из своей пользовательской модели перед сохранением нового пользовательского объекта, я хочу извлечь данные из графика... но по какой-то причине я получаю неинициализированный постоянная ошибка User::FBGraph, когда я это делаю :-( - person Richard Jordan; 26.10.2010
comment
хорошо :) Я не понимаю, почему вы пишете User::FBGraph вместо FbGraph::User ;) - person apneadiving; 26.10.2010
comment
сообщение об ошибке: 'неинициализированная константа User::FBGraph'... она вызывается как ошибка в следующей строке файла User.rb: user = FBGraph::User.fetch(fbuid, :access_token => token ) ... где fbuid — это уже созданная локальная переменная с fbuid пользователя в ней, а токен — это токен доступа ... чище? - person Richard Jordan; 26.10.2010
comment
User.rb строка 20: user = FBGraph::User.fetch(fbuid, :access_token =› token) ## генерирует сообщение об ошибке 'неинициализированная константа User::FBGraph' - person Richard Jordan; 26.10.2010
comment
как я писал выше, я сначала создаю: user = FbGraph::User.new(fbuid, :access_token => token), потом получаю его. Но, возможно, гем предоставляет этот прямой метод. - person apneadiving; 26.10.2010
comment
спасибо - ценю вашу помощь _ Я делаю все это, но по какой-то причине это не сработает... Мех - я нашел другое решение, и я опубликую его ниже - person Richard Jordan; 26.10.2010
comment
хм - не хотел отрицать это ... извините - это не даст мне знать, исправьте это и нажмите "за" :-( - person Richard Jordan; 23.10.2011
comment
@Richard Jordan: я только что отредактировал свой ответ, чтобы вы могли изменить свой голос :) - person apneadiving; 23.10.2011

Еще один хороший вариант — Koala: https://github.com/arsduo/koala.

Если вы просто используете Facebook, у Koala есть собственная поддержка OAuth. Он также отлично работает с OmniAuth. Чтобы использовать их вместе, настройте OmniAuth для этого Railscast: http://railscasts.com/episodes/235-omniauth-part-1

Затем добавьте столбец «токен» в таблицу «аутентификации» и любые вспомогательные методы для получения токенов. Когда приложению необходимо взаимодействовать с Facebook, позвольте Koala взять токен и сделать свое дело. В контроллере:

if @token = current_user.facebook_token
  @graph = Koala::Facebook::GraphAPI.new(@token)
  @friends = @graph.get_connections("me", "friends")
end
person John McGrath    schedule 22.11.2010
comment
мне нравится идея их объединения таким образом - моей первой жемчужиной в этом путешествии была Koala, пока я не открыл omniauth ... если я смогу объединить их, это определенно стоит посмотреть ... спасибо за совет :-) - person Richard Jordan; 10.01.2011

Во-первых, я бы выбрал 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
person David    schedule 02.03.2011

Так что я не смог заставить 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 недель (и мое первое программирование после Fortran и Pascal в университете в начале 90-х!).

person Richard Jordan    schedule 26.10.2010
comment
Это был ответ, который сработал для меня и решил мою проблему. Отсюда и галочка. Другие ответы могут решить проблему для других людей. - person Richard Jordan; 31.07.2012

У меня также были проблемы с запуском решения devise+Omniauth. У меня были проблемы:

  1. Файл cookie сеанса не хранил токен аутентификации facebook, необходимый для инициализации fb_graph и koala.
  2. Мне не удалось инициализировать fb_graph после установки токена аутентификации facebook (но после некоторой работы Koala заработал).

Я решил № 1, вставив «session [: omniauth] = omniauth» в метод создания файла authentication_controller.rb.

Я решил # 2 с помощью Koala. Похоже, что fb_graph требует oauth2, а интеграция omniauth использует oauth. Koala отлично работает с токеном аутентификации facebook, хранящимся в session[:omniauth]["credentials"]["token"].

Вы инициализируете koala следующим образом:
- @fbprofile = Koala::Facebook::GraphAPI.new(session[:omniauth]["credentials"]["token"] )

person Andreas Sæbjørnsen    schedule 23.04.2011

Я убедился, что oauth и oauth2 были удалены, а затем установил oauth2. Похоже, что теперь omniauth и fb_graph работают... но, вероятно, их нужно еще протестировать.

person Phil_Ken_Sebben    schedule 26.07.2011