NSURLConnection, Basic Auth和Cookies的问题



我发现我进行REST调用的服务器将cookie传递给我的iPhone。它还使用了HTTP基本认证。

我有一个应用程序,您可以更改用于身份验证的帐户,但是我发现更改凭据并不重要,因为didReceiveAuthenticationChallenge从未被调用。

我已经研究了两个可能的修复方法:

  • 在凭证更改时手动删除cookie
  • 设置[request setHTTPShouldHandleCookies:NO]

我想知道我是否理解正确。我期望NSURLRequestReloadIgnoringCacheData会照顾缓存,但情况似乎并非如此。

如何解决这个问题?

编辑:我刚刚尝试将shouldHandleCookies设置为NO,但似乎cookie仍然传递到服务器。

Rob,你说得很对,这似乎确实有问题。在某些情况下,设置cookie是为了保留旧的认证凭证。其他人建议您可能需要像这样清除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) ?? []

最新更新