NSURLConnection - 禁用身份验证质询响应机制

the*_*jaz 9 cocoa-touch objective-c nsurlconnection ios afnetworking

情况

  • 使用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];
    }];
    
    Run Code Online (Sandbox Code Playgroud)

问题

  • 当服务器返回带有基本身份验证质询的HTTP 401时,AFNetworking/NSURLConnection会发送两次相同的请求(初始请求,然后回应身份验证质询)
  • 但由于上面的代码,我自己处理HTTP 401,这是完全没必要的 ,我希望它停止自动回答身份验证挑战

我做了什么

  • 与响应cancelAuthenticationChallenge:willSendRequestForAuthenticationChallenge:被中止第二个电话,但它给出了错误代码-1012(NSURLErrorUserCancelledAuthentication),而不是401和掩盖了真实的反应

如何禁用身份验证质询响应机制,以便在不调用它的情况下获得服务器响应?

Cou*_*per 9

您有几个选项可以完全自定义身份验证处理:

  1. 利用setWillSendRequestForAuthenticationChallengeBlock:setAuthenticationAgainstProtectionSpaceBlock: 从类中AFURLConnectionOperation设置相应的块,您可以在其中定制所需的机制.

    标题包含文档.

  2. 覆盖connection:willSendRequestForAuthenticationChallenge:在子类中AFURLConnectionOperation.这将有效地覆盖AFNetworking中的完整身份验证机制设置.

请注意,您无法禁用"服务器验证客户端身份"身份验证质询 - 这是服务器的一部分.您必须为请求的身份验证方法提供正确的凭据.

  • 我认为您不明白:处理状态代码401(未授权)作为客户端的唯一方法是取消请求或提供凭据.你什么都做不了.见§10.4.2[RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) (3认同)