Нужна помощь с NSURLCredential initWithTrust:
Последние несколько часов я бью головой о стену и нигде не могу найти ни малейшего проблеска решения. Я работаю над приложением, чтобы узнать, как работать с JSON, поэтому я просто создаю простое приложение, которое сначала просто возвращает список всех моих репозиториев на GitHub. Я могу извлечь ответ JSON из данных, возвращаемых NSURLConnection без проблем, к сожалению, когда я пытаюсь получить доступ ко всему, что требует аутентификации, ответ всегда {
message = "Not Found";
}
Если я отправляю запрос, чтобы просто получить общедоступную информацию о моем имени пользователя, я получаю правильный ответ со всей правильной информацией, поэтому я знаю, что я успешно общаюсь с api.github.com. Прежде всего, чтобы запустить запрос, который я использую:
-(IBAction)retriveRepos:(id)sender
{
responseData = [[NSMutableData data] retain];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.github.com/user/repos"]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
когда - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
вызывается метод аутентификации возвращается как NSURLAuthenticationMethodServerTrust
(что мне кажется странным, поскольку я чувствую, что должен ввести имя пользователя и пароль для входа в систему). Согласно документам Apple, мне нужно создать свой NSURLCredential
с initWithTrust:
, Я погуглил ответы и, наконец, нашел несколько мест, в которых сказано просто взять serverTrust
от protectionSpace
из NSURLAuthenticationChallenge
что было передано. Выполнение этого не показывает никаких признаков какого-либо эффекта вообще, на самом деле это выглядит как мой NSURLCredential
в нем почти ничего нет.
if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
NSLog(@"challenge.protectionSpace.serverTrust: %@", challenge.protectionSpace.serverTrust); // This logs "challenge.protectionSpace.serverTrust: <SecTrust 0x10340b2e0 [0x7fff7cc12ea0]>"
NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:challenge.protectionSpace.serverTrust];
NSLog(@"credential: %@", credential); // Always logs something like "credential: <NSURLCredential: 0x1002d2f20>: (null)"
NSURLCredential *otherCredential = [[NSURLCredential alloc] initWithUser:@"user" password:@"password" persistence:NSURLCredentialPersistencePermanent];
NSLog(@"otherCredential: %@", otherCredential); // This logs otherCredential: <NSURLCredential: 0x1018d0840>: user"
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
Я использовал более обширное ведение журнала, что показало, что credential
действительно существовал (сначала я думал, что он вообще не был создан), но у него не было установлено ни одного из его атрибутов certificates: (null)
hasPassword: 0
identity: (null)
password: (null)
, Я могу только предположить, что проблема в моей аутентификации, но я следовал примерам, которые я нашел к письму. Я использую предварительный просмотр GM Lion, так что, возможно, я обнаружил ошибку или что-то в GitHub API, но, учитывая мой уровень квалификации, я нахожу гораздо более вероятным, что я идиот, который ищет над ответом сидит прямо передо мной. Если кто-то знает хорошее руководство, которое на самом деле проведет вас через все этапы аутентификации (желательно во всех стилях), а не строго отсутствующее руководство по загрузке URL-адресов Apple, в котором просто сказано использовать метод, но не сказано, где SecTrustRef
Исходя из этого, будет принята с благодарностью.
1 ответ
NSURLAuthenticationMethodServerTrust
это то, что вы получите обратно при согласовании SSL-соединения. Это дает вам возможность оценить доверие к серверу (или наоборот). Технический комментарий 2232 описывает это немного подробнее. Ваш делегат должен справиться с этим, техническая ссылка на источник для примера кода Advanced URL Connections, которая должна показать вам, как ответить на этот вызов.
Не отчаивайтесь, если с вашего сервера идет шаг аутентификации HTTP, вы увидите, что делегат получит его позже.