Panther, Tiger 및 Leopard 시스템에서 실행중인 프로그램을 NSURLConnection 인증을 위해 다음 방법을 사용합니다 ("encodedUserPass"는 기본 단어가있는 인증 문자열입니다. base64로 인코딩 된 사용자 : 나중에 ...)타이거에서 기본 인증을 사용하는 NSURLConnection이 Panther 및 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의 "didReceiveAuthenticationChallenge"도 보통 호출됩니다 (즉, 헤더를 수동으로 설정하면 작동하지 않는 것 같습니다).
Tiger에서 didReceiveAuthenticationChallenge는 항상 호출되어 위에서 설명한대로 응답을 시도한 다음 실패로 다시 호출됩니다.
두 가지 질문 : (i) 헤더를 수동으로 설정하지 않는 이유는 무엇입니까? (2) 위의 방법이 Tiger (10.4)에서 실패하는 이유는 무엇입니까? 몇 가지 생각 후, 나는 내 base64로 인코딩 방법에 문제가있을 것으로 실현하고 있었다
:
LATER UPDATE 내가 추가하지 않은 64 기수를 가져올 징후와 동일 최대 4 자의 문자열. 내가 함께 해결
while ([bareString length] % 4) [bareString appendString:@"="];
그리고이 프로그램은 세 가지 플랫폼 모두에서 작동합니다. 그래서 질문 (i)가 답을 얻습니다. 머리글을 수동으로 설정하면 작동하지 않습니다. 왜냐하면 등호로 채우지 않았기 때문입니다.
질문 : (ii) 여전히 남아 있습니다. 왜 didReceiveAuthenticationChallenge successfuly를 Tiger에서 사용할 수 없습니까?
감사합니다. Nick. 이것은 설명 일 수도 있습니다. 아마도 didReceiveAuthenticationChallenge에서 제공했던 NSURLCredentials 대신 다른 NSURLCredentials가 사용 되었기 때문에 기본 인증 권한을 얻는 것이 중요했습니다. 영구 자격 증명이 didReceiveAuthenticationChallenge에서 자신을 제공 한 자격 증명보다 우선 적용됩니까? – Dennis
자격 증명 저장소에 유효한 NSURLCredentials가있는 경우 didReceiveAuthenticationChallenge가 호출되지 않습니다. 실제로 저장된 값이 우선합니다. –