2013-12-18 4 views
2

Я вызываю веб-службу с помощью схемы HTTPS. Для доступа к веб-службе мне нужно имя пользователя и пароль. Я выполнил базовую аутентификацию http. Я всегда получаю ошибку 401, и я уверен, что имя пользователя и пароль верны. Вот код, который я использовал (я видел этот код здесь: How can I pass credentials while using NSURLSession). Предложения? Спасибо!NSURLSession, базовая аутентификация HTTP и самоподписанный сертификат

NSURL *url = [NSURL URLWithString:@"http://myurl...."]; 

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

NSString *host = [url host]; 
NSInteger port = [[url port] integerValue]; 
NSString *protocol = [url 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:self delegateQueue:nil]; 
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    if (!error) { 
     NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response; 
     NSLog(@"%d", httpResp.statusCode); 
    } 

}] resume]; 

... 

// ONLY FOR SELF-SIGNED CERTIFICATE!!! DANGEROUS!! 
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler 
{ 
    NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; 
    completionHandler(NSURLSessionAuthChallengeUseCredential,credential); 
} 

ответ

2

Для базовой аутентификации мне не удалось, чтобы получить работу с описанным способом Документов, но я мог бы просто сделать именно то, что документы говорят не делать и устанавливать заголовок непосредственно на сессии.

Это версия Swift.

let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration() 
    sessionConfig.HTTPAdditionalHeaders = ["Authorization":"Basic fjdslkfsdfk="] 

Я думаю, вы также можете установить их непосредственно по запросу. Эквивалент Obj-C оставлен как упражнение для читателя.

Существует good blog post here, в котором объясняется, как использовать полномочный делегат.

+0

Конечно, это самое простое решение, но оно работает :) Моя просьба была лучше понять NSURLSession и ее делегатов. в любом случае, +1 –

+0

@FabioMignogna достаточно справедливо. Я могу попробовать снова, чтобы правильно работать и обновлять, но видел, что у него остались без ответа проблемы. Я не уверен, что эти проблемы возникли из-за плохого сервера (отправка 400 не 401) или из-за того, что в основной авторизации нет или нет чего-то другого. Я добавил ссылку на хороший недавний пост от кого-то еще. –

+0

Как рассчитывается часть "fjdslkfsdfk ="? – Michael

Смежные вопросы