passcode game forgot iphone objective-c ios ruby-on-rails-3 authentication

game - ¿Cómo autenticar a los usuarios de iOS/iPhone con la aplicación web remota y reutilizar el ticket de autenticación en solicitudes futuras a la misma aplicación web?



game center login (4)

Estoy creando una aplicación para iOS y necesito poder hacer solicitudes autenticadas a una aplicación de Rails 3 para varios bits de datos. La aplicación Rails 3 usa omniauth y URL como https://myapp.com/auth/facebook para, por ejemplo, autenticar usuarios a través de Facebook ... y una vez autenticado, almacena la autenticación en una cookie segura llamada "auth".

Lo que quiero saber es cómo autenticar a mis usuarios desde la aplicación iOS / iPhone, conservar el token de autenticación y enviarlo junto con futuras solicitudes a la aplicación Rails.

Usando ASIHTTPRequest estoy pensando en hacer algo como esto:

  1. Abra un UIWebview, cargando con una URL de mi aplicación web específica para el proveedor con el que se quiere autenticar (por ejemplo, myapp.com/auth/facebook para Facebook o myapp.com/auth/yahoo para yahoo, etc.).

  2. En caso de éxito, de alguna manera analice y almacene la cookie de autenticación en la aplicación iOS sin mostrar la página web que la gente suele ver cuando se autentica a través del sitio web ... y en su lugar, cierra UIWebView y navega hacia otro UIVewController en la aplicación iOS.

  3. De alguna manera, incluya el token de autenticación persistente con futuras solicitudes web a la aplicación Rails.

  4. También quiero permitir que los usuarios permitan que la aplicación iOS almacene esta información localmente para que no tengan que volver a iniciar sesión en la aplicación remota si así lo desean.

¿Es este enfoque apropiado? ¿Hay alguna manera mejor? Y por supuesto, ¿cómo implementar realmente lo anterior?

Gracias wg


  1. Una vez que UIWebview haya autenticado con dicho servicio, haga que cargue otra URL (por ejemplo: a través de un javascript en la página a la que dicho servicio regresa después de la autenticación).

  2. Capture esta solicitud utilizando un objeto UIWebViewDelegate que implementa el siguiente método de protocolo:

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

  3. Desde aquí tienes el objeto NSURLRequest . Puede extraer los encabezados de la solicitud a NSDictionary que contendrán los detalles de la cookie de autenticación, el token, etc. utilizando el siguiente método de NSURLRequest

    - (NSDictionary *)allHTTPHeaderFields


Ok, aquí vamos, no sé la configuración exacta de su servicio web y todo eso, pero lo que puede hacer es almacenar el token de autenticación en el dispositivo utilizando SQLite o Core Data, actualmente estoy trabajando en una aplicación que requiere autenticación, y lo que hago es almacenar el nombre de usuario y la contraseña localmente en el dispositivo en la base de datos SQLite usando Core Data para interactuar con la base de datos, luego, cada vez que realizo una llamada a la API, utilizo el nombre de usuario y la contraseña almacenados para la autenticación en el lado del servidor usando gets, pero creo que es un ahorro usando la publicación, siempre que el servidor web tenga una gran seguridad, no creo que exista ningún riesgo de seguridad. En lo que entiendo sobre lo que está construyendo, autentificaría lo que el usuario dice en el primer inicio y permitirle cambiar las credenciales de inicio de sesión en una etapa posterior, pero después de la autenticación enviaría un token de autenticación al dispositivo y lo almacenaría. en la base de datos y luego, cada vez que necesite autenticarme con el servicio web, enviaría el token de autenticación con una solicitud de publicación al servidor. ¿Esto tiene sentido?


Para mi aplicación esto es lo que estoy haciendo.

Mi aplicación utiliza dispositivos con omniauth para inicio de sesión y cosas de usuario. La creación por sí misma puede generar un token único, con la marca token_authenticatable. Entonces, en mi solicitud de inicio de sesión, si el inicio de sesión es exitoso, respondo con una representación JSON de mi usuario y mi token de usuario. Guardo todo eso en la memoria del teléfono.

Luego, en cada solicitud, agrego el param auth_token = MY_USER_TOKEN.

Y eso es todo.

Solo tuve un problema con la autenticación de Facebook, porque estoy usando el SDK de Facebook de iOS, así que reenvío el token de FB a mi aplicación, lo verifico y luego devuelvo el mismo dispositivo auth_token para todas las siguientes solicitudes.


Usar OAuth es bastante fácil (bueno, fácil no es la palabra ...), pero hice una aplicación iOS y un servidor java que usa OAUth como esquema de identidad y, luego del ciclo completo, finalmente adquirí un token que identifica a este usuario y (ya que solo se puede acceder utilizando solicitudes firmadas) se puede almacenar de forma segura en el teléfono (solo uso el estándarUsuarioDefaults para almacenarlo). Solo su aplicación (usando el secreto) puede firmar las solicitudes.

No sé si esto te sirve ...

Ah! Después de la identificación vía web, el navegador redirecciona una URL especial (registrada para mi aplicación) y la url abre mi aplicación, incluido el token en sus parámetros, para que sea fácil recuperar el token después de la fase de identificación en handleOpenURL.