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

时间:2013-06-28 06:20:25

标签: ios objective-c cocoa-touch nsurlconnection 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];
    }];
    

问题

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

我做了什么

  • 响应cancelAuthenticationChallenge:willSendRequestForAuthenticationChallenge:正在中止第二次调用,但是它会给出错误代码-1012(NSURLErrorUserCancelledAuthentication)而不是401,并掩盖真实的响应

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

2 个答案:

答案 0 :(得分:9)

您可以通过以下几种方式完全自定义身份验证处理:

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

    标题包含文档。

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

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

答案 1 :(得分: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];
}