2009-06-14 2 views
13

Я пытаюсь запустить небольшой клиент Twitter, и я столкнулся с проблемой при тестировании вызовов API, требующих проверки подлинности.Базовая аутентификация HTTP на iPhone

В моем пароле есть специальные символы, поэтому, когда я пытаюсь использовать следующий код, он не работает.

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

Я начал изучать base64 и помещал аутентификацию в заголовки. Я нашел Dave Dribin's сообщение о его реализации base64, и это, казалось, имело смысл. Однако, когда я попытался использовать его, компилятор начал жаловаться на то, как он не смог найти библиотеки openssl. Поэтому я прочитал, что мне нужно связать библиотеку libcrypto, но, похоже, для iphone она не существует.

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

Так что теперь я немного застрял и смущен. Какой самый простой способ получить базовую аутентификацию в моем приложении?

Cheers

ответ

15

Две вещи. Во-первых, вы должны использовать методы async, а не метод 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]; 

аутентификации управляется реализации этого метода в делегата:

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

И вы, вероятно, также необходимо реализовать эти методы тоже:

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

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

+0

Я изменил sendSynchronous вызов initWithRequest: запрос делегата: я и затем настройте didReceiveAuthenticationChallenge в делегате, но ничего не вызвано. Я пробовал другие методы делегата NSURLConnection, и они тоже не работали. Есть идеи? – Meroon

+0

Я понял, почему методы делегата не работают. Я вызывал initWithRequest из метода класса, который не будет работать. Спасибо за помощь. – Meroon

+0

Извините, излишне краткий ответ (но рад, что вы попали туда в конце).Я расширил его. Надеюсь, теперь это немного полезно. –

0

Вы можете прямо так же писать скачать пароль имя пользователя & в основной URL т.е. https://username:[email protected]/

Прежде всего вам нужно позвонить NSURLConnection Делегат файл: -

  • (BOOL) соединение: (NSURLConnection *) подключение canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace *) protectionSpace

    {

    возвращение ДА; }

, а затем вызвать - (Недействительными) соединение: (NSURLConnection *) подключение didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *) вызов

{ 
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"); 
     } 
} 
Смежные вопросы