Какова цель кода авторизации в OAuth? - PullRequest
0 голосов
/ 01 января 2019

В oauth вы делаете запрос, используя свой идентификатор клиента / секрет, чтобы получить код авторизации.Затем вы делаете второй запрос на обмен кода авторизации на токен доступа.Мой вопрос:

Почему этот двухэтапный процесс необходим вместо получения токена доступа?Как это делает весь процесс более безопасным?Или есть другая причина.

Я говорю о серверном приложении (например, php), запрашивающем авторизацию с удаленного сервера, а не javascript.

Ответы [ 3 ]

0 голосов
/ 02 января 2019

В oauth вы делаете запрос, используя свой идентификатор клиента / секрет, чтобы получить код авторизации.

Запрос кода авторизации не содержит секрет клиента.Он содержит только идентификатор клиента и URL-адрес перенаправления, которые позволяют серверу авторизации проверять запрос, исходящий от известного клиента.

Что требуется для этого двухэтапного процесса вместо получения токена доступа в первую очередь?Как это делает весь процесс более безопасным?Или есть другая причина.

Если мы забудем о неявном потоке, который включает в себя получение токена доступа из первого вызова, я бы сказал, что это повышает безопасность.

Когда используется поток кода авторизации, вы используете пользовательский агент (браузер) для запуска потока.Это означает, что пользовательский агент будет перенаправлять конечного пользователя на сервер авторизации для аутентификации (получение пароля пользователя и проверка конечного пользователя).Если проверка конечного пользователя прошла успешно, сервер авторизации отправляет код авторизации.Это временный секрет, связанный с исходным запросом кода авторизации.

Теперь клиент использует код авторизации и напрямую обращается к серверу авторизации для получения токенов доступа (и других).Этот второй шаг происходит за пределами пользовательского агента.

Если клиент является конфиденциальным клиентом, клиентом, который имеет идентификатор клиента, а также секрет клиента, этот второй вызов потребует создания этого секрета клиента.Так что он внутренне содержит процесс проверки клиента.С точки зрения сервера авторизации, запрос токена будет отклонен, если аутентификация клиента не удалась.Это дает защиту для кражи кода авторизации.

Кроме того, на втором этапе мы избегаем доступа к токену доступа третьей стороне.Например, в неявном потоке токен доступа отправляется в виде фрагментов URL через пользовательский агент.Если пользовательский агент скомпрометирован (например: - Управляется каким-либо вредоносным кодом), этот маркер доступа может быть извлечен.

А как насчет публичных клиентов?Это означает, что клиенты, которые не получают секрет клиента из-за их характера (например: - клиенты, которые не могут защитить секрет путем хранения)

публичные клиенты используют PKCE .Это необходимо использовать, чтобы избежать кражи кода авторизации.Таким образом, в запросе токена (второй вызов) клиент будет напрямую отправлять верификатор кода.Пользовательский агент не может получить верификатор кода в первом запросе, поскольку он был хеширован (вызов кода).Таким образом, запрос токена теперь содержит секрет, который известен только клиенту и серверу авторизации.

Если вы сравните оба сценария (общедоступный и конфиденциальный клиенты), вы увидите, как второй вызов добавляет дополнительный уровень безопасности.

0 голосов
/ 04 января 2019

Более безопасно ... Или меньше?Зависит от того, как это применяется.

Посмотрите: https://auth0.com/docs/api-auth/which-oauth-flow-to-use

Вы заметите, что поток кода аутентификации используется, когда он используется на стороне сервера.Также обратите внимание, что при запросе кода авторизации URL-адрес ответа содержит строку запроса со знаком вопроса: https://example -app.com / redirect? Code = g0ZGZmNjVmOWI & state = dkZmYxMzE2

Когдаиспользуя спа, вы будете использовать имплицитный поток.Обратите внимание, что маркер доступа отправляется через якорь (#) в URL https://example -app.com / redirect # access_token = MyMzFjNTk2NTk4ZTYyZGI3

Значение якоря никогда не будет отправлено на сервер,Это будет доступно только клиенту в спа-салоне.Сервер никогда не сможет увидеть токен доступа.

Когда серверное приложение получает перенаправление, оно должно быть в состоянии прочитать его.Это возможно, потому что в URL вместо знака # стоит знак вопроса.Если он отправит токен напрямую, клиент сможет увидеть токен доступа в своей истории браузера или через фиддлер.

0 голосов
/ 01 января 2019

Это можно сделать с помощью одного запроса - тогда он называется неявным потоком .Существует один запрос с response_type, установленным на token или id_token token.

. Общая идея использования кода доступа (потока авторизации) вместо прямой выдачи токенов состоит в том, чтобы скрыть их от конечного пользователя.,Второй запрос обычно выполняется внутренним сервером, а не браузером.

Более подробную информацию вы можете найти здесь: https://auth0.com/docs/api-auth/which-oauth-flow-to-use

...