Проблема с 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) ?? []