iPhone: Как получить базовую аутентификацию для веб-службы HTTPS с помощью NSURLCredential - PullRequest
2 голосов
/ 24 февраля 2010

Я пытаюсь вызвать веб-службу https (RESTful) с использованием обычной аутентификации. Он работает нормально, если я помещаю учетные данные в сам URL, но я бы предпочел добавить его в запрос, чтобы пароль не появлялся, например, в исключении.

Я использую следующий код:

    NSURLCredential *credential = [NSURLCredential credentialWithUser:@"myuser"
                                                             password:@"mypassword"
                                                          persistence:NSURLCredentialPersistenceForSession];

    NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                             initWithHost:@"example.com"
                                             port:443
                                             protocol:@"https"
                                             realm:nil
                                             authenticationMethod:NSURLAuthenticationMethodHTTPBasic];


    [[NSURLCredentialStorage sharedCredentialStorage]  setDefaultCredential:credential
                                                        forProtectionSpace:protectionSpace];

    NSURLConnection *theConnection = [NSURLConnection  connectionWithRequest:theRequest delegate:self];

но это не работает. Вызывается метод делегата didReceiveAuthenticationChallenge, и я могу добавить туда учетные данные, но в идеале я бы отправил его с запросом.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

Попробуйте отправить учетные данные в заголовке, если это обычная проверка подлинности. У меня работает каждый раз.

Для отправки имени пользователя и пароля в заголовке запроса

NSString *authString = [[NSString stringWithFormat:@"%@:%@", userName, password] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *finalAuth = base64 of authString;

В запросе добавьте заголовок с именем поля Авторизация и значением "Basic " + finalAuth

0 голосов
/ 12 марта 2010

Я пропустил последнюю строку кода, где вы используете NSURLConnection. Убедитесь, что ваш делегат отвечает на:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace

И возвращает YES для вашего ProtectionSpace.

Также убедитесь, что ваш делегат отвечает на:

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

Здесь вы можете назначить учетные данные, которые вы создали, для NSURLAuthenticationChallenge в свойстве предлагаемомCredential, а также вашему экземпляру NSURLProtectionSpace в свойстве protectionSpace NSURLAuthenticationChallenge.

...