Проблема с NSURLConnection, Basic Auth и Cookies - PullRequest
4 голосов
/ 21 сентября 2011

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

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

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

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

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

Как мне решить эту проблему?

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

Ответы [ 2 ]

7 голосов
/ 16 мая 2012

Роб, вы совершенно правы, похоже, проблема в этом. В некоторых случаях устанавливаются файлы 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

2 голосов
/ 24 марта 2016

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) ?? []
...