2010-08-18 12 views
17

Sto creando la mia prima app per iPad. Ho un'applicazione web su cui vorrei autenticarmi e recuperare dati da RESTful.iOS: come fare una connessione HTTPS sicura per passare le credenziali?

Se si apre l'URL nel browser (https://myapp.com/auth/login), verrà visualizzato un modulo per immettere nome utente e password. Stavo pensando che potrei impostare le credenziali di accesso nei dati postali della richiesta e inviare i dati.

Il sito utilizza HTTPS per l'accesso in modo che le credenziali non vengano passate in testo normale su Internet.

Come è possibile stabilire una connessione HTTPS sicura per il trasferimento delle credenziali? Ricorderà che sono stato registrato per richieste future? Qual è il modo migliore per farlo?

risposta

13

Ulteriore aggiornamento, Ottobre 2013

Anche se al momento ho scritto questa risposta, ASIHTTPRequest è stato mantenuto un ampio consenso, questo non è più il caso. Non è consigliato per i nuovi progetti - usa invece NSURLConnection direttamente o usa AFNetworking.

Con AFNetworking, esiste un metodo [httpClient setAuthorizationHeaderWithUsername:username password:password]; per l'autenticazione HTTP e creare un modulo di stile POST è altrettanto semplice: vedere AFNetworking Post Request per quello.


risposta originale:

Un sacco di gente utilizzare la classe ASIHTTPRequest a che fare con http & https su iPhone/iPad, in quanto ha un sacco di funzioni utili che sono difficili o che richiede tempo di raggiungere con il costruito in classi:

http://allseeing-i.com/ASIHTTPRequest/

Partendo dal livello più semplice che ci si inizia con qualcosa di simile:

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

    [request startSynchronous]; 
    NSError *error = [request error]; 
    if (!error) { 
     NSString *response = [request responseString]; 
     NSLog(@"response = %@", response); 
    } 

Se si utilizza l'autenticazione HTTP, ASIHTTPRequest richiederà automaticamente all'utente il nome utente e la password.

Se si utilizza un'altra forma di autenticazione, è necessario richiedere all'utente nome utente e password dall'utente e inviarli come valore POST o come intestazione http personalizzata, quindi la risposta può includere un token in una risposta JSON o XML o potrebbe impostare un cookie.

Se si aggiungono ulteriori dettagli su come funziona lo schema di autenticazione, posso essere un po 'più specifico.

Aggiornamento

In base all'aggiornamento, per emulare un modulo POST avresti solo bisogno di aggiungere linee come:

[request addPostValue:usernameString forKey:@"username"]; 
[request addPostValue:passwordString forKey:@"password"]; 

Sarà inoltre necessario cambiare il modo in cui si crea la richiesta , invece di:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

fare:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 

(Ho anche dimenticato di menzionarlo sopra, il codice che ho inserito in precedenza utilizza una richiesta sincrona, quindi dovresti sostituirlo con uno asincrono per evitare di bloccare l'interfaccia utente una volta provato che funzionava.)

C'è un quadro JSON per l'iPhone qui:

http://code.google.com/p/json-framework/

che funziona bene per me ed è semplice da usare con ASIHTTPRequest.

+0

Ho aggiunto un po 'più di spiegazione. L'applicazione non è l'autenticazione HTTP di base. È un modulo visualizzato su una pagina web in cui inserisci le tue credenziali. Sto cercando di modificarlo in modo che possa fungere da API RESTful in cui posso eseguire l'autenticazione e interrogare i dati (che verranno restituiti in formato JSON). – Andrew

+0

Ok, ho aggiornato la mia risposta con un po 'più di dettaglio. Essenzialmente dovrebbe essere tutto abbastanza semplice con ASIHTTPRequest. – JosephH

+0

Quindi, una volta che ho "postato" la richiesta a/auth/login, la mia app per iPhone ricorderà che è autenticata? Nel browser, ci sono i cookie che vengono impostati. In altre parole, ora che sono "autenticato", posso fare un'altra richiesta che richiede di essere autenticato? (cioè GET/users/all) – Andrew

Problemi correlati