次の問題があります: サーバーにリクエストを送信しています。サーバーは HTTP 基本認証を使用し、
- 認証を送信しない場合は 401
- 無効な認証を送信すると 401
- 有効な認証を送信したが、そのユーザーに対してリソースが禁止されている場合は 403 。
401 を受信すると、私の NSURLSession はフレンドリーで、次の方法でデリゲートを呼び出します。
URLSession(
session: NSURLSession,
task: NSURLSessionTask, didReceiveChallenge
challenge: NSURLAuthenticationChallenge,
completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)
ここで、サーバーに送信される資格情報を変更できます。
ただし、403 を受信すると、問題が発生します。そこから、セッションで 403 を取得するために使用したもの以外の資格情報を使用することはできません。その保護スペースのために将来送信されますか?共有された NSURLCredentialStorage を手動で空にしたり、そこに正しい認証情報を直接設定したりしても、役に立ちません。
let credential = NSURLCredential(user: username, password: password, persistence: .ForSession)
let protectionSpace = NSURLProtectionSpace(
host: self.host,
port: self.apiRootURL.port!.integerValue,
protocol: self.apiRootURL.scheme!,
realm: "MyRealm",
authenticationMethod: NSURLAuthenticationMethodHTTPBasic)
NSURLCredentialStorage.sharedCredentialStorage().setDefaultCredential(credential, forProtectionSpace: protectionSpace)
この呼び出しの後、正しい資格情報だけが NSURLCredentialStorage にリストされますが、サーバーへの次の呼び出しにはまだ古い資格情報が含まれているため、必然的に別の 403 につながります。
そのメソッドを使用してセッションをリセットしてreset(completionHandler: @escaping () -> Void)
も役に立ちません。
TLDR ; NSURLSession が特定の保護ドメインで成功した後も引き続き使用する資格情報を変更するにはどうすればよいですか?