domingo, 3 de noviembre de 2013

iPhone y Rails con devise, desde la App

Hace unos meses, escribí la enrtada iPhone y Rails con devise, en la que indicaba los pasos a seguir para preparar una app de Ruby on Rails para su acceso desde aplicaciones móviles sobre la gema devise. Debido al comentario realizado por Alejandro DV, incluyo ahora los pasos a realizar en el lado de la aplicación móvil.
Aunque aquí indicaré cómo realizarlo en Objective C, para aplicaciones con iOS, las llamadas serían similares para aplicaciones Android, ya que simplemente consiste en incluir el parámetro con el token en las llamadas correspondientes.


En primer lugar, mediante el editor de Xcode, crearemos la aplicación. Una vez hecho esto, crearemos nuestro LoginController. Esta será a la primera página que se acceda al abrir la aplicación, para asegurarnos de que el usuario se loga en nuestro sistema. En mi caso, la declaración quedaría así:

@interface LoginController : UIViewController <uinavigationcontrollerdelegate>
{
    UIActivityIndicatorView *activityIndicator;
    NSMutableData *responseData;

}

@property (nonatomic, retain) IBOutlet UITextField *username;
@property (nonatomic, retain) IBOutlet UITextField *password;
@property (nonatomic, retain) IBOutlet UIButton *envio;

Tendremos el activityIndicator, para indicar que estamos procesando la llamada, los campos de usuario y password, y el botón de envío.

Necesitaremos la implementación del IBAction del botón para enviar la información:


- (IBAction) envioPushed:(id)sender
{

    activityIndicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    activityIndicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
    activityIndicator.center = self.view.center;
    [self.view addSubview: activityIndicator];
    [activityIndicator startAnimating];

    
    NSString *login_url = [NSString stringWithFormat:@"http://%@:3000/%@", URL_SERVER, @"api/token"];
    NSURL *url = [NSURL URLWithString:login_url];
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
    NSString *params = [NSString stringWithFormat:@"user=%@&password=%@", username.text, password.text];
    NSData *myRequestData = [ NSData dataWithBytes: [ params UTF8String ] length: [ params length ] ];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [urlRequest setHTTPBody: myRequestData ];
    
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
    if(connection) {
        responseData = [[NSMutableData alloc] init];
    } else {
        NSLog(@"connection failed");
        [activityIndicator stopAnimating];
        [[UIApplication sharedApplication] endIgnoringInteractionEvents];
        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
    }
    
}

De este modo, enviaremos una petición POST al servidor, a la url /api/token. Esto llamará a la identificación vía token en el servidor, tal y como lo habíamos implementado.
Posteriormente, en el delegate de la conexión (connectionDidFinishLoading)   deberemos guardar el token en un objeto NSUserDefauts, para tenerlo accesible desde el resto de la aplicación.

En las sucesivas llamadas a servicios de la aplicación Rails, deberemos incluir el parámetro auth_token, para que reconozca al usuario.