Проблема с NSURLConnection, Basic Auth и Cookies

Я обнаружил, что сервер, на котором я выполняю REST-вызовы, передает файлы cookie на мой iPhone. Он также использует HTTP Basic Auth.

У меня есть приложение, в котором вы можете изменить учетные записи, используемые для проверки подлинности, однако я обнаружил, что изменение учетных данных не имеет значения с didReceiveAuthenticationChallenge никогда не называется.

Я рассмотрел два возможных исправления:

  • удаление файлов cookie вручную при изменении учетных данных
  • установка [request setHTTPShouldHandleCookies:NO]

Интересно, правильно ли я это понимаю. Я ожидал что NSURLRequestReloadIgnoringCacheData позаботится о кэшировании, но это не так.

Как я могу решить это?

РЕДАКТИРОВАТЬ: Я только что попробовал настройки shouldHandleCookies в NO, но кажется, что куки все еще передаются на сервер.

2 ответа

Решение

Роб, ты совершенно прав, похоже, с этим есть проблема. В некоторых случаях устанавливаются файлы cookie, в которых сохраняются старые учетные данные аутентификации. Другие предположили, что вам, возможно, понадобится очистить куки, и это решило проблему для меня:

 - (void)clearCookiesForURL {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *cookies = [cookieStorage cookiesForURL:_URL];
    for (NSHTTPCookie *cookie in cookies) {
        NSLog(@"Deleting cookie for domain: %@", [cookie domain]);
        [cookieStorage deleteCookie:cookie];
    }
  }

Взгляните на этот вопрос, чтобы больше didReceiveAuthenticationChallenge вызывали только один раз iPhone

Safe Swift:

func clearCookies(forURL URL: NSURL) -> Void {
    let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
    let cookies = cookieStorage.cookiesForURL(URL) ?? []
    for cookie in cookies {
        print("Deleting cookie for domain: \(cookie.domain)")
        cookieStorage.deleteCookie(cookie)
    }
}

Если вы хотите получить String Вы всегда можете flatMap несостоятельный NSURL инициализатор:

let cookies = NSURL(string: string).flatMap(cookieStorage.cookiesForURL) ?? []
Другие вопросы по тегам