Сессия sfGuardPlugin: как использовать ее с помощью wget - или сопоставить SID с sfGuardUser - PullRequest
1 голос
/ 01 июля 2011

Недавно меня попросили добавить XML API в один из модулей Symfony в моем проекте. Я сделал это, и это работает хорошо. Для аутентификации мы используем sfGuardPlugin. Версия Symfony - 1.3.11. Использование Propel, а не Doctrine.

Последний запрос ко мне:

  1. Мы добавим Flash-игру на сайт.
  2. Flash выполнит запросы к API XML.
  3. Парень, который кодирует приложение Flash, говорит, что оно не делит куки с браузером.
  4. Мы хотим, чтобы Flash мог повторно использовать сеанс текущего пользователя, вошедшего в систему (мы не будем отображаться, даже если пользователь не вошел в систему).

Я попробовал это потенциальное решение: (взято из других статей SO и различных результатов поиска Google)

  1. Мне сказали, что сеанс Symfony находится в файле cookie symfony.
  2. Мне сказали, что если я скопирую это значение в другой клиент (в моем случае, wget) и выполню session_id("stolen_session_id"), я смогу продублировать сеанс, войти в систему того же пользователя и т. Д.
  3. Это оказалось неправильно. Скажем, у моего cookie-файла symfony было значение "blabla". Я сделал это: wget --post-data='session_id=blabla' X.X.X.X:NN/api/bla.xml -O-. Мой серверный PHP-код анализирует этот параметр POST и передает его в функцию session_id. Затем он сообщил в журналах, что session_id('blabla') возвращал 1. Однако при вызове $this->getUser()->getGuardUser() возвращается null.

Мне нужен способ сопоставить переданный session_id с действительным sfGuardUser. Или найти альтернативный способ повторного использования уже существующего сеанса.

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

Кстати, я вижу в своих инструментах Chrome dev, что файл cookie symfony имеет тип сеанса. Поэтому неудивительно, почему мой метод не работает, но я немного растерялся, как мне это сделать в Symfony, при использовании sfGuardPlugin.

Я понимаю, что это не один из наиболее информированных вопросов, но то же самое, мне просто нужна помощь.

Спасибо за ваше время.

(Димитар П.)

Упс, забыл упомянуть, какие куки я вижу на моем домене :

  • Symfony
  • sfRemember
  • __ UTMA
  • __ UTMB
  • __ utmc
  • __ utmz

Я предполагаю, что последние четыре для Google Analytics.

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

Вам потребуется какой-то способ указать, какой пользователь выполняет запрос (wget).А в сеансах PHP по умолчанию используется идентификатор сеанса.

Обычный способ сделать это - аутентификация на основе токенов.Наиболее распространенным способом достижения этого является OAuth, который имеет множество стандартных библиотек (как для Symfony, так и для ваших пользователей API).

Если вы единственный, кто использует этот API, вы также можете создатьпользовательский токен (случайная строка sha1) для каждого пользователя за сеанс (вы можете сохранить его где-нибудь в своей базе данных).Теперь вы должны создать что-то вроде `wget XXXX: NN / api / bla.xml? Token = asdfhdsfhf

0 голосов
/ 01 июля 2011

Я не хотел этого делать, но мне не удалось найти другие альтернативы:

$ wget --header='Cookie: symfony=blabla' X.X.X.X:NN/api/bla.xml -O-

Я хотел, чтобы мой XML API был REST, но, очевидно, Symfony не разрешает аутентифицированные запросы другим способом, кроме использования файлов cookie (и включение идентификатора сеанса, всегда включаемого в URL, не является опцией вообще ).

Тем не менее, если кто-то появится с полностью REST-альтернативой, я добавлю его / ее ответ.

...