Нужна помощь с NSURLCredential initWithTrust: - PullRequest
1 голос
/ 04 июля 2011

Последние несколько часов я бью головой о стену и нигде не могу найти ни малейшего проблеска решения.Я работаю над приложением, чтобы узнать, как работать с 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 Ответ

0 голосов
/ 25 июля 2013

NSURLAuthenticationMethodServerTrust - это то, что вы получите обратно при согласовании SSL-соединения. Это дает вам возможность оценить доверие сервера (или наоборот). Технический комментарий 2232 описывает это немного подробнее. Ваш делегат должен справиться с этим - техническая ссылка на источник для примера кода Advanced URL Connections, которая должна показать вам, как ответить на этот вызов.

Не отчаивайтесь, если с вашего сервера идет шаг аутентификации HTTP, вы увидите, что делегат получит его позже.

...