10

Estoy tratando de hacer que Koala trabaje con Omniauth. Un modelo de usuario inicia sesión con Facebook usando Omniauth y quiero usar Koala como cliente para obtener la lista de amigos de un usuario que está usando la aplicación. No parece ser el ahorro de las fichas correctamente:¿Cómo hacer que Koala juegue bien con Omniauth?

controlador

@friends = Array.new 
if current_user.token 
    graph = Koala::Facebook::GraphAPI.new(current_user.token) 
    @profile_image = graph.get_picture("me") 
    @fbprofile = graph.get_object("me") 
    @friends = graph.get_connections("me", "friends") 
end 

DB esquema

create_table "users", :force => true do |t| 
    t.string "provider" 
    t.string "uid" 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "token" 
end 

modelo de usuario tiene

def self.create_with_omniauth(auth) 
    create! do |user| 
    user.provider = auth["provider"] 
    user.uid = auth["uid"] 
    user.name = auth["user_info"]["name"] 
    end 
end 

Koala.rb inicializador tiene:

module Facebook 
    CONFIG = YAML.load_file(Rails.root.join("config/facebook.yml"))[Rails.env] 
    APP_ID = CONFIG['app_id'] 
    SECRET = CONFIG['secret_key'] 
end 

Koala::Facebook::OAuth.class_eval do 
    def initialize_with_default_settings(*args) 
    case args.size 
     when 0, 1 
     raise "application id and/or secret are not specified in the config" unless Facebook::APP_ID && Facebook::SECRET 
     initialize_without_default_settings(Facebook::APP_ID.to_s, Facebook::SECRET.to_s, args.first) 
     when 2, 3 
     initialize_without_default_settings(*args) 
    end 
    end 

    alias_method_chain :initialize, :default_settings 
end 

controlador de Sesiones tiene:

def create 
    auth = request.env["omniauth.auth"] 
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) 
    session[:user_id] = user.id 

    session['fb_auth'] = request.env['omniauth.auth'] 
    session['fb_access_token'] = omniauth['credentials']['token'] 
    session['fb_error'] = nil 

    redirect_to root_url 
    end 

Respuesta

12

El problema, como ya sabemos es que el fb_access_token solo está disponible en la sesión actual y no está disponible para Koala.

¿Su modelo de usuario tiene una columna para almacenar "token"? De lo contrario, asegúrese de tener esa columna en el modelo de usuario. Cuando tenga esa columna en el modelo de usuario, tendrá que almacenar algo en ella en el momento de crear el usuario (método create_with_omniauth en la clase User). Después de la autorización exitosa de Facebook, debe encontrar que el campo de token está lleno con el token de facebook oauth. Si está poblado, entonces su código Koala debería funcionar. En este caso, no es necesario almacenar las credenciales de Facebook en la sesión.

Sin embargo, si no está accediendo sin conexión desde Facebook (lo que significa que el acceso solo se proporciona por un corto tiempo, entonces tiene sentido almacenar las credenciales de Facebook en la sesión. pero sesión ["fb_auth_token"] en cambio con Koala.

Espero que esto ayude!

Así que si quieres acceso sin conexión (almacenamiento a largo plazo de la autorización facebook), cambiar el código de modelo para almacenar fb_auth_token como a continuación

# User model 
def self.create_with_omniauth(auth) 
    create! do |user| 
    user.provider = auth["provider"] 
    user.uid = auth["uid"] 
    user.name = auth["user_info"]["name"] 
    user.token = auth['credentials']['token'] 
    end 
end 

# SessionsController 
def create 
    auth = request.env["omniauth.auth"] 
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) 
    # Note i've also passed the omniauth object  

    session[:user_id] = user.id 
    session['fb_auth'] = auth 
    session['fb_access_token'] = auth['credentials']['token'] 
    session['fb_error'] = nil 

    redirect_to root_url 
end 

Si usted tiene acceso a corto plazo, a continuación, cambiar su "otro" controlador de usar sesiones

# The other controller 
def whateverthissactionis 
    @friends = Array.new 
    if session["fb_access_token"].present? 
    graph = Koala::Facebook::GraphAPI.new(session["fb_access_token"]) # Note that i'm using session here 
    @profile_image = graph.get_picture("me") 
    @fbprofile = graph.get_object("me") 
    @friends = graph.get_connections("me", "friends") 
    end 
end 
0

evitar escribir cuando se puede probar esto:

https://github.com/holden/devise-omniauth-example/blob/master/config/initializers/devise.rb

he utilizado esa aplicación como base con éxito.

He solucionado algunos problemas pero no me he comprometido en github. Pero esos son muy menores. Creo que la aplicación de ejemplo funciona.

Su problema puede no ser Koala, pero el hecho de que el token no se guardó, por lo que no puede consultar nada o incluso conectarse a Facebook.

0

Su problema parece ser que está pasando algo incorrecto en la koala:

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

pruebe a cambiar a lo siguiente:

@friends = Array.new # I think it returns a straight array, might be wrong. 
if current_user.token 
    graph = Koala::Facebook::GraphAPI.new(current_user.token) 
    @friends = graph.get_connections("me", "friends") 
end 
+0

Es porque no está almacenando el token en el método create_with_omniauth. – Tom

Cuestiones relacionadas