Podstawowe uwierzytelnianie HTTP na iPhonie

Próbuję uruchomić małego klienta Twittera i napotkałem problem podczas testowania połączeń API, które wymagają uwierzytelnienia.

Moje hasło ma znaki specjalne, więc gdy próbuję użyć poniższego kodu, nie działa.

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

Zacząłem szukać base64 i umieszczać uwierzytelnianie w nagłówkach. Znalazłem Post Dave ' a Dribina na jego implementacji base64 i wydawało się to mieć sens. Jednak kiedy próbowałem go użyć kompilator zaczął narzekał, że nie mógł znaleźć bibliotek openssl. Przeczytałem więc, że muszę połączyć się z biblioteką libcrypto, ale wydaje się, że nie istnieje dla iphone ' a.

Czytałem też ludzi mówiących, że apple nie zezwala na aplikacje, które używają bibliotek kryptograficznych, co nie ma dla mnie sensu.

Więc teraz utknąłem i jestem zdezorientowany. Jaki jest najprostszy sposób, aby uzyskać podstawowe uwierzytelnianie w mojej aplikacji?

Cheers

Author: system PAUSE, 2009-06-14

2 answers

Dwie rzeczy. Najpierw musisz użyć metod asynchronicznych, a nie metody synchronous/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];

Uwierzytelnianie jest zarządzane przez implementację tej metody w delegacie:

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

I prawdopodobnie będziesz też musiał zaimplementować te metody:

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

Używanie metody asynchronicznej i tak daje lepsze wrażenia użytkownika, więc mimo dodatkowej złożoności warto robić to nawet bez możliwości uwierzytelniania.

 15
Author: Stephen Darlington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 08:58:19

Możesz bezpośrednio również napisać Pobierz nazwę użytkownika i hasło w głównym URL IE https://username:[email protected]/

Najpierw musisz wywołać plik delegata NSURLConnection: -

  • (BOOL)connection: (NSURLConnection *)connection canAuthenticateAgainstProtectionspace: (NSURLProtectionSpace *) protectionSpace

    {

    Return YES; }

A następnie wywołaj - (void)połączenie: (NSURLConnection *)połączenie 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");
        }
}
 0
Author: Krissh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-28 05:38:50