Подтвердить что ты не робот

Как очистить файлы cookie от NSHTTPCookieStorage более одного раза?

Мое настольное приложение подключается к веб-приложению, размещенному в Google App engine. Как только он аутентифицируется, он получает cookie authtoken, который он передает для всех будущих запросов. Это все работает.

Но теперь я хочу добавить "Выйти". Ive попытался реализовать Sign Out следующим образом:

- (void)signOut {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *each in [[[cookieStorage cookiesForURL:[NSURL URLWithString:self.serviceRootURLString]] copy] autorelease]) {
        [cookieStorage deleteCookie:each];
    }
    [self clearCredentialStorage];
}

Проблема заключается в том, что она работает только в первый раз. Например, я могу открыть приложение. Войдите. Сделайте несколько запросов. Выход. Затем в следующий раз, когда я сделаю запрос, меня попросят снова подтвердить подлинность. Хорошо!

Но после того, как я аутентифицирую второй раз, проблема возникает. Аутентификация работает. Я получаю файл cookie authtoken. Я могу делать запросы. Но затем, когда я пытаюсь выйти во второй раз (без перезагрузки моего приложения), authtoken cookie, похоже, не удаляется. Это кажется удаленным с точки зрения моих приложений... Я прошу NSHTTPCookieStorage для файлов cookie, что у него есть мой URL, и он не возвращает ничего. Но если я попытаюсь сделать еще один запрос (который должен требовать файл cookie authtoken), запрос просто работает, я не получаю ответ 401, и меня больше не просят подтвердить подлинность.

Итак, если я правильно понимаю вещи, кажется, что файлы cookie удалены с моей точки зрения, но они не удалены из перспективы базового URL-адреса.

Возможный интерес, возможно, проблема связана с: http://www.macworld.com/article/143343/2009/10/safaricookieproblems.html

Кто-нибудь знает, как последовательно реализовать функцию "выхода из системы" в приложении, которое взаимодействует с веб-службой?

Спасибо, Джесси

4b9b3361

Ответ 1

Теория: существуют другие соответствующие файлы cookie, которые не находятся под вашим URL-адресом службы, потому что некоторые запросы приводят к перенаправлению, которое может получить или установить файлы cookie в вашей системе.

Также: я рекомендую с помощью tcpdump для отладки. Вы сможете точно увидеть, что происходит по сети, и точно знать, какие файлы cookie отправляются или получаются.

Ответ 2

+(void)clearAllCookies {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *each in cookieStorage.cookies) {
        [cookieStorage deleteCookie:each];
    }
}

Я знаю, что это старый вопрос, но вот ответ. В настоящее время мы используем это с нашим приложением, чтобы очистить ВСЕ файлы cookie для UIWebView (очевидно, что он имеет доступ только к файлам cookie в вашем приложении, а не к совместным перекрестным приложениям).

Если вы хотите удалить только один раз, вы всегда можете проверить свойства каждого объекта cookie, решив, хотите ли вы его удалить или нет.

Надеюсь, это поможет кому-то там.