>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Cookies в Firefox 3 http://forum.mozilla-russia.org/viewtopic.php?id=23862 |
homo_nudus > 16-06-2008 01:52:56 |
Поддерживаю расширение (LiveJournal Addons), в котором многое построено на Ajax-запросах. С недавнего времени пользователи стали жаловаться на неполадки самого загадочного свойства. Расширение пользуется авторизацией на сервере через cookies. Тесты показали, что при обычном открытии страниц cookies работают. Но Ajax-запросы возвращают такие ответы, будто cookies не верны или их нет. Один из пользователей нашёл причину. В настройках третей версии Firefox добавилась новая опция на вкладке «Приватность»: «Принимать cookies со сторонних сайтов». Если галочка снята, расширение не работает правильно. Я проверил отсылаемые на сайт заголовки при помощи Live HTTP Headers. Оказалось, что при обычном открытии страниц браузер отсылает серверу cookies с авторизацией, а при Ajax-запросах — не отсылает, не воспринимая их как родные для LiveJournal. Не отсылаются вообще никакие cookies, заголовок просто отсутствует. Оказалось, что при запрете cookies со сторонних сайтов перестают работать и другие расширения (например, Google Reader Notifier, мониторящий известную rss-читалку через Ajax). Кто-нибудь знаете, в чём причина такой странности, какова природа этой опции и как бороться с нелогичными последствиями? |
Shutnik > 16-06-2008 03:30:20 |
можно вручную добавить в ajax-запрос заголовок с куками. |
homo_nudus > 16-06-2008 09:35:27 |
Shutnik пишет
А есть ли способ автоматически получить cookies, подходящие для запроса? Например, по location запрашиваемого документа? |
Shutnik > 16-06-2008 09:47:29 |
homo_nudus |
homo_nudus > 16-06-2008 14:57:41 |
Пример с MDC: Выделить код Код:var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); var uri = ios.newURI("http://www.livejournal.com/", null, null); var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService); var cookie = cookieSvc.getCookieString(uri, null); Почему-то в cookie оказывается только последнее cookie из шести, а этого не достаточно. Перечислители из интерфейса nsICookieManager работают только с указанием конкретных доменов разных уровней, а их автоматически не предскажешь. Поэтому проблема остаётся. |
Shutnik > 16-06-2008 15:24:45 |
homo_nudus |
homo_nudus > 16-06-2008 19:01:08 |
Shutnik пишет
В том то и дело что домен первого уровня совпадает у всех шести, у пяти совпадает домен полностью (к домену одной из них добавляется www). Но только последняя cookie включается в строку, получаемую из описанного алгоритма. |
Shutnik > 17-06-2008 11:48:22 |
homo_nudus |
homo_nudus > 17-06-2008 12:00:41 |
В списке cookies, относящихся к сайту, есть шесть куков, то есть шесть пар "заголовок - значение" (смотрел в "Настройки - показать cookies - livejournal.com"). В свойстве "домен" для первой стоит ".www.livejournal.com", для остальных пяти значится ".livejournal.com". При открытии страницы все они плюсуются и отсылаются серверу (смотрел в логах запроса при помощи Live HTTP Headers). При Ajax-запросах и запрете куков для посторонних сайтов ни один из куков не отправляется. При использовании nsICookieService, как описано выше, в результирующую строку попадает только последняя пара из шести. |
Unghost > 19-06-2008 21:55:50 |
homo_nudus > 20-06-2008 00:48:44 |
Да, очень похоже. Причём соотношение host и пути для GET одно и то же при XMLHttpRequest и при обычном запросе, а поведение разное. Спасибо за ссылку. Будем надеяться, что исправят. Насколько я понимаю, доступа к списку исключений из расширения нет, потому что он хранится в отдельном файле SQLite. Так что ничего, похоже, с этим не поделаешь, только пользователей предупреждать. |
Unghost > 20-06-2008 01:18:36 |
homo_nudus |
homo_nudus > 20-06-2008 01:57:26 |
А что для этого нужно? Аккаунт я там завёл, но не могу разобраться, как подтверждать. Vote? Или нужно откомментировать? |
Unghost > 22-06-2008 17:13:33 |
homo_nudus |
homo_nudus > 22-06-2008 18:14:46 |
Откомментировал, правда, с дурацкой ошибкой. Жаль, править комментарии нельзя. |