2011-03-27 13 views
10

Tengo una aplicación que usa el diseño en rieles 3. Me gustaría habilitar la autentificación http para que pueda autenticarse en mi aplicación web desde una aplicación de iPhone. ¿Cómo puedo autenticar desde mi aplicación iPhone para diseñar?autenticación http en idee and rails 3

¿Esto es seguro o debo autenticar de manera diferente?

+0

HI ¿Encontró alguna solución? ¿Cómo resolverlo? Por favor comparta – santosh

Respuesta

6

Desde el punto de vista que tienes 3 opciones de diseño:

1) utilizar la autenticación básica HTTP: su aplicación para iPhone tiene una -que clave secreta se cuece en su código de aplicación para el iPhone - que utiliza para autenticar cada solicitud con la aplicación web. Búsqueda en Google: "Cree autenticación HTTP básica"

2) Puede usar https mediante certificados públicos en su aplicación de iPhone y certificados privados en su aplicación web. Esto es mucho trabajo de configuración, es muy seguro ya que su aplicación de iPhone y el servidor de Rails están intercambiando mensajes a través de un canal encriptado. La seguridad también es transparente para el código de los rieles, ya que la autenticación se realiza en el nivel de transporte.

3) La aplicación iPhone se conecta a la aplicación web usando https, obtiene un token de autenticación que luego usa para realizar llamadas a la aplicación web en http habitual. Más seguro que 1 ya que la clave puede caducar, requiere mucho trabajo y es muy escalable. (http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/)

La mayoría de las aplicaciones utilizan la solución 1.

Esperanza esta ayuda.

EDIT: para implementar la autenticación HTTP (ya sea básica o digerir) sugieren que se mire:

http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html y https://github.com/plataformatec/devise/wiki/How-To:-Use-HTTP-Basic-Authentication

Los pasos precisos depende de su servidor de pila rieles.

EDIT 2: No creo que Devise proporcione una forma de obtener auth_token. Puedo ver que usted puede probar varias soluciones:

  • cuando el usuario inicia sesión en el servidor recupera la authentication_token y la coloca en la cookie. No es muy seguro a menos que lo cifre con una clave secreta compartida.

  • puede proporcionar un servicio web https que su aplicación para iPhone usa para obtener un token de usuario. Su aplicación para el iPhone tendría la solicitud inmediatamente después de la recepción de la solicitud del usuario para iniciar sesión.

Siento no poder ser de más ayuda con algo de código real.

+0

Estoy planeando tener un certificado SSL para la aplicación web para que todos los datos se intercambien a través de https. También estoy planeando usar auth_token para cada solicitud hecha desde la aplicación de iPhone. Pero lo que estoy confundido es cómo realmente implemento la pieza del iPhone para autenticar realmente a la aplicación web con nombre de usuario y contraseña por primera vez, así puedo obtener el token automático para las solicitudes posteriores. – ed1t

4

Esto depende en gran medida de cómo se implementan las cosas en el lado del servidor, pero lo implementamos utilizando la tercera opción de Matteo. Tengo una implementación de carriles 3.1 utilizando el dispositivo. La ruta al inicio de sesión es /users/login.json.En primer lugar construir el cuerpo JSON para inicio de sesión con un código como éste:

NSMutableDictionary *loginDictionary = [NSMutableDictionary dictionary]; 
NSMutableDictionary *usernamePasswordDictionary = [NSMutableDictionary dictionary]; 
[usernamePasswordDictionary setObject:username forKey:@"email"]; 
[usernamePasswordDictionary setObject:password forKey:@"password"]; 
[loginDictionary setObject:usernamePasswordDictionary forKey:@"user"]; 

NSData *data = [NSJSONSerialization dataWithJSONObject:loginDictionary options:0 error:&error]; 

que produce este JSON:

{"user":{"password":"blahblahblah","email":"[email protected]*****.com"}} 

que enviar una solicitud POST URL con el código de la siguiente manera:

NSString *postUrlString = [NSString stringWithFormat:@"%@users/login.json", kServerAPIBaseURL]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:postUrlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:kTimeoutInterval]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-type"]; 
[request setHTTPBody:data]; 

La respuesta que recibo contiene JSON. Hemos configurado el servidor para devolver el un session_auth_token:

{ 
    admin = 1; 
    "created_at" = "2012-01-25T00:15:58Z"; 
    "current_sign_in_at" = "2012-04-04T04:29:15Z"; 
    "current_sign_in_ip" = "75.163.148.101"; 
    email = "[email protected]******.com"; 
    "encrypted_password" = "*****"; 
    "failed_attempts" = 0; 
    id = 1; 
    "last_sign_in_at" = "2012-04-03T03:37:18Z"; 
    "last_sign_in_ip" = "75.163.148.101"; 
    "locked_at" = "<null>"; 
    name = "Joe Smith"; 
    "remember_created_at" = "2012-03-29T20:35:43Z"; 
    "reset_password_sent_at" = "<null>"; 
    "reset_password_token" = "<null>"; 
    "session_auth_token" = "3FRgX6CYlzQJGC8tRWwqEjFaMMFKarQAYKTy3u84M0U="; 
    "sign_in_count" = 145; 
    status = 1; 
    "unlock_token" = "<null>"; 
    "updated_at" = "2012-04-04T04:29:15Z"; 
} 

Almacenamos que session_auth_token y luego enviarlo de vuelta con cada petición en una cabecera, algo como esto:

NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self postUrlString]]... 
[postRequest setHTTPMethod:@"POST"]; 
[postRequest setValue:@"application/json" forHTTPHeaderField:@"Content-type"]; 
[postRequest setValue:[self sessionAuth] forHTTPHeaderField:@"X-CSRF-Token"]; 
[postRequest setHTTPBody:data]; 

Ese parámetro [self sessionAuth] contiene el session_auth_token.

Avísame si necesitas alguna aclaración.

Cuestiones relacionadas