#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 — это полностью концепция на стороне клиента.