2013-08-18 3 views
3

У меня есть приложение iOS, которое регистрируется пользователем и затем аутентифицирует этого пользователя с помощью appKey. Метод делегата didReceiveAuthenticationChallenge на NSURLConnection достаточен для предоставления имени пользователя/пароля NSURLCredential. Однако у меня возникли проблемы с созданием NSURLCredential только с appKey (всего один экземпляр данных аутентификации, а не два). Есть ли способ предоставить данные аутентификации на сервере с NSURLConnection только с ключом?NSURLCredential Authentication только с одним ключом

Следующая curl запрос отлично работает лишь предоставляя appKey, пароль:

curl -u <app key>: -H "Accept: application/json" https://dev.sitename.com/api/v1/webpage -v 

Это как я переводил выше часть cURL аутентификации Objective-C:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    // Authenticate the user with AppKey based on the credentials provided 
    if ([challenge previousFailureCount] == 0) { 
     NSURLCredential *credential = [NSURLCredential credentialWithUser:[keychainItem objectForKey:@"APP KEY"] password:nil persistence:NSURLCredentialPersistenceForSession]; 
     [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
    } 
} 

Это должно работать, но каждый раз, когда я пытаюсь, аутентификация терпит неудачу. Как вы можете видеть, я установил параметр password в nil. Я также попытался заполнить оба параметра. Ничто не работает.

Любые идеи о том, как передать только один параметр на сервер, используя NSURLConnection? Есть ли способ получить информацию об ошибке из метода делегата didReceiveAuthenticationChallenge (я знаю didReceiveResponse)?

ответ

1

Это, кажется, недокументированная поведение NSURLCredential: при прохождении nil в качестве пароля для credentialWithUser:password:persistence:, и с помощью этого верительных, чтобы ответить на вызов аутентификации, IOS игнорировать учетные данные в целом.

Решение должно заменить nil пустым NSString (@""), если вы не хотите использовать пароль.

Так что ваш код должен выглядеть примерно так:

NSURLCredential *credential = [NSURLCredential credentialWithUser:[keychainItem objectForKey:@"APP KEY"] password:@"" persistence:NSURLCredentialPersistenceForSession]; 

Это то, что я получаю из журналов моего Nginx с в nil пароль:

xxx.xxx.xxx.xxx - - [18/Aug/2013:23:21:14 +0200] "GET /tmp HTTP/1.1" 401 188 "-" "test/1.0 CFNetwork/609.1.4 Darwin/12.4.0" 

И с пустой строкой (apikey являющееся именем пользователя, используемым в ответ на вызов):

xxx.xxx.xxx.xxx - apikey [18/Aug/2013:23:21:16 +0200] "GET /tmp HTTP/1.1" 200 136 "-" "test/1.0 CFNetwork/609.1.4 Darwin/12.4.0" 
+0

Повторяя ваш вопрос, я увидел «Я также попробовал заполнить оба параметра. Ничего похожего не работает ». Вы уже пытались« @ »«? » –

+0

Спасибо за ответ! Я пробовал это, но это не сработало. Кроме того, я считаю, что' @ "" 'равнозначно' nil '. –

+1

Жаль, что это не сработало. И нет, [' nil' - это не то же самое, что '@" "') (http://stackoverflow.com/questions/4283690/objective-c-whats-the-difference -between-null-nil-and). Пробовали ли вы протоколировать HTTP-ответ, отправленный вашим приложением (с помощью [Charles] (http://www.charlesproxy.com/) или что-то подобное), чтобы узнать, является ли его клиент или сервер проблема? –