Базовая аутентификация HTTP не работает в Restkit, работает с AFNetwork

Я пытаюсь сделать почтовый запрос на сервер с базовой аутентификацией. Я попробовал это с AFNetwork Library, и это работает! Потому что я хочу использовать 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=Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, который выдает себя за ####### СКРЫТЫЙ #######, что может подвергнуть риску вашу конфиденциальную информацию. как подключиться к серверу в любом случае?

Но я установил

отключитьсертификатионвалидация

на ДА

Я также пытался следить за информацией здесь RestKit Pull. Но это тоже совсем не помогло. Кто-нибудь знает, что может быть не так? С AFNetwork Library код более или менее такой же, но работает.


person NDY    schedule 31.10.2012    source источник


Ответы (3)


Я также новичок в RestKit, но я только что получил HTTP Basic Auth для работы, в основном используя ваш пример и эти два изменения:

  • Вам не нужен disableCertificateValidation для базовой аутентификации, так как этот метод нужен только при работе с SSL-соединениями. Так что удали его.
  • Поскольку вы отправляете запрос синхронно, вам не нужен метод делегата или получателя, и вы можете просто оценить свой ответ одной строкой кода позже.

Если это все еще не работает, проверьте правильность вашего URL-адреса, добавив NSLog(@"URL: %@", [[request URL] absoluteString]); между инициализацией вашего запроса и sendSynchronously.

Надеюсь, это поможет, это сработало для меня.

person christopher    schedule 09.11.2012
comment
Мне нужно отключитьCertificateValidation, потому что у меня есть соединения SSL. Я все перепробовал, также добавил сертификаты с помощью addRootCertificate в RestKit. Все не помогло. По крайней мере, я добавил сертификаты самостоятельно, без RestKit API. - person NDY; 09.11.2012

По крайней мере, я не получил свое решение через 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);
}

Наверное, это кому-то поможет.

person NDY    schedule 09.11.2012

В моем случае я устанавливал disableCertificateValidation на RKClient, но использовал RKObjectManager, который использовал другой RKClient. Следующая строка сделала свое дело:

[RKObjectManager sharedManager].client.disableCertificateValidation = YES;
person Jordi Corominas    schedule 10.09.2013