2013-08-06 6 views
0

Я пытался выяснить, как сделать страницу входа в мое приложение. У меня есть URL, действительное имя пользователя, пароль. Мне сказали использовать базовый auth для этого.Basic Auth example

До сих пор я реализовал этот код

- (IBAction)loginClicked:(id)sender { 

    NSURL *url = [NSURL URLWithString:@"http://site-url.com"]; 

    NSString *loginString =(NSMutableString*)[NSString stringWithFormat:@"%@:%@",usernameTextField.text,passwordTextField.text]; 

    NSData *encodedLoginData=[loginString dataUsingEncoding:NSASCIIStringEncoding]; 

    NSString *authHeader=[NSString stringWithFormat:@"Basic %@", [encodedLoginData base64Encoding]]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
              cachePolicy:NSURLRequestUseProtocolCachePolicy 
             timeoutInterval:3.0]; 

    [request setValue:authHeader forHTTPHeaderField:@"Authorization"]; 
    [request setHTTPMethod:@"POST"]; 

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    [connection start]; 
} 

- (void) connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response { 

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 

    // POW, here's the content of the webserver's response. 
    NSLog(@"Response -> %@",response); 

    int statusCode = [httpResponse statusCode]; 

    NSLog(@"response code:%d",statusCode); 
} 

- (void)connection:(NSURLConnection *)connection willReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    if ([challenge previousFailureCount] == 0) { 
     NSLog(@"received authentication challenge"); 
     NSURLCredential *newCredential = [NSURLCredential credentialWithUser:usernameTextField.text 
                    password:passwordTextField.text 
                   persistence:NSURLCredentialPersistenceForSession]; 
     NSLog(@"credential created"); 
     [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
     NSLog(@"responded to authentication challenge"); 
    } 
    else { 
     NSLog(@"previous authentication failure"); 
    } 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    NSLog(@"Connection success."); 

} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"Connection failure."); 

, чтобы заставить его работать, но когда я использую мой сайт URL, он просто дает мне сообщение об успешном и статус код 200 и не вызывается метод делегата - willSendRequestForAuthenticationChallenge:

Когда я изменить URL на gmail.com Это дает следующий результат:

