2012-04-08 15 views
5

Desidero che la mia applicazione si autentichi contro l'appliance passando il nome utente e la password su https.Autenticazione https IOS

Ho guardato alcuni esempi e fondamentalmente costruire il seguente:

-(void)authentication 
{ 
    //setting the string of the url taking from appliance IP. 
    NSString *urlString =[NSString 
          stringWithFormat: 
          @"http://%@",appliance_IP.text]; 
    //define the url with the string 
    NSURL *url = [NSURL URLWithString:urlString]; 

    //creating request 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    //setting credential taking from the username and password field 
    NSURLCredential *credential = [NSURLCredential credentialWithUser:username.text password:password.text persistence:NSURLCredentialPersistenceForSession]; 


    NSURLProtectionSpace *protectionSpace= 
    [[NSURLProtectionSpace alloc]initWithHost:urlString port:443 protocol:@"https" realm:nil authenticationMethod:nil ]; 


    [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; 

    [ NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL]; 

} 

come io uso esempi che ho preso ho bisogno di un po 'di comprensione, NSURLConnection nell'esempio di cui sopra non contiene il nome utente e la password come faccio aggiungilo? quindi la richiesta conterrà anche username e password o forse è meglio passare tali informazioni. Attualmente la richiesta contiene solo la stringa url.

Grazie ER

risposta

8

quando effettua una richiesta che richiede l'autenticazione, si riceverà un callback a didReceiveAuthenticationChallenge, che si gestiscono come segue:

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     if ([challenge.protectionSpace.host isEqualToString:MY_PROTECTION_SPACE_HOST]) 
     { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
     } 

     [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
    } 
    else if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) 
    { 
     if ([challenge previousFailureCount] == 0) 
     { 
      NSURLCredential *newCredential; 

      newCredential = [NSURLCredential credentialWithUser:MY_USERNAME 
         password:MY_PASSWORD 
         persistence:NSURLCredentialPersistenceForSession]; 

      [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
     } 
     else 
     { 
      [[challenge sender] cancelAuthenticationChallenge:challenge]; 

      // inform the user that the user name and password 
      // in the preferences are incorrect 

      NSLog (@"failed authentication"); 

      // ...error will be handled by connection didFailWithError 
     } 
    } 
} 
0

È necessario utilizzare NSURLConnectionDelegate delegato per gestire NSURLConnection eventi.

Per l'autenticazione ci sono due metodi delegati: connection:canAuthenticateAgainstProtectionSpace: e connection:didReceiveAuthenticationChallenge:

Vedi esempi in URL Loading System Programming Guide

Problemi correlati