我的桌面应用程序连接到谷歌应用程序引擎上的Web应用程序。一旦它进行了身份验证,它将获得一个authtoken cookie,它将为以后的所有请求传递该cookie。一切正常。
但现在我想加上“退出”。我尝试过这样的注销:
- (void)signOut {
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *each in [[[cookieStorage cookiesForURL:[NSURL URLWithString:self.serviceRootURLString]] copy] autorelease]) {
[cookieStorage deleteCookie:each];
}
[self clearCredentialStorage];
}
问题是,它似乎只是第一次工作。例如,我可以打开我的应用程序。登录提出一些要求。退出。然后,下次我提出请求时,我被要求再次认证。很好!
但是在我第二次认证之后,问题就发生了。验证有效。我得到了authtoken cookie。我可以提出要求。但是当我尝试第二次退出(不重新启动我的应用程序)时,AutoTookCookie似乎没有被删除。从我的应用程序的角度来看,它似乎被删除了…我向nshttpcookiestorage询问cookies,它有我的url,但没有返回任何。但是,如果我试图提出另一个请求(应该要求AuthTookCookie),该请求只是工作,我不会得到401的响应,并且我再也不会要求再次认证。
所以,如果我理解正确的话,cookies似乎从我的角度被删除了,但它们并没有从底层url加载框架的角度被删除。
可能有人感兴趣,也许这个问题与:http://www.macworld.com/article/143343/2009/10/safaricookieproblems.html
有人知道如何在与web服务交互的应用程序中一致地实现“注销”功能吗?
谢谢,
杰西
最佳答案
理论:还有其他相关的cookie不在您的服务的url下,因为有些请求会导致重定向,从而可能在您的系统上获取或设置cookie。
另外:我推荐using tcpdump for debugging。您将能够准确地看到网络上发生了什么,并确切地知道发送或接收了哪些cookie。