tl; dr: Это все из соображений безопасности.
OAuth 2.0 хотел соответствовать этим двум критериям:
- Вы хотите разрешить разработчикам использовать URI перенаправления не-HTTPS, потому что не у всех разработчиков есть сервер с поддержкой SSL, и если они делают это, он не всегда должным образом настроен (несамостоятельно подписанные, доверенные сертификаты SSL, часы синхронизированного сервера ...).
- Вы не хотите, чтобы хакеры могли украсть токены доступа / обновления, перехватывая запросы.
Подробности ниже:
Неявный поток возможен только в среде браузера по причинам безопасности:
В неявном потоке токен доступа передается непосредственно как хеш-фрагмент (не как параметр URL). Одна важная вещь о хеш-фрагменте состоит в том, что, как только вы перейдете по ссылке, содержащей хеш-фрагмент, только браузер узнает о хеш-фрагменте. Браузеры передадут фрагмент хеша непосредственно на целевую веб-страницу (URI перенаправления / веб-страница клиента). Хеш-фрагмент имеет следующие свойства:
- Они не являются частью HTTP-запроса, поэтому они не могут быть прочитаны серверами и поэтому не могут быть перехвачены промежуточными серверами / маршрутизаторами (это важно).
- Они существуют только в браузере - на стороне клиента - поэтому единственный способ прочитать фрагмент хеша - использовать JavaScript, который запускается на странице.
Это позволяет передавать токен доступа непосредственно клиенту без риска его перехвата промежуточным сервером. Это означает, что клиент может использовать только клиентскую часть, и для использования токена доступа требуется JavaScript.
Неявный поток также имеет проблемы безопасности, которые требуют дополнительной логики для обхода / исключения, например:
- Злоумышленник может получить токен доступа от пользователя на другом веб-сайте / в приложении (скажем, если он является владельцем другого веб-сайта / приложения), зарегистрировать токен на своем веб-сайте, а затем передать его в качестве параметра URL-адреса на своем веб-сайте. поэтому выдает себя за пользователя на вашем сайте. Чтобы избежать этого, вам нужно проверить идентификатор клиента, связанный с токеном доступа (например, для Google вы можете использовать конечную точку tokeninfo), чтобы убедиться, что токен был выдан с вашим собственным идентификатором клиента (т.е. вашим собственным приложением) или проверить подпись если вы используете IDToken (но для этого требуется секрет вашего клиента).
- Если запрос на аутентификацию не был получен из вашего собственного свойства (так называемые атаки фиксации сеанса), во избежание этого вы захотите сгенерировать случайный хеш на своем веб-сайте, сохраните его в файле cookie и передайте тот же хеш в параметре URL состояния запрос на аутентификацию, когда пользователь возвращается, вы проверяете параметр состояния с помощью cookie, и он должен совпадать.
В потоке кода авторизации невозможно передать токен доступа непосредственно в параметре URL, поскольку параметры URL являются частью HTTP-запроса, поэтому любой промежуточный сервер / маршрутизаторы, по которым ваш запрос будет проходить (может быть сотнями), смогут прочитайте маркер доступа, если вы не используете шифрованное соединение (HTTPS), разрешающее так называемые атаки «человек посередине».
Передача токена доступа непосредственно в параметре URL теоретически возможна, но сервер аутентификации должен был бы убедиться, что URI перенаправления использует HTTPS с шифрованием TLS и «доверенный» сертификат SSL (как правило, от несвободного центра сертификации) чтобы убедиться, что целевой сервер является законным и что HTTP-запрос полностью зашифрован. Если все разработчики приобретут SSL-сертификат и правильно настроят SSL в своем домене, это будет огромной проблемой и значительно замедлит их внедрение. Вот почему предоставляется промежуточный одноразовый «код авторизации», который сможет обмениваться только законный получатель (потому что вам нужен секрет клиента), и что этот код будет бесполезен для потенциальных хакеров, перехватывающих запросы по незашифрованным транзакциям (потому что они не
Вы также можете утверждать, что неявный поток менее безопасен, есть потенциальные векторы атаки, такие как подмена домена при перенаправлении - например, путем перехвата IP-адреса веб-сайта клиента. Это одна из причин, по которой неявный поток предоставляет только токены доступа (которые должны иметь ограниченное время использования) и никогда не обновляет токены (которые не ограничены по времени). Чтобы устранить эту проблему, я советую размещать веб-страницы на сервере с поддержкой HTTPS, когда это возможно.