Возврат контекста запроса после request.post - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть сервер A, который отправляет запрос POST на сервер B с помощью модуля запросов python (r = request.post(url=url)). Сервер B изменяет запрос и возвращает ответ с перенаправлением на URL. Я могу получить доступ к перенаправленному URL-адресу, выполнив redirect(r.url) на сервере А, но мне нужно передать измененный контекст запроса вместе с ним. Это возможно?

Сценарий: Сервер A работает на Python Flask.

r = requests.post(url='https://serverb.com/validateToken', data={'token':'abc'})
redirect(r.url)

Сервер B работает на Python Django.

def validateToken(request):
  # On successful validation
  request.session[key] = mapped_token_to_user_id
  redirect('/successfulToken') # On server B

При доступе к /successfulToken Сервер B проверяет, существует ли сеанс для объекта запроса, но из-за перенаправлений запрос является пустым.

1 Ответ

0 голосов
/ 13 ноября 2018

Сервер Django установит cookie для идентификации клиента, связанного с сеансом:

request.session[key] = mapped_token_to_user_id

См. Документацию Django :

Каркас сеанса позволяет вам хранить и извлекать произвольные данные для каждого посетителя сайта. Он хранит данные на стороне сервера и объявляет об отправке и получении файлов cookie. Файлы cookie содержат идентификатор сеанса [...]

Затем вы перенаправляете браузер, подключенный к серверу A, на URL-адрес, возвращенный с сервера B, но вы удаляете информацию о файлах cookie. Клиент, подключающийся к Серверу A, не имеет cookie, поэтому он не передает его на Сервер B.

и , если Сервер B не находится в том же домене, что и Сервер A , вы не можете передать этот файл cookie клиенту. Браузеры не будут отправлять файлы cookie, полученные с одного домена на другой; файлы cookie для stackoverflow.com не должны передаваться, скажем, google.com , это было бы очень большой проблемой безопасности, если бы они это сделали.

Таким образом, если сервер A и сервер B находятся в двух разных доменах (например, foo.bar.example для сервера A и spam.ham.example для сервера B), то у вас нет пути для передачи файла cookie клиенту при перенаправлении клиент-сервер B. В этом случае необходимо, чтобы сервер A напрямую подключался к новому URL-адресу сервера B, передавая файл cookie из ответа.

Если Сервер A и Сервер B совместно используют домен (foo.bar.example и spam.bar.example совместно используют .bar.example в качестве имени домена), то вы можете установить cookie для этого общего доменного имени (с префиксом . на имя), чтобы сообщить клиенту, что он может поделиться этим cookie со всеми серверами в одном доменном имени.

В любом случае вам нужно извлечь сессионный cookie; имя по умолчанию, используемое Джанго: sessionid:

session_cookie = r.cookies['sessionid']

Если вы собираетесь подключиться к новому URL-адресу с сервера A, вам необходимо добавить этот файл cookie в исходящий запрос (requests.get(url, cookies={'sessionid': session_cookie}).

Если вы собираетесь передать его клиенту при перенаправлении, установите его в ответе, прежде чем возвращать его:

response = redirect(r.url)
response.set_cookie('sessionid', session_cookie, domain='.bar.example')
return response
...