2010-10-24 26 views
7

Estoy trabajando en la integración de Omniauth con mi nueva aplicación de Facebook, y estoy buscando a través de la documentación más bien escasa para entender si proporciona formas simples de acceder al API de gráficos ... Me estoy moviendo desde Koala, que era bastante simple.¿OmniAuth proporciona ganchos simples a la API Graph de Facebook?

¿Alguien ha usado Omniauth para esto todavía? Quiero obtener fotos de los álbumes de los usuarios y ordenarlas y obtener las URL exclusivas para ellas.

Respuesta

2

Así que no fue capaz de conseguir fb_graph funcione correctamente - Todavía estoy teniendo un novato sido un desarrollador de Ruby On Rails por un total de aproximadamente 8-10 semanas, y por lo tanto no tengo un instinto para lo que deben ser problemas obvios para otras personas.

Sin embargo, encontré esta gran pequeña publicación de blog que describe un simple cliente de Facebook y muestra claramente cómo se conecta todo. Encontré un problema al seleccionar el objeto me/picture, ya que Facebook devuelve un http302 no http200, pero eso se solucionó fácilmente con la ayuda del autor. Échale un vistazo: http://bnerd.de/misc/ruby-write-basic-client-for-facebook-graph-api/

Ahora estoy usando Omniauth por la simplicidad de la interacción de inicio de sesión/suscripción basada en este tutorial aquí: blog.railsrumble.com/blog/2010/10/08/intridea-omniauth y con el token Obtuve que estoy usando este simple FBClient de la referencia bnerd anterior para acceder a Graph API. Espero que lo que encontré ayude a otros.

... aquí está mi versión de código de bnerd y funcionó para mí:

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 

Estoy seguro de que alguien con más experiencia que yo podría mejorar esto - yo estaba alrededor de 10 semanas en el aprendizaje de Ruby (y mi primera programación desde Fortran y Pascal en la universidad a principios de los 90!).

+0

Esta fue la respuesta que funcionó para mí y resolvió mi problema De ahí la marca de verificación. Otras respuestas pueden resolver el problema para otras personas. –

14

finalmente descubrí:

1) incluyen this gem

2) utilizar la gema:

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

user.fetch

3) recuperar la información de user.name

Recuerde que puede obtener cualquier cosa de aquí ttp: //developers.facebook.com/docs/reference/api/user

+0

gracias - voy a probar esto ... he estado tratando de trabajar con el código aquí: http://bnerd.de/misc/ruby-write-basic-client-for-facebook-graph-api/que ciertamente me enseñó mucho sobre los conceptos básicos –

+0

el problema que recibo al usar el código bnerd.de es que las llamadas API de gráficos de Facebook parecen estar devolviendo 302 direcciones no 200 respuestas http ok y no soy lo suficientemente inteligente como para reescribir el código de bnerd para acomodar esto ... intentaré usar la Gema FbGraph y si tengo más suerte que usted, publicaré una actualización –

+0

Me estoy obteniendo un error constante no inicializado para Usuario :: FBGraph - Estoy tratando de llamar a FBGraph desde la función de creación del modelo de Usuario que tengo ... Agregué fb_graph a mi gemsfile, no estoy seguro de qué más podría hacer para asegurarme de que funciona ... ¿algún pensamiento? –

4

Otra buena opción es koala: https://github.com/arsduo/koala

Si sólo está usando Facebook, koala tiene su propio apoyo OAuth. También funciona bien con OmniAuth. Para usarlos juntos, configure OmniAuth por este Railscast: http://railscasts.com/episodes/235-omniauth-part-1

Luego agregue una columna 'token' a la tabla 'autenticaciones', y cualquier método de apoyo para recuperar los tokens. Cuando la aplicación necesite interactuar con Facebook, deje que Koala tome el token y haga lo suyo.En un controlador:

if @token = current_user.facebook_token 
    @graph = Koala::Facebook::GraphAPI.new(@token) 
    @friends = @graph.get_connections("me", "friends") 
end 
+0

me gusta la idea de combinarlos así - mi primera joya en este viaje fue Koala hasta que descubrí omniauth ... si puedo combinar los dos definitivamente vale la pena mirar ... gracias por el consejo :-) –

3

En primer lugar, me gustaría ir a fb_graph, compara:

con koala:

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!") 

con fb_graph:

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

Cuando se usa OmniAuth, cada usuario tiene muchas autorizaciones (Facebook, Twitter, ...)

Para cada autorización de usuarios, debe almacenar el token de OAuth que se devuelve en su hash de oauth de devolución de llamada.

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

Entonces dondequiera que desee acceder a álbumes y fotos, hacer algo como esto:

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 
0

También tuve problemas para conseguir el legado + solución OmniAuth a trabajar. Tenía problemas:

  1. La cookie de sesión no almacenaba el token de autenticación de Facebook que es necesario para inicializar fb_graph y koala.
  2. No pude inicializar fb_graph después de obtener el token de autenticación de Facebook en su lugar (pero logré que Koala funcione después de un trabajo).

He resuelto # 1 insertando 'session [: omniauth] = omniauth' en el método create del authentications_controller.rb.

Resolví el n. ° 2 usando Koala. Parece que fb_graph requiere oauth2, y la integración de omniauth del diseño usa oauth. Koala funciona perfectamente con el token de autenticación de Facebook almacenado por la sesión [: omniauth] ["credentials"] ["token"].

inicializar koala como esto:
- @fbprofile = koala :: Facebook :: GraphAPI.new ( sesión [: OmniAuth] [ "credenciales"] [ "token"] )

0

I se aseguró de que se desinstalaron oauth y oauth2, y luego instalé oauth2. Parece que ahora omniauth y fb_graph están funcionando ... pero probablemente necesiten probarlo más.

Cuestiones relacionadas