Букмарклет не отправляет целевые куки с формой POST - PullRequest
0 голосов
/ 11 июля 2019

РЕДАКТИРОВАТЬ: предыдущее название этого выпуска было Bookmarklets и аутентификации Django , но теперь я думаю, что использование платформы Django не имеет значения.

Я разработал 2 букмарклета для доступа к 2 различным веб-сервисам через своего рода «шлюз» или «прокси». Поскольку они адресованы зарегистрированным пользователям обучающей платформы на основе Django, я стараюсь ограничить доступ пользователей, прошедших аутентификацию на указанной платформе, и нажимаю на закладки на вкладке того же окна браузера. В первом из 2 букмарклетов, который отправляет запрос GET, этот прием работает, а в другом, который отправляет запрос POST, он не выполняется.

Bookmarklet 1. OK

(по мотивам букмарклета xAPI) В простейшем случае пользователь, перемещаясь по сети, хочет заявить, что он увидел (и нашел интересным) веб-страницу. Когда он / она нажимает кнопку букмарклета, код javascript собирает некоторую информацию и отправляет ее в «представление» платформы Django в виде данных в кодировке URL внутри строки запроса GET HTTP-запроса . Django проверяет, что пользователь прошел проверку подлинности, и отправляет инструкцию xAPI в xAPI LRS (хранилище записей обучения), которому он владеет учетными данными.

Bookmarklet 2. НЕ ОК

Пользователь при навигации в Интернете хочет попросить специализированное веб-приложение выполнить какой-либо текстовый анализ содержимого веб-страницы или фрагмента текста в ней. Код javascript собирает некоторую «полезную нагрузку», но в этом случае он имитирует представление данных из формы HTML (метод POST) в представление Django, где CSRF (подделка межсайтовых запросов) механизм защиты отключен, и после проверки подлинности пользователя он должен перенаправить HTTP-запрос POST в приложение для анализа текста с перенаправлением (Django HttpResponseTeoraryRedirect). В этом случае, хотя пользователь вошел в систему с другой вкладки того же окна браузера, Django не распознает пользователя как аутентифицированного, если URL-адрес исходной страницы имеет домен, отличный от домена Django. платформы.

Есть идеи?

EDIT:

Я протестировал 2 букмарклета с Chrome 75.0.3770.100 и FireFox 68.0.

После некоторого изменения кода Javascript, я почти уверен, что проблема лежит вверх по течению (внутри Bookmarklet 2), и это не имеет прямого отношения к Django; код сервера только обнаруживает проблему и отправляет ответ 403 (запрещено), если он не может распознать аутентификацию пользователя. Я подозреваю, что такая же проблема может возникнуть в расширениях браузера.

Похоже, что только когда Bookmarklet 2 выполняется со страницы, URL-адрес которой имеет тот же домен, что и целевой URL-адрес, метод отправки формы отправляет целевые файлы cookie вместе с запросом POST. Как уже отмечалось, подобная проблема не возникает в Bookmarklet 1.

Код букмарклета 1.

javascript:location.href='https://cs.up2university.eu/report_pageview/?url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title);void 0

Упрощенный код Bookmarklet 2.

javascript:var url="https://cs.up2university.eu/text_analyzer/",payload={url:location.href,title:document.title,noframe:!0};f=document.createElement("form");f.action=url;f.method="POST";f.target="_blank";for(var key in payload){var i=document.createElement("input");i.type="hidden",i.name=key,i.value=payload[key],f.appendChild(i)}document.body.appendChild(f),f.submit();

Из кода вида Джанго:

@csrf_exempt def text_analyzer(request): user = request.user if not user.is_authenticated: return HttpResponseForbidden() if request.method == 'POST': return HttpResponseTemporaryRedirect(settings.NLP_URL)

...