Предоставя ли 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 ок http отговора и не съм достатъчно умен, за да пренапиша кода на bnerd, за да се приспособя към това.. ще се опитам да използвам FbGraph Gem и ако имам повече късмет от вас, ще публикувам актуализация - person Richard Jordan; 25.10.2010
comment
Получавам неинициализирана постоянна грешка за User::FBGraph - опитвам се да извикам FBGraph от функцията за създаване на потребителски модел, която имам... Добавих fb_graph към моя gemsfile - не знам какво друго мога да направя, за да се уверя, че работи. .. някакви мисли? - 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
съобщението за грешка е: 'uninitialized constant User::FBGraph' ...то се извиква като грешка на следния ред във файла User.rb: user = FBGraph::User.fetch(fbuid, :access_token =› token ) ...където fbuid е вече създадена локална променлива с fbuid на потребителя в нея и токенът е токенът за достъп ...по-ясно? - person Richard Jordan; 26.10.2010
comment
User.rb ред 20: потребител = FBGraph::User.fetch(fbuid, :access_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

След това добавете колона „token“ към таблицата „authentications“ и всички поддържащи методи за извличане на токени. Когато приложението трябва да взаимодейства с 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

Сигурен съм, че някой по-опитен от мен би могъл да подобри това - бях около 10 седмици в изучаването на Ruby (и първото ми програмиране след Fortran и Pascal в университета в началото на 90-те!).

person Richard Jordan    schedule 26.10.2010
comment
Това беше отговорът, който работи за мен и реши проблема ми. Оттук и отметката. Други отговори може да решат проблема за други хора. - person Richard Jordan; 31.07.2012

Също така имах проблеми с работата на решението devise+Omniauth. Имах проблеми:

  1. Сесийната бисквитка не съхрани маркера за удостоверяване на facebook, който е необходим за инициализиране на fb_graph и koala.
  2. Не можах да инициализирам fb_graph, след като поставих маркера за удостоверяване на facebook (но накарах Koala да работи след известна работа).

Реших #1, като вмъкнах 'session[:omniauth] = omniauth' в метода за създаване на authentications_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