OAuth 2.0 имеет несколько рабочих процессов. У меня есть несколько вопросов относительно двух.
- Поток кода авторизации - пользователь входит в систему из клиентского приложения, сервер авторизации возвращает код авторизации в приложение. Затем приложение обменивает код авторизации на токен доступа.
- Поток неявного предоставления - пользователь входит в систему из клиентского приложения, сервер авторизации выдает токен доступа клиентскому приложению напрямую.
В чем разница между двумя подходами с точки зрения безопасности? Какой из них более безопасный и почему?
Я не вижу причины, по которой дополнительный шаг (код авторизации обмена для токена) добавляется в один рабочий процесс, когда сервер может напрямую выдать токен доступа.
Различные веб-сайты говорят, что поток кода авторизации используется, когда клиентское приложение может обеспечить безопасность учетных данных. Зачем?
Ответы:
Это
access_token
то, что вам нужно называть защищенным ресурсом (API). В потоке кода авторизации есть 2 шага для его получения:code
API потребителю (так называемый «Клиент»).code
полученным в # 1 наaccess_token
аутентификацию с помощьюclient_id
иclient_secret
access_token
.Итак, есть двойная проверка: пользователь, которому принадлежат ресурсы, обнаруженные через API, и клиент, использующий API (например, веб-приложение). Оба подтверждены для доступа, который будет предоставлен. Обратите внимание на «авторизацию» природы OAuth здесь: пользователь предоставляет доступ к своему ресурсу (через
code
возвращенный после аутентификации) приложению, приложение получаетaccess_token
и вызывает от имени пользователя.В неявном потоке шаг 2 опущен. Таким образом, после аутентификации пользователя,
access_token
возвращается непосредственно, что вы можете использовать для доступа к ресурсу. API не знает, кто вызывает этот API. Кто-нибудь сaccess_token
возможность, в то время как в предыдущем примере это было бы только веб-приложение (его внутренние компоненты обычно никому не доступны).Неявный поток обычно используется в сценариях, где хранение
client id
иclient secret
не рекомендуется (например, устройство, хотя многие все равно делают это). Вот что означает отказ от ответственности. Люди имеют доступ к клиентскому коду и поэтому могут получить учетные данные и притвориться, что стали клиентами ресурсов. В неявном потоке все данные изменчивы, и в приложении ничего не хранится.источник
/authorize
просьба. Браузер и веб-сайт пытаются вызвать API (он же клиент). Этоredirect_uri
+,code
возвращаемый AS после успешной аутентификации. Наконец, клиент вызова AS за кулисами, обмениваясьcode
дляaccess_token
. Этоtoken endpoint
в литературе. В общем, AS никогда никому не звонит. Это всегда отвечает.Я добавлю кое-что здесь, что, я думаю, не ясно из приведенных выше ответов:
Т.Л., д - р не использовать неявный поток , если вы не доверяете машине пользователей , чтобы держать лексемы , но вы делаете доверять свои собственные серверам.
источник
access_token
с помощьюauthorization code
.Разница между ними заключается в том, что:
В неявном потоке токен возвращается напрямую через URL-адрес перенаправления со знаком «#», который используется в основном в клиентах javascript или мобильных приложениях, у которых нет серверной стороны, и клиенту не нужно предоставлять свой секрет в некоторых реализациях. ,
В потоке кода авторизации код возвращается с "?" чтобы быть читаемым на стороне сервера, серверная сторона должна предоставить клиенту секрет на этот раз для URL токена, чтобы получить токен как объект json с сервера авторизации. Он используется в том случае, если у вас есть сервер приложений, который может обрабатывать это и хранить маркер пользователя с его / ее профилем в своей собственной системе, и в основном используется для обычных мобильных приложений.
так что это зависит от природы вашего клиентского приложения, какой еще более безопасный «код авторизации», поскольку он запрашивает секрет на клиенте и токен, может быть отправлен между сервером авторизации и клиентским приложением по очень защищенному соединению, а поставщик авторизации может ограничить использование некоторых клиентов только «кодом авторизации» и запретить неявное
источник
Неявное предоставление похоже на предоставление кода авторизации с двумя отличиями.
Он предназначен для использования клиентами на основе пользовательских агентов (например, одностраничными веб-приложениями), которые не могут хранить секрет клиента, поскольку весь код приложения и хранилище легко доступны.
Во-вторых, вместо сервера авторизации, возвращающего код авторизации, который обменивается на токен доступа, сервер авторизации возвращает токен доступа.
Подробности вы найдете здесь http://oauth2.thephpleague.com/authorization-server/which-grant/
источник
Неявный поток
преимущества
Недостатки
Поток кода авторизации
преимущества
Недостатки
Цитирование: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
источник
Позвольте мне суммировать моменты, которые я узнал из приведенных выше ответов, и добавить некоторые из моих собственных пониманий.
Поток кода авторизации !!!
Неявный поток грантов !!!
источник
Они оба безопасны, это зависит от среды, в которой вы их используете.
Это просто. Ваш клиент не защищен. Давайте посмотрим на это подробнее.
Предположим, что вы разрабатываете приложение против
Instagram API
, поэтому вы регистрируете приложениеInstagram
и определяете, какоеAPI's
вам нужно.Instagram
предоставит вамclient_id
иclient_secrect
На вашем веб-сайте вы создали ссылку, которая говорит. «Приходите и используйте мое приложение». При нажатии на это ваше веб-приложение должно сделать два звонка
Instagram API
.First
отправить запросInstagram Authentication Server
с указанными ниже параметрами.Вы не отправляете
client_secret
, Вы не можете доверять клиенту (Пользователь и / или его браузер, которые пытаются использовать ваше приложение). Клиент может увидеть url или java скрипт иclient_secrect
легко найти его . Вот почему вам нужен еще один шаг.Вы получаете
code
иstate
.code
Здесьtemporary
и не сохраняется где - либо.Затем вы
second
звонитеInstagram API
(с вашего сервера)Поскольку вызов сделан с нашего сервера, мы можем безопасно использовать
client_secret
(что показывает, как мы),code
что показывает, что пользователь выдалclient_id
право использовать ресурс.В ответ мы будем иметь
access_token
источник
С практической точки зрения (что я понял), основная причина наличия потока кода Authz:
«Сервер авторизации аутентифицирует владельца ресурса (через агента пользователя) и устанавливает, разрешает ли владелец ресурса запрос клиента на доступ»
Кроме того, используя токены обновления, приложения могут получить долгосрочный доступ к пользовательским данным.
источник
Кажется, есть два ключевых момента, которые пока не обсуждались, которые объясняют, почему обход в типе предоставления кода авторизации повышает безопасность.
Краткая история : Тип предоставления кода авторизации хранит конфиденциальную информацию из истории браузера, а передача токена зависит только от защиты HTTPS сервера авторизации.
Более длинная версия:
Далее я буду придерживаться терминологии OAuth 2, определенной в RFC (это краткое чтение): сервер ресурсов , клиент , сервер авторизации , владелец ресурса .
Представьте, что вы хотите, чтобы какое-то стороннее приложение (= клиент) получило доступ к определенным данным вашей учетной записи Google (= сервер ресурсов). Давайте просто предположим, что Google использует OAuth 2. Вы являетесь владельцем ресурса для учетной записи Google, но сейчас вы используете стороннее приложение.
Сначала клиент открывает браузер, чтобы отправить вас по защищенному URL-адресу сервера авторизации Google. Затем вы одобряете запрос на доступ, и сервер авторизации отправляет вас обратно на ранее заданный клиентом URL-адрес перенаправления с кодом авторизации в строке запроса. Теперь о двух ключевых моментах:
При использовании типа предоставления кода авторизации токен в итоге получается путем вызова от клиента к серверу авторизации, где безопасность передачи зависит только от сервера авторизации , а не от клиента.
источник