9

状況

  • AFNetworking (NSURLConnection) を使用してサーバー API にアクセスする
  • API には、ユーザー名としてトークンを使用した基本認証が必要です
  • トークンが無効な場合、API は HTTP 401 を返します
  • リクエストの前に基本認証ヘッダーを設定します
  • 401 が返された場合は、次のように再試行します。

    AFHTTPRequestOperation *requestOperation = [MyHTTPClient.sharedClient HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        processSuccessBlock(operation, responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        processFailureBlock(operation, error);
    
        if (operation.response.statusCode == 401)
            [MyHTTPClient.sharedClient refreshTokenAndRetryOperation:operation success:processSuccessBlock failure:processFailureBlock];
    }];
    

問題

  • サーバーが基本認証チャレンジで HTTP 401 を返すと、AFNetworking/NSURLConnectionは同じ要求を 2 回送信します(最初の要求と認証チャレンジへの応答)。
  • しかし、HTTP 401 を自分で処理する上記のコードのため、これはまったく不要 であり、認証チャレンジへの自動応答を停止したい

私が試したこと

  • に応答するとcancelAuthenticationChallenge:2willSendRequestForAuthenticationChallenge:番目の呼び出しが中止されますが、401 ではなくエラー コード -1012 (NSURLErrorUserCancelledAuthentication) が返され、実際の応答がマスクされます。

認証チャレンジ/レスポンス メカニズムを無効にして、サーバーのレスポンスを 2 回呼び出さずに取得するにはどうすればよいですか?

4

2 に答える 2

9

認証処理を完全にカスタマイズするためのオプションがいくつかあります。

  1. setWillSendRequestForAuthenticationChallengeBlock:およびsetAuthenticationAgainstProtectionSpaceBlock: from クラスを利用し、AFURLConnectionOperation必要なメカニズムを調整できる対応するブロックを設定します。

    ヘッダーにはドキュメントが含まれています。

  2. connection:willSendRequestForAuthenticationChallenge:のサブクラスでオーバーライドしAFURLConnectionOperationます。これにより、AFNetworking での完全な認証メカニズム設定が効果的に上書きされます。

「サーバーがクライアント ID を検証する」認証チャレンジを無効にすることはできないことに注意してください。これはサーバーの一部です。要求された認証方法に正しい資格情報を提供する必要があります

于 2013-07-05T06:40:10.867 に答える
4

これを試して。

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    SecTrustRef trust = challenge.protectionSpace.serverTrust;
    NSURLCredential *cred;
    cred = [NSURLCredential credentialForTrust:trust];
    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
}
于 2013-07-08T11:49:50.313 に答える