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发送相同的请求两次(初始请求,然后响应身份验证质询)
  • 但是由于上面的代码是我自己处理 HTTP 401,这完全没有必要 ,我希望它自动停止回答身份验证挑战

我试过的

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

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

4

2 回答 2

9

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

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

    标题包含文档。

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

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

于 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 回答