Panther、Tiger、および Leopard システムで実行されているプログラムがあり、NSURLConnection 認証に次の方法を使用しています (「encodedUserPass」は、Basic という単語の後に base64 でエンコードされた user: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 が常に呼び出され、上記のように応答しようとし、失敗して再度呼び出されます。
2 つの質問: (i) ヘッダーを手動で設定しても機能しないのはなぜですか? (2) 上記の方法が Tiger (10.4) で失敗するのはなぜですか?
後で更新:
少し考えた後、base64 エンコード方法に何か問題があるに違いないことに気付きました。base64 文字列を 4 の倍数にするために等号を追加していませんでした。私はそれを解決しました
while ([bareString length] % 4) [bareString appendString:@"="];
そして今、このプログラムは 3 つのプラットフォームすべてで動作します。したがって、質問 (i) は答えられます。等号でパディングしていなかったため、ヘッダーを手動で設定しても機能しませんでした。
ただし、疑問 (ii) は残ります。Tiger で didReceiveAuthenticationChallenge を正常に使用できないのはなぜですか?