Проверка подлинности IOS https

Я хочу, чтобы мое приложение проходило аутентификацию на устройстве, т.е. передавая имя пользователя и пароль через https.

Я посмотрел на несколько примеров и в основном построил следующее:

-(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];

}

Поскольку я использую примеры, которые я взял, мне нужно больше понимания, NSURLConnection в приведенном выше примере не содержит имя пользователя и пароль, как мне его добавить? поэтому запрос также будет содержать имя пользователя и пароль или, возможно, лучше передать эту информацию. В настоящее время запрос содержит только строку URL.

Спасибо ER

Ответы на вопрос(2)

Вы должны использоватьNSURLConnectionDelegate делегат для обработкиNSURLConnection События.

Для аутентификации есть два метода делегатов:connection:canAuthenticateAgainstProtectionSpace: а такжеconnection:didReceiveAuthenticationChallenge:

Смотрите примеры вРуководство по программированию системы загрузки URL

Решение Вопроса

Когда вы делаете запрос, требующий аутентификации, вы получите обратный вызов didReceiveAuthenticationChallenge, который вы обрабатываете следующим образом:

-(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
      }
  }
}

Ваш ответ на вопрос