NSURLConnection, NSURLRequest, недоверенный сертификат и аутентификация пользователя
Всем доброе утро,
Я пытался написать приложение, которое делает некоторые GET из удаленной веб-службы, которая требует аутентификации. Моя главная проблема заключается в том, что большинство этих удаленных серверов (а их много) не имеют действительных сертификатов. У меня есть код для принятия недействительного сертификата и код для ответа на вызов с правильным uname & pass (ниже). У меня проблема в том, чтобы заставить двоих играть вместе. Я не могу найти способ отправить вызов как NSURLCredential
s или способ правильно связать обратные вызовы. Когда я пытаюсь связать их, я не могу получить NSURLRequest
звонить didReceiveAuthenticationChallenge
дважды.
Любые мысли будут оценены!
Код для аутентификации...
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if(!hasCanceled){
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog(@"Bad Username Or Password");
badUsernameAndPassword = YES;
finished = YES;
}
}
}
1 ответ
Вы можете ответить только на NSURLAuthenticationChallenge
с удостоверением для этого вызова. Вы можете определить, какой тип задания вы получили, используя:
[[challenge protectionSpace] authenticationMethod]
Возможные значения описаны здесь. В случае недействительного сертификата сервера, метод аутентификации будет NSURLAuthenticationMethodServerTrust
, В вашем коде вы должны проверить метод аутентификации и ответить соответствующим образом.
if ([challenge previousFailureCount] > 0) {
// handle bad credentials here
[[challenge sender] cancelAuthenticationChallenge:challenge];
return;
}
if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
// check if the user has previously accepted the certificate, otherwise prompt
} else if ([[challenge protectionSpace] authenticationMethod] == /* your supported authentication method here */) {
[[challenge sender] useCredential:/* your user's credential */ forAuthenticationChallenge:challenge];
}
Это не ошибка, если вы не получаете обе проблемы аутентификации каждый раз. Вы можете кэшировать учетные данные при их создании. Если вы это сделаете, вам не обязательно будет предложено снова.