2012-10-10 55 views
5

Nuestra aplicación Rails 3 usa facebook-omniauth, lo que permite a los usuarios autenticarse con Facebook.Authenticate user from iOS Rails 3 server and Omniauth

Sería bueno utilizar la mayor parte del sistema de autenticación basado en la web como sea posible, así que traté de seguir la respuesta (la que no se votó negativamente) a this SO question pero no puedo conseguirlo trabajo.

La esencia de la respuesta es:

OmniAuth-facebook manejará peticiones al punto final de devolución de llamada con un parámetro señal_acceso sin ningún problema. Fácil :)

Así que para probar esto, en mi navegador estoy emitiendo el siguiente solicitud:

/users/auth/facebook_api/callback?access_token=BAAB... 

Pero en mi registro del servidor, veo:

(facebook) Callback phase initiated. 
(facebook) Authentication failure! invalid_credentials: OAuth2::Error, : 
{"error":{"message":"Missing authorization code","type":"OAuthException","code":1}} 

que pueda No entiendo lo que estoy haciendo mal. ¿Es el hecho de que estoy tratando de hacer esto a través del navegador para probar algo malo? ¿Alguna otra idea sobre cómo puedo reutilizar mi lógica de autenticación basada en www para mi aplicación ios?

ACTUALIZACIÓN: No estoy seguro, pero yo estoy siguiendo this guide con el fin de tener múltiples estrategias de facebook OmniAuth, uno para www y otra para el móvil.

+0

¿Encontró una respuesta para esto? Estoy teniendo exactamente el mismo problema! Esta es mi pregunta http://stackoverflow.com/questions/14341867/how-to-authenticate-with-facebook-using-rest-with-devise-omniauth – Andres

+1

Desafortunadamente no lo hice, pero acabo de publicar mi solución como una respuesta oficial. No sé cómo el póster de la pregunta a la que me vinculé consiguió que su solución funcionara, pero no pude. – djibouti33

Respuesta

7

Nunca encontré una solución en línea con lo que estaba pidiendo originalmente, pero así es como lo resolví: tome el token de acceso que obtiene en el iPhone y envíelo a su servidor y realice el inicio de sesión manualmente.

def facebook_login 
    graph = Koala::Facebook::API.new(params[:user][:fb_access_token]) 
    profile = graph.get_object('me') 
    omniauth = build_omniauth_hash(profile) 

    @user = User.find_or_create_for_facebook_oauth(omniauth) 
end 

En www que ya tenían un método llamado find_or_create_for_facebook_oauth, y que tomó el resultado de OmniAuth y, o bien encontrado el usuario o crea una nueva. Para utilizar ese método para dispositivos móviles, tuve que construir una estructura similar a mano para poder pasarla como argumento.

def build_omniauth_hash(profile) 
    struct = OpenStruct.new 
    struct.uid = profile['id'] 
    struct.info = OpenStruct.new 
    struct.info.email = profile['email'] 
    struct.info.image = "http://graph.facebook.com/#{profile['id']}/picture?type=square" 
    struct.info.first_name = profile['first_name'] 
    struct.info.last_name = profile['last_name'] 
    struct.info.bio = profile['bio'] 
    struct.info.hometown = profile['hometown']['name'] if profile['hometown'] 
    struct.info.location = profile['location']['name'] if profile['location'] 
    struct 
end 
+0

gracias, haré esto y si encuentro algo más, ¡lo actualizaré aquí! – Andres

Cuestiones relacionadas