С потоком «неявного» клиент (вероятно, браузер) получит токен доступа после того, как владелец ресурса (то есть пользователь) предоставил доступ.
Однако с потоком «Код авторизации» клиент (обычно веб-сервер) получает код авторизации только после того, как владелец ресурса (то есть пользователь) предоставил доступ. С этим кодом авторизации клиент затем делает еще один вызов API, передавая client_id и client_secret вместе с кодом авторизации, чтобы получить токен доступа. Все хорошо описано здесь .
Оба потока имеют одинаковый результат: токен доступа. Однако «неявный» поток намного проще.
Вопрос: зачем беспокоиться о потоке «Код авторизации», когда «неявные» швы потока должны быть хорошими? Почему бы не использовать "Implicit" для веб-сервера?
Это больше работы как для поставщика, так и для клиента.
источник
Ответы:
tl; dr: Это все из соображений безопасности.
OAuth 2.0 хотел соответствовать этим двум критериям:
Подробности ниже:
Неявный поток возможен только в среде браузера по причинам безопасности:
В неявном потоке токен доступа передается непосредственно как хеш-фрагмент (не как параметр URL). Одна важная вещь о хеш-фрагменте состоит в том, что, как только вы перейдете по ссылке, содержащей хеш-фрагмент, только браузер узнает о хеш-фрагменте. Браузеры передадут фрагмент хеша непосредственно на целевую веб-страницу (URI перенаправления / веб-страница клиента). Хеш-фрагмент имеет следующие свойства:
Это позволяет передавать токен доступа непосредственно клиенту без риска его перехвата промежуточным сервером. Это означает, что клиент может использовать только клиентскую часть, и для использования токена доступа требуется JavaScript.
Неявный поток также имеет проблемы безопасности, которые требуют дополнительной логики для обхода / исключения, например:
В потоке кода авторизации невозможно передать токен доступа непосредственно в параметре URL, поскольку параметры URL являются частью HTTP-запроса, поэтому любой промежуточный сервер / маршрутизаторы, по которым ваш запрос будет проходить (может быть сотнями), смогут прочитайте маркер доступа, если вы не используете шифрованное соединение (HTTPS), разрешающее так называемые атаки «человек посередине».
Передача токена доступа непосредственно в параметре URL теоретически возможна, но сервер аутентификации должен был бы убедиться, что URI перенаправления использует HTTPS с шифрованием TLS и «доверенный» сертификат SSL (как правило, от несвободного центра сертификации) чтобы убедиться, что целевой сервер является законным и что HTTP-запрос полностью зашифрован. Если все разработчики приобретут SSL-сертификат и правильно настроят SSL в своем домене, это будет огромной проблемой и значительно замедлит их внедрение. Вот почему предоставляется промежуточный одноразовый «код авторизации», который сможет обмениваться только законный получатель (потому что вам нужен секрет клиента), и что этот код будет бесполезен для потенциальных хакеров, перехватывающих запросы по незашифрованным транзакциям (потому что они не
Вы также можете утверждать, что неявный поток менее безопасен, есть потенциальные векторы атаки, такие как подмена домена при перенаправлении - например, путем перехвата IP-адреса веб-сайта клиента. Это одна из причин, по которой неявный поток предоставляет только токены доступа (которые должны иметь ограниченное время использования) и никогда не обновляет токены (которые не ограничены по времени). Чтобы устранить эту проблему, я советую размещать веб-страницы на сервере с поддержкой HTTPS, когда это возможно.
источник
Auth Code
потенциально отправляется в незашифрованном виде по HTTP. НоAuth Code
бесполезно без идентификатора клиента / секрета. По сути, смысл потока OAuth-кода заключается в том, что бремя наличия сервера с поддержкой SSL лежит на провайдере OAuth (Google / Facebook и т. Д.), А не на пользователях API (вы, я).Неявная Flow делает весь поток довольно легко, но и менее безопасной .
Поскольку клиентское приложение, обычно выполняемое в браузере на JavaScript, менее надежно, токены обновления для долговременного доступа не возвращаются.
Этот поток следует использовать для приложений, которым требуется временный доступ (несколько часов) к данным пользователя.
Возврат токена доступа клиентам JavaScript также означает, что вашему браузерному приложению необходимо уделить особое внимание - подумайте о XSS-атаках, которые могут привести к утечке токена доступа в другие системы.
https://labs.hybris.com/2012/06/05/oauth2-the-implicit-flow-aka-as-the-client-side-flow
источник
Из спецификации OAuth :
Итак, что мы можем рассмотреть:
Это для публичного OAuth, т.е. когда клиент не нуждается в регистрации и не имеет своих собственных клиентских секретов. Но какой сервер аутентификации проверяет URL перенаправления, и этого на самом деле достаточно для безопасности.
Токен доступа появляется в адресной строке браузера, поэтому пользователь может скопировать URL-адрес и отправить его кому-то еще, и он также регистрируется как пользователь, т.е. это что-то вроде фиксации сеанса. Но браузер делает дополнительный редирект с заменой истории, чтобы удалить хеш-фрагмент из URL. Хакер также может украсть токен доступа, прослушивая HTTP-трафик, но это легко защитить с помощью HTTPS. Некоторые вредоносные браузерные расширения могут иметь доступ к URL-адресам из адресной строки, но в конечном итоге это плохая ситуация, как, например, неработающий сертификат HTTPS. И даже поток кода Auth не может помочь здесь, эфир. Итак, я вижу, что передача токена доступа через хеш-фрагмент URL-адреса абсолютно безопасна.
Разделение токена эфемерного доступа и токена обновления бесполезно при использовании HTTPS и, честно говоря, не очень полезно даже для необработанного HTTP. Но тот факт, что клиент через неявный поток не может получить токен обновления, также не имеет смысла.
Таким образом, я думаю, что мы должны ввести новый поток грантов «безопасный неявный», который работает строго по https, позволяет обновлять токен (или мы должны вообще избавиться от них) и предпочтительнее, чем поток грантов Auth Cose
источник
Для нас наши клиенты хотели иметь возможность проходить аутентификацию с нашим приложением на своих телефонах один раз, и им не нужно было снова входить в систему неделями. С потоком кода вы получаете токен обновления вместе с токеном доступа. Неявный поток не дает вам токен обновления. Токен доступа имеет относительно короткий срок действия, но токены обновления могут иметь срок действия до 90 дней. Всякий раз, когда срок действия маркера доступа истекает, код клиента и сервера может использовать этот токен обновления для получения нового токена доступа и токена обновления, все за кулисами, без какого-либо вмешательства пользователя. Токен обновления можно использовать только один раз. Вы не можете сделать это с неявным потоком. Если вы используете Implicit Flow, и ваш пользователь не взаимодействует с вашим приложением более часа, ему придется снова войти в систему, когда они вернутся. Это не было приемлемо в нашем случае использования,
Это работает и безопасно, потому что токены обновления могут быть отозваны. Если клиент говорит, что потерял свой телефон, ноутбук или хакер попал на рабочий стол, мы можем просто отозвать все токены обновления для этого пользователя. В течение всего процесса никакая личная информация никогда не затрагивает наш код, а именно пароль пользователя.
Поток кода потрясающий, но он требует больше работы. В настоящее время у MS нет библиотеки Angular для ее обработки, поэтому мне пришлось написать ее. Если вам интересно, я могу помочь вам с этим.
источник
Мой ответ: вы не можете безопасно и просто внедрить неявный поток с сервером веб-приложений.
Процесс авторизации веб-приложения включает взаимодействие с пользователем, поэтому сервер аутентификации должен перенаправить браузер пользователя обратно на целевую страницу веб-приложения после аутентификации и согласия пользователя (я не вижу другого способа вернуть пользователя в веб-приложение после некоторого взаимодействия с Сервер аутентификации).
То есть токен должен быть передан в веб-приложение с помощью URL перенаправления, верно?
Как объяснил @NicolasGarnier в своем ответе и комментариях, нет способа передать токен как фрагмент URL - он не достигнет сервера веб-приложений.
И передача токена в качестве параметра URL-адреса URL-адреса перенаправления была бы небезопасной даже при HTTPS: если целевая страница (пусть это будет «приветственная страница») содержит ресурсы (изображения, сценарии и т. Д.), Эти ресурсы будут получены браузером через серию запросов HTTP (S) (каждый из которых имеет
Referer
заголовок HTTP, содержащий точный URL «страницы приветствия», включая параметры URL). Так токен может просочиться.Таким образом, кажется, нет способа передать токен в URL перенаправления. Вот почему вам нужен второй вызов (либо с сервера аутентификации на клиент (но по какому URL?), Либо с клиента на сервер аутентификации (второй вызов в потоке кода авторизации))
источник