Autenticazione HTTP di base su iPhone

Sto cercando di far funzionare un piccolo client Twitter e ho riscontrato un problema durante il test delle chiamate API che richiedono l’autenticazione.

La mia password contiene caratteri speciali, quindi quando provo a usare il seguente codice non funziona.

NSString *post = [NSString stringWithFormat:@"status=%@", [status stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@@%@/statuses/update.json", username, password, TwitterHostname]]; [request setURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLResponse *response; NSError *error; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

Ho iniziato a cercare in base64 e inserire l’autenticazione nelle intestazioni. Ho trovato il post di Dave Dribin sulla sua implementazione in base64, e sembrava avere un senso. Tuttavia, quando ho provato a usarlo, il compilatore ha iniziato a lamentarsi di come non potesse trovare le librerie di openssl. Quindi ho letto che avevo bisogno di collegarmi nella libreria libcrypto, ma non sembra esistere per iphone.

Ho letto anche persone che dicono che Apple non permetterà app che usano le librerie crittografiche, il che non ha senso per me.

Quindi ora sono piuttosto bloccato e confuso. Qual è il modo più semplice per ottenere l’autenticazione di base nella mia app?

Saluti

Due cose. In primo luogo devi usare i metodi asincroni piuttosto che il metodo sincrono / class.

 NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:req] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; // create the connection with the request // and start loading the data NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

L’autenticazione viene gestita implementando questo metodo nel delegato:

 - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 

E probabilmente dovrai anche implementare questi metodi:

 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; - (void)connectionDidFinishLoading:(NSURLConnection *)connection; 

L’utilizzo del metodo asincrono tende a offrire comunque un’esperienza utente migliore, quindi, nonostante la complessità aggiuntiva, vale la pena farlo anche senza la possibilità di eseguire l’autenticazione.

Puoi anche scaricare direttamente il nome utente e la password nell’URL principale, ovvero https: // username: [email protected]/

Prima di tutto è necessario chiamare il file Delegato NSURLConnection: –

  • Connessione (BOOL): connessione (NSURLConnection *) canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace *) protectionSpace

    {

    return YES; }

e quindi chiamare – (void) connection: (NSURLConnection *) connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *) challenge

 { if ([challenge previousFailureCount] == 0) { NSURLCredential *newCredential; newCredential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession]; NSLog(@"NEwCred:- %@ %@", newCredential, newCredential); [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; } else { [[challenge sender] cancelAuthenticationChallenge:challenge]; NSLog (@"failed authentication"); } }