2013-08-06 12: 06: 08,674 CVReaderSGT [26544: A0B] получил вызов аутентификации 2013-08-06 12: 06: 08.674 CVReaderSGT [26544: a0b] Пользовательская строка: admin Дата: 2013-08-06 12: 06: 08.674 CVReaderSGT [26544: a0b] Строка пароля: пароль 2013-08-06 12: 06: 08.675 Создан CVReaderSGT [26544: a0b] учетные данные ->: admin 2013-08-06 12: 06: 08.675 CVReaderSGT [26544: a0b] ответил на запрос аутентификации 2013-08-06 12: 06: 09.025 CVReaderSGT [26544] : a0b] получен вызов аутентификации 2013-08-06 12: 06: 09.026 CVReaderSGT [26544: a0b] Имя пользователя: admin 2013-08-06 12: 06: 09.026 CVReaderSGT [26544: a0b] Строка пароля: пароль 2013 -08-06 12: 06: 09.026 Созданы учетные данные CVReaderSGT [26544: a0b] ->: admin 2013-08-06 12: 06: 09.026 CVReaderSGT [26544: a0b] ответил на вызов аутентификации 2013-08-06 12: 06: 10.069 CVReaderSGT [26544: a0b] получил запрос аутентификации 2013-08-06 12: 06: 10.069 CVReaderSGT [26544: a0b] Имя пользователя: admin 2013-08-06 12:06 : 10.069 CVReaderSGT [26544: a0b] Строка пароля: пароль 2013-08-06 12: 06: 10.069 Созданы учетные данные CVReaderSGT [26544: a0b] ->: admin 2013-08-06 12: 06: 10.070 CVReaderSGT [26544: a0b] ответили на вызов аутентификации 2013-08-06 12: 06: 10.457 CVReaderSGT [26544: a0b] Response -> {URL: https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=https://mail.google.com/mail/&ss=1&scc=1&ltmpl=default&ltmplcache=2} {код состояния: 200, заголовки { "Cache-Control" = "no-cache , no-store "; "Content-Type" = "text/html; charset = UTF-8"; Дата = "вт, 06 авг. 2013 17:06:09 GMT"; Expires = "Mon, 01-Jan-1990 00:00:00 GMT"; Pragma = "no-cache"; Сервер = GSE; «Set-Cookie» = «GAPS = 1: LoAnsovSVriBDm6iP1r7zuYy7bTCpQ: 3o2OJzkd7X87BrCH; Path = /; Expires = Thu, 06-Aug-2015 17:06:09 GMT; Secure; HttpOnly, GALX = S0GMqJp_fyQ; Path = /; Secure" ; «Строгий транспорт-Безопасность» = «max-age = 2592000; includeSubDomains»; «Передача-кодирование» = Идентичность; «X-Auto-Login» = «realm = com.google & args = service% 3Dmail% 26continue% 3Dhttps% 253A% 252F% 252Fmail.google.com% 252Fmail% 252F"; «X-Content-Type-Options» = nosniff; «X-Frame-Options» = Deny; «X-XSS-Protection» = «1; mode = block»; }} 2013-08-06 12: 06: 10.458 CVReaderSGT [26544: a0b] Код состояния -> 200 2013-08-06 12: 06: 11.243 CVReaderSGT [26544: a0b] Успех соединения.

Я не знаю, почему я получаю два разных выхода, когда меняю URL-адрес, и почему делегат метод willSendRequestForAuthenticationChallenge: не вызывается, когда я помещаю свой URL.

Here's what the output looks like when using my URL: 
    2013-08-06 12:29:06.007 CVReaderSGT[26583:a0b] Response -> <NSHTTPURLResponse:  0x8e20ac0> { URL: http://XYZ.com/ } { status code: 403, headers { 
"Content-Length" = 1585; 
"Content-Type" = "text/html"; 
Date = "Tue, 06 Aug 2013 17:29:04 GMT"; 
MicrosoftSharePointTeamServices = "12.0.0.6219"; 
Server = "Microsoft-IIS/6.0"; 
"X-Powered-By" = "ASP.NET"; 
    } } 
    2013-08-06 12:29:06.007 CVReaderSGT[26583:a0b] Status code -> 403 
    2013-08-06 12:29:06.007 CVReaderSGT[26583:a0b] Connection success. 

Я действительно хочу понять процесс и заставить его работать.

Может ли кто-нибудь указать примеры или предоставить правильную информацию. Благодарю.

+0

Какой делегат методы 'NSURLConnection' вы реализуете? – ipinak

+0

@iPinak willReceiveAuthenticationChallenge: –

+0

Что вы имеете в виду, когда указываете свой URL? Что это за URL? Кроме того, что пытается достичь. Из того, что я вижу здесь, вы пытаетесь выполнить аутентификацию в gmail, не так ли? Что, видимо, работает очень хорошо. – ipinak

ответ

1
// Authentication delegate methods 
- (BOOL)connection:(NSURLConnection *)connection 
canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
#pragma mark unused (connection) 
    assert(connection == connect); 
    assert(protectionSpace != nil); 

    BOOL retVal; 
    retVal = [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 

    return YES; 
} 

- (void)connection:(NSURLConnection *)connection 
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    // Tries to connect 3 times, after the 3 attempts it cancels. 
    if ([challenge previousFailureCount] < 3) { 
     // Create credentials from the user name and password and save them, for this 
     // specific authentication challenge. 
     NSURLCredential *credentials = [NSURLCredential credentialWithUser:user password:pass persistence:NSURLCredentialPersistenceForSession]; 
//  [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; 
     // Handle the credentials according the state of the challenge. 
     if (challenge == nil) { 
      [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; 
     } 
     else { 
      [challenge.sender useCredential:credentials forAuthenticationChallenge:challenge]; 
     } 
    } 
    else { 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
     NSLog(@"Wrong username or password"); 
    } 
} 

// Save credentials for further use. 
- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection 
{ 
    return YES; 
} 

Взгляните на это. Это работает для меня. Попробуйте изменить значения здесь, чтобы узнать, какой из них соответствует вашим требованиям к серверу.

retVal = [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];