Передача HTTP-сессии для стороннего сайта с сервера на клиент - PullRequest
0 голосов
/ 09 февраля 2012

Допустим, мое веб-приложение действует от имени пользователей, которые передают свои учетные данные моему приложению, чтобы приложение могло выполнять вызовы API сторонней службе. Кстати, это для публикации предложений продуктов на сторонних сайтах (немного похоже на eBay, но в меньшем масштабе).

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

Однако это не документированный способ сделать это. Более того, он не работает так просто, как заполнение полей формы из параметров запроса (GET или POST). Веб-форма просто не работает таким образом.

Может быть альтернатива. Мое приложение может открыть сеанс со сторонним приложением от имени пользователя, отправить все данные, чтобы они были сохранены в его базе данных, а затем отправить браузеру пользователя все данные, необходимые для принятия сеанса, который мое серверное приложение открыло на своем компьютере. от имени. Обратите внимание, что я еще не пробовал это; и я считаю, что это может произойти сбой, если стороннее приложение привязывает сеанс к IP-номеру (что может сделать приложение, независимо от того, будет ли оно звуковым или нет).

Но было бы невозможно, чтобы серверная программа, открывающая сеанс HTTP, записывала всю информацию, необходимую для принятия этого сеанса, в документ HTML / Javascript и отправляла этот документ в браузер пользователя, где Javascript исполняется и собирается запрос, например, составленный при использовании браузера в сторонней форме напрямую, который я наблюдаю при использовании HttpFox?

Вся информация, это все HTTP; Очевидно, что невозможно передать IP-адрес сервера клиенту ... Но все файлы cookie и параметры. Javascript, выполняемый в браузере, должен будет затем использовать информацию, которую я каким-то образом передаю в документе (вероятно, в части скрипта), чтобы составить запрос к стороннему веб-сайту, который идет прямо в сеанс, открытый серверным приложением. , Это будет означать, что документ, исходящий из моего домена, установит куки (добавить заголовки запроса), чтобы браузер пользователя мог выполнить этот запрос.

Итак, другими словами, технически возможно передать сеанс с сервера клиенту?

Как бы вы сделали это в Javascript?

Обновление

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

Пока не сдаюсь. Там есть объект XmlHttpRequest. Может быть, этим можно злоупотреблять в моих злых целях?

Второе обновление

Итак, я экспериментировал с XmlHttpRequest. Плохие новости (для меня и этого конкретного случая): похоже, он не будет работать с использованием XmlHttpRequest, потому что (с использованием текущего Firefox) мои красиво подделанные запросы переписываются в соответствии с тем, что, как представляется, должно стать W3C стандарт для общего доступа к ресурсам , поэтому заголовок Cookie просто удаляется, а фиктивные заголовки Moin и Gurke уменьшаются до Access-Control-Request-Headers: gurke,moin. Откровенно говоря, это портит игру большое время . Я разочарован.

1 Ответ

0 голосов
/ 10 февраля 2012

Хорошо, сдавайся. То, что я хочу сделать, не возможно. Причиной этого является так называемая политика того же происхождения , которая делает браузеры более безопасными. См. этот другой ответ для некоторых указателей. И, похоже, я ошибся в своей оценке рабочего проекта W3C по Распределению ресурсов между источниками , в котором допускаются исключения из политики того же происхождения. Так что, если бы это было широко реализовано, это могло бы быть жизнеспособным. Но в целом в этой попытке слишком много случаев и неопределенностей.

Хех. Получил это работает. :)

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

<body onload="document.forms[0].submit()">
<form action="..." method="post">
...

Затем клиент входит в свой собственный сеанс. Работает отлично. Пока они не меняют интерфейс. Я настроил тесты, чтобы отслеживать их форму и предупреждать меня о необходимости действий, которые они изменяют несовместимыми способами.

...