2

У меня есть программа, работающая на системах 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?

ответ

0

Я просто наткнулся в ту же проблему, что вы описали, и обнаружил, что NSURLCredentialPersistenceNone просто не работает на тигре, в то время как указания NSURLCredentialPersistenceForSession делает.

В зависимости от вашего приложения, которое может быть или не быть приемлемым обходным путем.

Документация от Apple оставляет желать лучшего, поскольку она не указывает, какова область действия «сеанса» на самом деле - до тех пор, пока приложение не уйдет, может быть?

+0

Спасибо за это, Ник. Я могу представить, что это может быть объяснением - возможно, было важно получить базовое право auth, потому что в противном случае сохранялись NSURLCredentials, а не те, которые я предоставил в didReceiveAuthenticationChallenge. Будет ли постоянная учетная запись отменена, если я предоставил себя в didReceiveAuthenticationChallenge? – Dennis

+0

Если в хранилище учетных данных есть действительные NSURLCredentials, то didReceiveAuthenticationChallenge не вызывается - поэтому в действительности сохраненные имеют приоритет. –