Rails Diseña OmniAuth Facebook Login desde iOS

He estado buscando una solución sólida a este problema, y ​​he encontrado esta pregunta de SO que coincide con mi situación, pero no exactamente.

Actualmente tengo mi aplicación de iPhone autenticándose con mi API de Rails a través de Basic Auth. Es solo tu simple package de authentication de desarrollo. Luego seguí las instrucciones para configurar omniauth-facebook para el dispositivo y lo conseguí trabajando en el lado del browser.

La parte que no puedo entender es cómo enviar el token recibido en el lado del iPhone (a través del Facebook iOS SDK) al server. Quiero que el server verifique la tabla de usuarios para ver si ese usuario de Facebook se ha registrado y crear una count para él si no lo ha hecho. Entonces, estaba pensando que el server generaría una contraseña aleatoria y la enviaría de vuelta al dispositivo del cliente para que pudiera mantener mi misma estrategia de authentication básica. ¿Es esta la manera correcta de implementar un inicio de session único para una aplicación web y una aplicación de iPhone? ¿Cómo se puede modificar los packages del lado del server para admitir la authentication mediante un token enviado desde el teléfono?

Solutions Collecting From Web of "Rails Diseña OmniAuth Facebook Login desde iOS"

Es posible que desee echar un vistazo aquí:

Código abierto: anunciando dispositivo-iOS para authentication simplificada

Parece una forma relativamente indolora de trabajar con Rails / Devise y iOS. Definitivamente planeo usarlo en mi próximo proyecto.

¿Has intentado convertir tu aplicación en un proveedor de Oauth2?

No lo he hecho yo mismo, pero después de un poco de excavación parece que opro y el portero son dos posibles soluciones al problema.

https://github.com/opro/opro https://github.com/doorkeeper-gem/doorkeeper

Parece que opro funciona bastante bien con el layout:

#inside initializers/opro.rb Opro.setup do |config| config.auth_strategy = :devise end 

Definitivamente interesado en ver cómo te resulta esto.

Creo que tienes el plan correcto. Hemos hecho exactamente esto en nuestra aplicación y service web.

Las aplicaciones usan una API REST, authentication básica sobre HTTPS, una contraseña generada por el server, y todo esto se implementa sin Devise. Existe un método en el controller del que henetworkingan todos los controlleres de API, es decir, una before_action para todos los methods de la API, y llama 'authenticate_or_request_with_http_basic'

 class ApiController < ActionController::Base before_action :authenticate_api def authenticate_api authenticate_or_request_with_http_basic do |username, password| # check server-generated password end end end 

Entonces, maneja la mayoría de las requestes.

También tenemos una acción del controller API para registrarse desde el dispositivo una vez para get esa contraseña generada por el server:

 class UsersController < ApiController skip_before_action :authenticate_api, only: [:register_fb] def register_fb graph = Koala::Facebook::API.new(params.require("access_token")) profile = graph.get_object("me?fields=email,first_name,last_name") # then go on to look up user if already exists, or create # ... return server-generated password end end 

La aplicación web, sin embargo, todos los controlleres henetworkingan de WebappController y usan dispositivos.

Por lo tanto, tenemos dos passwords en el object de usuario (una para web, una para mobile) y una ID de Facebook, así como nuestra propia identificación de usuario, que es la que utilizamos para la authentication.