Почему существует поток " код авторизации "в OAuth2, когда" неявный " поток работает так хорошо?
с" неявным " потоком клиент (вероятно, браузер) получит маркер доступа после того, как владелец ресурса (т. е. пользователь) предоставил доступ.
с потоком "код авторизации", однако, клиент (обычно веб-сервер) получает код авторизации только после того, как владелец ресурса (т. е. пользователь) предоставил доступ. С этим кодом авторизации клиент затем делает еще один вызов API, передавая client_id и client_secret вместе с кодом авторизации для получения маркер доступа. все хорошо описано здесь.
оба потока имеют один и тот же результат: маркер доступа. Однако "неявный" поток гораздо проще.
вопрос: зачем беспокоиться о потоке "код авторизации", когда" неявные " швы потока должны быть в порядке? Почему бы также не использовать "неявный" для веб-сервера?
Это больше работы как для провайдера, так и для клиента.
3 ответов:
tl; dr: Это все из соображений безопасности.
OAuth 2.0 хотел соответствовать этим двум критериям:
- вы хотите разрешить разработчикам использовать не HTTPS redirect URI, потому что не у всех разработчиков есть сервер с поддержкой SSL, и если они это делают, он не всегда правильно настроен (не самозаверяющие, доверенные сертификаты SSL, синхронизированные часы сервера...).
- вы не хотите, чтобы хакеры могли украсть токены доступа / обновления путем перехвата запросы.
детали ниже:
неявный поток возможен только в среде браузера из соображений безопасности:
на неявный поток маркер доступа передается непосредственно как хэш-фрагмент (не как параметр URL). Одна важная вещь о хэш-фрагменте заключается в том, что, как только вы перейдете по ссылке, содержащей хэш-фрагмент, только браузер знает о хэш-фрагменте. Браузеры передадут хэш-фрагмент непосредственно на целевую веб-страницу (URI перенаправления / веб-страница клиента). Хэш-фрагмент имеет следующие свойства:
- они не являются частью HTTP-запроса, поэтому они не могут быть прочитаны серверами и из-за этого они не могут быть перехвачены промежуточными серверами/маршрутизаторами (это важно).
- они существуют только на стороне браузера-клиента-поэтому единственный способ прочитать хэш-фрагмент-использовать JavaScript, который работает на страница.
Это позволяет передавать токен доступа непосредственно клиенту без риска его перехвата промежуточным сервером. Это имеет оговорку о том, что это возможно только на стороне клиента и требует запуска javascript на стороне клиента для использования маркера доступа.
на авторизация поток код невозможно передать маркер доступа непосредственно в параметре URL, поскольку параметры URL являются частью HTTP-запроса, поэтому любые промежуточный сервер / маршрутизаторы, с помощью которых ваш запрос будет проходить (может быть сотни), может быть в состоянии прочитать маркер доступа, если вы не используете En зашифрованное соединение (HTTPS), позволяющее то, что известно как атаки "человек в середине".
передача маркера доступа непосредственно в URL param теоретически может быть возможна, но auth sever должен будет убедиться, что URI перенаправления использует HTTPS с шифрованием TLS и "доверенным" сертификатом SSL (обычно от центра сертификации, который не является бесплатно), чтобы убедиться, что целевой сервер является законным и что HTTP-запрос полностью зашифрован. Если бы все разработчики приобрели сертификат SSL и правильно настроили SSL на своем домене, это было бы огромной болью и значительно замедлило бы принятие. Вот почему посредник одноразового использования "код авторизации" при условии, что только законный получатель сможет обмениваться (потому что вам нужен секрет клиента) и что код будет бесполезен для потенциальных хакеров перехват запросов по незашифрованным транзакциям (потому что они не знают секрет клиента).
вы также можете утверждать, что неявный поток менее безопасен, есть потенциальные векторы атаки, такие как спуфинг домена при перенаправлении - например, путем захвата IP-адреса веб-сайта клиента. Это одна из причин, почему неявный поток предоставляет только маркеры доступа (которые, как предполагается, имеют ограниченное использование времени) и никогда не обновляют маркеры (которые не ограничены во времени). Чтобы устранить эту проблему, я советую вам размещать свои веб-страницы на сервере с поддержкой HTTPS, когда это возможно.
The неявный поток делает весь поток довольно легким, но и менее безопасным.
Поскольку клиентское приложение, которое обычно является JavaScript, работающим в браузере, менее доверено, никакие токены обновления для долгосрочного доступа не возвращаются.
Этот поток следует использовать для приложений, которым требуется временный доступ (несколько часов) к данным пользователя.
Возврат маркера доступа к клиентам JavaScript также означает, что ваше браузерное приложение должно принимать специальные care-подумайте об атаках XSS, которые могут привести к утечке маркера доступа в другие системы.https://labs.hybris.com/2012/06/05/oauth2-the-implicit-flow-aka-as-the-client-side-flow
из пункта 4.2 OAuth spec:
неявный тип гранта используется для получения маркеров доступа (он не поддерживает выдачу маркеров обновления) и оптимизирован для публичных клиентов, которые, как известно, работают с определенным URI перенаправления. Эти клиенты обычно реализуются в браузере с использованием языка сценариев, такого как JavaScript.
в качестве потока на основе перенаправления клиент должен быть способен взаимодействовать с агентом пользователя владельца ресурса (как правило, веб-браузер) и способен получать входящие запросы (через перенаправление) с сервера авторизации.
В отличие от типа предоставления кода авторизации, в котором клиент делает отдельные запросы на авторизацию и маркер доступа, клиент получает маркер доступа в результате запроса авторизации.
неявный тип Гранта не включает проверку подлинности клиента и зависит от наличия владельца ресурса и регистрации клиента. URI перенаправления. Поскольку маркер доступа кодируется в URI перенаправления, он может быть предоставлен владельцу ресурса и другим приложениям, находящимся на том же устройстве.
Так что мы можем сделать вывод:
Это для публичного OAuth т. е. когда клиент не должен быть зарегистрирован и не имеет собственных секретов клиента. Но какой сервер аутентификации проверяет url перенаправления, и этого на самом деле достаточно для безопасности.
маркер доступа происходит в адресной строке браузера, поэтому пользователь может скопировать url-адрес и отправить кому-то еще, а также войти в систему как пользователь, т. е. это что-то вроде фиксации сеанса. Но браузер делает дополнительный редирект с заменой истории, чтобы удалить хэш-фрагмент из url. Также хакер может украсть маркер доступа, обнюхав HTTP-трафик, но это может быть легко защищено HTTPS. Некоторые вредоносные расширения браузера могут иметь доступ к URL-адреса из адресной строки, но это в конечном счете плохо ситуация, как сломанный сертификат HTTPS. И даже поток кода Auth не может помочь здесь эфиру. Так что я вижу, что передача маркера доступа через хэш-фрагмент url абсолютно безопасна.
разделение эфемерного токена доступа и токена обновления бесполезно при использовании HTTPS и, честно говоря, не так полезно даже на необработанном HTTP. Но тот факт, что клиент через неявный поток не может получить токен обновления, также является нонсенсом.
таким образом, я думаю, что мы должны представьте Новый Поток грантов "безопасный неявный", который работает строго по https, позволяет обновить токен (или мы должны избавиться от них вообще) и предпочтительнее, чем Поток грантов Auth Cose
Comments