после потери фрагмента перенаправления OAuth

#api #authentication #oauth #oauth-2.0 #shiro

#API #аутентификация #oauth #oauth-2.0 #широ

Вопрос:

У меня есть веб-среда, в которой я получаю доступ к своим ресурсам с помощью фрагментов. (например foo.com/#/my_resource ).

Я пытаюсь добавить аутентификацию с использованием OAuth 2 на свой сервер. И я использую фреймворк Shiro с pac4j. Проблема, с которой я столкнулся, заключается в том, что после того, как я вхожу в систему провайдера, браузер теряет мой хэш, поэтому я перенаправляюсь на foo.com / вместо foo.com/#/my_resource .

Подумал, что это может быть распространенной проблемой. Существуют ли какие-либо обходные пути для этого? Ожидается ли такое поведение?

Спасибо!

Ответ №1:

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

Кроме того, из вашего вопроса не совсем ясно, но если вы имеете в виду, что используете this в качестве redirect_uri параметра в запросе OAuth 2, спецификация явно запрещает использование фрагмента в значении.

Комментарии:

1. Я не отправляю фрагмент в параметре redirect_uri, и я обрабатываю OAuth на стороне сервера. Таким образом, перенаправления на самом деле вообще не знают о хэше, как вы сказали. Но браузер сохраняет хэш во время перенаправления, насколько я знаю. По крайней мере, фрагмент все еще присутствует в браузере, когда я перенаправляюсь на страницу входа в систему поставщика OAuth. Но после входа в систему я снова перенаправляюсь на свой домен, но фрагмент теряется.

2. Перенаправление сообщает браузеру перейти в совершенно другое местоположение, отправленное сервером. Почему вы ожидаете, что он сохранит фрагмент, если сервер не знает, что это было? Если вы отлаживаете запросы и ответы вашего браузера (например, с помощью firebug или chrome), должно быть очевидно, что происходит.

3. Я думаю, вы используете неправильный рабочий процесс OAuth. Фрагменты используются в сценарии «неявного предоставления» с клиентами javascript. В любом случае Fragment — это полностью концепция на стороне клиента.