Как передать учетные данные при использовании NSURLSession

Я пытаюсь войти на свой компьютер, используя utorrent webui.

В настоящее время я использую следующий код:

- (void)login
{
NSURL *feedsURL = [NSURL URLWithString:@"http://localhost:12345/"];

NSString *user = @"username";
NSString *password = @"password";
NSURLCredential *defaultCredential = [NSURLCredential credentialWithUser:user password:password persistence:NSURLCredentialPersistencePermanent];

NSString *host = [feedsURL host];
NSInteger port = [[feedsURL port] integerValue];
NSString *protocol = [feedsURL scheme];
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:host port:port protocol:protocol realm:nil authenticationMethod:NSURLAuthenticationMethodHTTPBasic];

NSURLCredentialStorage *credentials = [NSURLCredentialStorage sharedCredentialStorage];
[credentials setDefaultCredential:defaultCredential forProtectionSpace:protectionSpace];

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
[config setURLCredentialStorage:credentials];

NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil];
[[session dataTaskWithURL:feedsURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (!error) {
        NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
        if (httpResp.statusCode == 200) {
            NSLog(@"Woo! everything is working");
        } else {
            NSLog(@"Hrmmm... error %@ occured", error);
        }
    } else {
        NSLog(@"Hrmmm... error %@ occured", error);
    }

}] resume];

Я отлично вижу страницу при использовании настольного веб-браузера, однако в моем приложении всегда возвращается ошибка 401 (не авторизовано).

Я предполагаю, что это потому, что учетные данные не используются? Если да, то как правильно его использовать? Также не вызываются методы NSURLSessionDelegate. Есть ли что-то еще, что я должен сделать?


person Allan Chau    schedule 05.11.2013    source источник
comment
Вы проверили свой порт #? Я опробовал ваш код и получал 401, пока не форсировал порт 80 для ProtectionSpace. В вашем примере номер порта, полученный из URL-адреса, равен 0. С портом 80 я получаю данные из URL!   -  person Scott Sarnikowski    schedule 11.11.2013


Ответы (2)


HTTP Basic, как правило, требует области в пространстве защиты; это, вероятно, где он терпит неудачу. Проверьте заголовки запроса аутентификации, возвращаемые сервером, используя curl -v, чтобы узнать, что это такое.

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

person Sam    schedule 06.11.2013

попробуйте заменить localhost на IP-адрес компьютера с портом

person iOS Developer    schedule 24.12.2013