Не удалось удалить cookie с помощью файлов cookie с помощью AngularJS $

Мое веб-приложение создано таким образом, что, когда пользователь регистрируется на сервере, добавляется заголовок Set-Cookie для ответа, например:

Set-Cookie:JSESSIONID=1; Path=/myApp/; Secure

При выходе из системы я пытаюсь удалить этот файл cookie на клиенте (браузере), так как мне все равно, если сеанс был успешно уничтожен на сервере, пока файл cookie будет удален. Любые затяжные сеансы "призрак" время от времени будут очищаться на сервере.

Однако мое приложение не может удалить cookie JSESSIONID. Скажем, функция выхода была вызвана из https://test.myserver.com/myApp/app/index.html#/mySubPage, а функция выхода из системы:

delete $cookies["JSESSIONID"];
$location.path("/login");

Файл cookie не удаляется. Обновление списка файлов cookie на вкладке "Ресурсы" в Инструментах разработчика Chrome покажет, что оно все еще существует. Перезагрузка страницы входа и обновление списка файлов cookie на вкладке "Ресурсы" по-прежнему показывает файл cookie.

Почему я не могу удалить cookie из моего Javascript-клиента, если он не является HTTPOnly cookie? Это путь, который вызывает проблемы? Не должно быть, поскольку script работает на странице, включенной в путь к файлу cookie. Куки файлы на самом деле не так уж трудны, чтобы нормально справляться, поэтому я хорошо знаю, что может быть что-то тривиальное, что я здесь не замечаю, - но любая помощь была бы очень оценена.

UPDATE:

В моем оригинальном посте я указал неверный путь к моему приложению. Теперь он отредактирован, чтобы отразить правильный путь (ну, абстрактно). Оказывается, это была важная информация для вопроса. AngularJS использует полный относительный путь приложения как атрибут пути для всех файлов cookie, которые он создает/удаляет, поэтому, поскольку наш сервер установил куки файл с помощью пути /myApp/, и приложение было запущено на относительном пути /myApp/app, Angular пытался удалить прежний файл cookie, которого не существует (чтобы перезаписать или удалить существующий файл cookie, имя, домен и путь все должны быть идентичны тем, которые используются при создании файла cookie).

Ответы

Ответ 1

Я предполагаю, что вы должны проверить ответы с сервера - возможно, они включают поле заголовка "set cookie", которое устанавливает значение cookie.

Вот пример Plunker, который иллюстрирует, как вы можете добавлять/изменять/удалять/смотреть значение cookie (но без ответов на стороне сервера, которые могут изменять значения cookie).

Но, как правило, $cookie-объект является своего рода "прокси-объектом", который отслеживается двумя способами с помощью модуля AngularJS ngCookies и с одной стороны меняет его поля при изменении файлов cookie браузера (так что вы можете $watch for changes), но также и изменения отражаются в браузере реальных файлов cookie, поэтому вы можете изменить этот объект.

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

Ответ 2

Помните о домене cookie файла cookie, который вы хотите удалить. Если вы работаете с несколькими субдоменами (например, один для статических ресурсов, другой для api), ваша проблема может заключаться в том, что вы пытаетесь удалить файл cookie для неправильного домена.

Взгляните на свои файлы cookie с помощью своего инструмента разработчика браузера. Независимо от того, какой домен установлен для файла cookie, который вы хотите удалить, с которым вы столкнулись, укажите его в параметре options для метода remove.

$cookies.remove('JSESSIONID', {domain: 'domain.tld'});

СОВЕТ БЕЗОПАСНОСТИ: Удаление идентификатора сеанса с помощью Javascript не удаляет сеанс на сервере. Если ваши идентификаторы идентификаторов сеансов могут пострадать от фиксации сеанса. Было бы лучше удалить куки файл, вызвав конечную точку выхода в вашем API, которая полностью очистит сеанс на сервере, чтобы его нельзя было повторно использовать.

Ответ 3

Ответ, который вы дали в обновлении, кажется правильным: Angular $cookieStore может работать только с куки, значение пути которого совпадает с текущим путем.

Способ обмана заключается в использовании решения, заданного ajspera на этой проблеме:

<head>
  <base href="/">
</head>

Просто добавьте <base href="/"> в свой элемент заголовка HTML, и в этот момент он работает.

Альтернативное решение - установить путь к файлу cookie с помощью сервера, который его отправил. В Node.js Express, который выглядит как

res.cookie('specialCookie', 'special!', {path: '/myApp'});

Обратите внимание, что для меня кажется, что $cookieStore удаляет конечную косую черту, поэтому вам может понадобиться попробовать ее в обоих направлениях.