2011-10-03 7 views
18

Estoy creando una aplicación de iOS y necesito poder realizar solicitudes autenticadas a una aplicación de Rails 3 para varios bits de datos. La aplicación Rails 3 está utilizando omniauth y URL como https://myapp.com/auth/facebook para, por ejemplo, autenticar usuarios a través de Facebook ... y una vez autenticada, almacena la autenticación en una cookie segura llamada "auth". "¿Cómo autenticar a los usuarios de iOS/iPhone con una aplicación web remota y reutilizar el ticket de autenticación en futuras solicitudes a la misma aplicación web?

Lo que quiero saber es cómo autenticar a mis usuarios de la aplicación iOS/iPhone, persistirá el token de autenticación y enviarla junto con las futuras peticiones a la aplicación Rails


Usando ASIHTTPRequest estoy pensando en hacer algo como esto:?

  1. Abra una UIWebview, cargando con una URL desde my aplicación web específica para el proveedor con el que desea autenticarse (p. myapp.com/auth/facebook para facebook o myapp.com/auth/yahoo para yahoo, etc ...).

  2. En caso de éxito, de alguna manera analizar y almacenar la cookie de autenticación en la aplicación de iOS sin mostrar la gente suele ver página web al realizar la autenticación a través de la página web ... y en lugar de cerrar la UIWebView y navegar de nuevo a otro en el UIVewController aplicación de iOS.

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

  4. También quiero permitir a los usuarios permitir 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 apropiado este enfoque? ¿Hay una mejor manera? Y, por supuesto, ¿cómo implementar realmente lo anterior?

Gracias - WG

+0

¿Se devuelve el token de autenticación en la aplicación web? Si no, ¿puedes devolver el token de autenticación en la aplicación web a través de http? Porque entonces podría tener una solución para usted porque estoy haciendo algo similar con la autenticación en el momento – Armand

+0

No devuelvo el token de autenticación en este momento ... pero controlo la aplicación web así que sí, puedo si es necesario. Pero, 1) ¿Crearía un posible problema de seguridad devolviéndolo? y 2) Si guardo el ticket de autenticación como una cookie, ¿por qué no puedo (o no debería) guardarlo y enviarlo junto con cada solicitud? De todos modos, esperando su respuesta. Gracias – wgpubs

+0

Este es exactamente mi problema; realmente interesado en saber si encontraste una buena solución! – cmaughan

Respuesta

0

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 usando SQLite o Core Data, I 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, y siempre que realizo una API utilizo el nombre de usuario almacenado y contraseña para la autenticación en el lado del servidor que usa get, pero creo que es un ahorro de correo, siempre y cuando 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, autenticaría al usuario en el primer lanzamiento y le permitiría al usuario 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 el archivo db y luego, cada vez que necesito autenticarme con el servicio web, le envío el token de autenticación con una solicitud posterior al servidor. ¿Esto tiene sentido?

+1

Creo que sigo, pero ¿cómo se implementa esto realmente? Idealmente, quiero usar UIWebView en la aplicación de iOS y presentar las mismas pantallas HTML que las personas ven al iniciar sesión a través de la aplicación web (funciona de la misma manera que cuando inicias sesión en stackoverflow usando tu cuenta de yahoo, por ejemplo). PERO para la aplicación de iOS, después de la autenticación ... Quiero saber cómo obtener y almacenar correctamente ese token o ticket de autenticación (cookie) para enviar en futuras solicitudes y redirigir al usuario a otro UIViewController una vez que se hayan autenticado con éxito. – wgpubs

+0

http://www.iphonedevsdk.com/forum/iphone-sdk-development/5608-uiwebview-how-get-content-shown.html eche un vistazo a este enlace, creo que debería llevarlo a la solución que está Buscando – Armand

1

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

Mi aplicación está utilizando idear con omniauth para las cosas de usuario y de inicio de sesión. Diseñar solo puede generar un token único, con el indicador 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.

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

+0

Sí, creo que entiendo su flujo de trabajo. 1) Use el iOS SDK de Facebook para autenticarse con FB, 2) Pase el token que obtiene de la aplicación Rails para autenticarse, ¿verdad? Supongo que lo que espero es un método que me permita simplemente usar UIWebView para que la gente pueda autenticarse de la misma manera que lo hacen con el sitio web, y luego tomar el token y hacer básicamente lo que ha delineado. La razón principal de esto es que la aplicación permite aproximadamente 5 formas de autenticación (FB, Twitter, Yahoo, Google, etc.) y no quiero tener que usar SDK iOS personalizado para cada una. Ideas? – wgpubs

+1

Sugiero que use una página de devolución de llamada personalizada para UIWebview, que contiene auth_token. Al final, esa es la única información que necesitará. – rnaud

2

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

No sé si esto sirve para que ...

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

+0

Me interesa lo que dijo en el último párrafo ... ¿podría proporcionarnos más detalles? – wgpubs

+0

Entonces, ¿su aplicación iOS abre un UIWebView? ¿Cómo se ve la "URL especial"? ¿Cómo abre la aplicación la "URL especial", ya que parece que la aplicación ya está abierta para comenzar? – wgpubs

+0

Sí, abro UIWebView para autenticación. Y la url de retorno tiene el siguiente formato: miapplication: // oauth (paso esta url al parámetro oauth_callback). Registré la aplicación de protocolo en la extensión de la aplicación en Tipos de URL/Esquemas de URL, por lo que cuando el navegador recibe este tipo de URL abre la aplicación – yoprogramo

2
  1. Una vez que el UIWebview ha autenticado con dicho servicio, conseguir que se cargue otra URL (por ejemplo: a través de un javascript en la página que dicho servicio vuelve a después de la autenticación).

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

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
    
  3. Desde aquí se tiene el objeto NSURLRequest. Puede extraer las cabeceras de la petición a NSDictionary que contendrá los detalles cookie de autenticación, ficha, etc., utilizando el siguiente método de NSURLRequest

    - (NSDictionary *)allHTTPHeaderFields 
    
Cuestiones relacionadas