我有一个在 Panther、Tiger 和 Leopard 系统上运行的程序,并使用以下方法进行 NSURLConnection 身份验证(“encodedUserPass”是带有单词 Basic 后跟 base64 编码用户:pass 的身份验证字符串)
[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 系统上运行良好,但在 Tiger 上完全失败。奇怪的是,即使在 Panther 和 Leopard 上,通常也会调用“didReceiveAuthenticationChallenge”(即,手动设置标头似乎不起作用)。
在 Tiger 上,didReceiveAuthenticationChallenge 总是被调用,尝试如上所示响应,然后再次调用失败。
两个问题:(i)为什么手动设置标题不起作用?(2) 为什么上面显示的方法在 Tiger (10.4) 上失败?
稍后更新:
经过一番思考,我意识到我的 base64 编码方法一定有问题,并且有:我没有附加等号来使 base64 字符串达到 4 个字符的倍数。我解决了
while ([bareString length] % 4) [bareString appendString:@"="];
现在该程序适用于所有三个平台。所以问题(i)得到了回答:手动设置标题不起作用,因为我没有用等号填充。
但是,问题 (ii) 仍然存在:为什么我不能在 Tiger 中成功使用 didReceiveAuthenticationChallenge?