У меня есть программа, работающая на системах Panther, Tiger и Leopard и использующая следующий метод аутентификации NSURLConnection («encodedUserPass» - это строка auth со словом Basic follow в base64 кодировке пользователя: пароль)NSURLConnection с использованием базового auth не работает на Tiger, преуспевает в Panther and Leopard
[theRequest addValue:encodedUserPass forHTTPHeaderField:@"Authorization"];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
... позже ... в didReceiveAuthenticationChallenge
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:login_name password:password persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
Это отлично работает на Panther и систем Leopard, но не совсем на тигра. Странно, однако, что даже на Panther и Leopard обычно называется «didReceiveAuthenticationChallenge» (т. Е. Настройка заголовков вручную, похоже, не работает).
На Tiger, didReceiveAuthenticationChallenge всегда вызывается, пытается ответить, как показано выше, и затем снова вызывается с ошибкой.
Два вопроса: (i) Почему не настраиваются заголовки вручную? и (2) Почему метод, показанный выше, терпит неудачу на Tiger (10.4)?
СПУСТЯ UPDATE:
Поразмыслив, я понял, что там должно было быть что-то неправильно с моим методом base64-кодирования, и не было: я не присоединять знака равенства для приведения base64 строка длиной до нескольких символов. Я решил это с
while ([bareString length] % 4) [bareString appendString:@"="];
И теперь программа работает на всех трех платформах. Поэтому на вопрос (i) отвечает: настройка заголовков вручную не работала, потому что я не заполнял знаками равенства.
Вопрос (ii) остается, хотя: почему я не могу использовать didReceiveAuthenticationChallenge успешно в Tiger?
Спасибо за это, Ник. Я могу представить, что это может быть объяснением - возможно, было важно получить базовое право auth, потому что в противном случае сохранялись NSURLCredentials, а не те, которые я предоставил в didReceiveAuthenticationChallenge. Будет ли постоянная учетная запись отменена, если я предоставил себя в didReceiveAuthenticationChallenge? – Dennis
Если в хранилище учетных данных есть действительные NSURLCredentials, то didReceiveAuthenticationChallenge не вызывается - поэтому в действительности сохраненные имеют приоритет. –