Restkit上的HTTP基本身份验证失败,适用于AFNetwork

时间:2012-10-31 13:00:48

标签: objective-c ios restkit afnetworking

我试图通过基本身份验证向服务器发送帖子请求。我在AFNetwork图书馆试了一下它就可以了!因为我想使用Restkit并且已经使用过,如果我尝试用它做很多事情,但它不起作用。我的代码看起来像这样:

    RKClient *client = [[RKClient alloc] initWithBaseURL:URL];
    client.username = @"username";
    client.password = @"password";
    client.authenticationType = RKRequestAuthenticationTypeHTTPBasic;
    client.disableCertificateValidation = YES;


    RKRequest *request = [client post:@"mypath" params:nil delegate:self];
    [request sendSynchronously];

但是在代表中

- (void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error {

我总是得到错误:

  

NSLocalizedDescription =此服务器的证书无效。您   可能连接到假装是#######的服务器   HIDDEN #######可能会使您的机密信息面临风险。,   _kCFNetworkCFStreamSSLErrorOriginalValue = -9813,_kCFStreamPropertySSLClientCertificateState = 0,NSLocalizedRecoverySuggestion =您要连接到服务器吗?   呢?

但是我设置了

  

disableCertificationValidation

到YES

我也尝试按照此处的信息RestKit Pull。但这根本没有用。有谁有想法,有什么不对吗?使用AFNetwork库,代码或多或少相同,但有效。

3 个答案:

答案 0 :(得分:0)

我也是RestKit的新手,但我只是使用了HTTP Basic Auth,主要是使用你的例子和这两个变化:

  • 对于Basic Auth,您不需要disableCertificateValidation,因为只有在使用SSL连接时才需要此方法。所以删除那个。
  • 当您同步发送请求时,您不需要委托或接收方法,您可以稍后在一行代码中评估您的响应。

如果仍然无效,请在您的请求初始化和NSLog(@"URL: %@", [[request URL] absoluteString]);

之间添加sendSynchronously,检查您的网址是否最终正确

希望这有帮助,它对我有用。

答案 1 :(得分:0)

至少,我没有得到RestKit的解决方案。我尝试了一切,还添加了带有addRootCertificates的证书,但RestKit总是得到相同的错误。 最后,我自己做了。

NSData* certData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"MyCert" ofType:@"cer"]];

[FileUtility addCertToKeychain:certData];

方法addCertToKeychain:

#pragma mark SSL Certification Methods
+ (void) addCertToKeychain:(NSData*)certInDer
{
    OSStatus            err = noErr;
    SecCertificateRef   cert;

    cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certInDer);
    assert(cert != NULL);

    CFTypeRef result;

    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                          (__bridge id)kSecClassCertificate, kSecClass,
                          cert, kSecValueRef,
                          nil];

    err = SecItemAdd((__bridge CFDictionaryRef)dict, &result);
    assert(err == noErr || err == errSecDuplicateItem);

    CFRelease(cert);
}

可能对某人有所帮助。

答案 2 :(得分:0)

就我而言,我在RKClient上设置了disableCertificateValidation,但我使用的是一个使用不同RKClient的RKObjectManager。以下一行就是诀窍:

[RKObjectManager sharedManager].client.disableCertificateValidation = YES;