В этой статье рассказывается о наиболее распространенном методе обмена токенов в потоке OpenID Connect: грантах.
[гранты] .
Обещаем, что путешествие будет увлекательным, поэтому располагайтесь поудобнее.
Интерлюдия
Время от времени мы все сталкиваемся с ситуациями, когда нам приходится подтверждать свою личность, например, при оплате счетов, покупке билетов на самолет или даже при посещении ночных клубов.Обычно это не проблема – паспорт есть у каждого.
Получается, что власти страны, выдавшей паспорт, подтверждают личность получившего его гражданина.
Токен — аналог паспорта в Интернете.
Он содержит:
- информация о пользователе;
- подпись эмитента;
- период действия.
Этот протокол основан на Спецификации OAuth2 и выступает сетевым аналогом паспорта со всеми необходимыми подписями, которые запрашивают соответствующие проверяющие службы (также известные как доверяющие стороны, RP ).
Токены выпускаются и подписываются поставщиками удостоверений.
поставщики удостоверений личности ) — своего рода цифровой аналог паспортного стола.
В конечном итоге у нас есть проверяющая сторона, которая запрашивает токен, и поставщик удостоверений, который выдает эти токены.
Ну и что дальше? Как получить токен и где его подать?
Гранты
Есть много гранты , то есть способы взаимодействия с IdP для получения токена.Большинство из них типичны и широко распространены.
Некоторые выделяются своими функциями, связанными с IdP. Информация о поддерживаемых грантах является общедоступной; вы можете получить его, отправив запрос IdP конечной точки:
Теперь давайте рассмотрим особенности, плюсы и минусы самых популярных грантов OIDC.curl ' https://your-idp.com/.
well-known/openid-configuration
' \ | jq .grant_types_supported ["authorization_code","refresh_token"," urn:ietf:params:oauth:grant-type:device_code "]
1. Предоставление кода авторизации
Грант по коду авторизации (Код авторизации) — это основная ценность протокола OIDC и основная причина, по которой он был изобретен.В гранте участвуют все три стороны: пользователь, IdP и RP. Пользователь инициирует процесс, связываясь с конечной точкой авторизации IdP и обменивая учетные данные на.
образ токена (или, как мы его называем, код ) вместо самого токена.
Вооружившись кодом, пользователь переходит к проверяющей стороне.
Получив код, последний запрашивает токен у IdP через соответствующую конечную точку.
Плюсы:
- Кроме IdP, никто не видит учетные данные пользователя;
- RP получает токен непосредственно от доверенного IdP.
- Процесс привязан к браузеру пользователя, что невозможно при межмашинном взаимодействии;
- Злоумышленники могут перехватить код;
- Требуется трехсторонняя связь между всеми участниками процесса: пользователем, RP и IdP.
2. Ключ подтверждения для обмена кодами (PKCE)
ПКСЕ Является дальнейшим развитием концепции предыдущего гранта, предотвращающим возможность кражи кода.В коде авторизации уязвимой ссылкой является пользователь, отправляющий код проверяющей стороне.
Откуда мы знаем, что это тот же RP? Злоумышленник может занять ее место, как это сделал волк, притворившись бабушкой в Красной Шапочке.
То есть принцип «Никому не верь» актуален всегда.
Однако идея ключа доказательства не особенно сложна.
Пользователю просто нужно сообщить RP, как гонки зашифровать код и IdP – что это такое позади зашифровать.
Вот и все!
Вы можете получить поддерживаемые методы проверки кода, запросив IdP конечной точки: curl ' https://your-idp.com/.
well-known/openid-configuration ' \ | jq .
code_challenge_methods_supported
["S256","plain"]
3. Неявное предоставление
Этот грант был разработан для аутентификации в одностраничных приложениях (SPA).Это похоже на предоставление кода авторизации.
Разница лишь в том, что при перенаправлении пользователь получает в качестве GET-параметра настоящий токен, а не код (который является изображением токена, помните?).
Плюсы:
- SPA не требуется отправлять запрос POST к IdP (что может быть запрещено механизмом CORS).
- Злоумышленники могут получить доступ к токенам в истории браузера;
- Невозможно выдать токен обновления.
Мы рекомендуем отказаться от неявного предоставления в пользу предоставления кода авторизации.
4. Предоставление учетных данных пароля
Также пользователь может обеспечить свои учетные данные проверяющей стороне, чтобы она получила токен от его имени.Однако раскрывать свои пароли кому-либо — не лучшая идея.
Этот грант можно использовать только в тех случаях, когда вы абсолютно уверены в RP. Однако, как уже говорилось ранее, доверять никому нельзя.
Этот грант существует только потому, что иногда можно пожертвовать безопасностью ради удобства и при этом использовать его.
Подумайте дважды, прежде чем использовать его.
Плюсы:
- Может использоваться для аутентификации приложений CLI;
- Может использоваться для межмашинной связи;
- Хорошо подходит для автоматизации, так как от пользователя требуется всего один запрос.
- Возможна утечка данных;
- Этот подход вынуждает пользователей делиться своими учетными данными с кем-то, кроме IdP.
5. Предоставление учетных данных клиента
Этот грант позволяет проверяющей стороне получить токен.Что-то вроде паспорта для паспортного стола.
Пользователь не участвует в процессе.
Такой токен дает полномочия самому RP — например, на выполнение дополнительных вызовов API IdP.
Плюсы:
- Интересная возможность.
- Этот грант не затрагивает пользователей, поэтому мы в нем особо не заинтересованы.
6. Обновить предоставление токена
Наши паспорта действительны в течение многих лет, но представьте себе паспорт, срок действия которого истекает через 5 или 10 минут. В реальной жизни это было бы адом, и нам пришлось бы получать новый паспорт каждый раз, когда возникает необходимость подтвердить свою личность (например, при покупке авиабилетов).Авиакомпаниям всегда нужны самые свежие фотографии и данные.
Именно поэтому срок действия такой короткий.
По этой же причине процедура обновления должна быть максимально простой, чтобы пользователи не теряли рассудок из-за бюрократии и задержек.
То есть это должно выглядеть примерно так: «Здравствуйте! Это снова я.
Пожалуйста, пришлите мне новый паспорт».
К счастью, такая процедура существует и называется Обновить токен .
Этот специальный токен можно обменять на новый идентификационный токен без взаимодействия с пользователем.
Плюсы:
- Удобство;
- Токен обновления — это токен длительного действия, который отправляется исключительно IdP, что является наиболее безопасным способом получения токена.
- Его можно использовать только для продления срока действия токена;
- Требуется доступ к IdP.
7. Предоставление авторизации устройства
«Хорошо, — скажете вы, — а если мне понадобится паспорт на холодильник, микроволновку или пылесосЭ» Ура! Протокол OIDC широко используется в Интернете вещей.Единственная сложность – как получить токен, если на холодильнике нет браузера или терминала? Во-первых, устройство должно знать URL-адрес, чтобы инициировать аутентификацию.
Для этого отправьте запрос на конечную точку обнаружения поставщика удостоверений (IdP): curl ' https://your-idp.com/.
well-known/openid-configuration ' \ | jq .
device_authorization_endpoint
https://your-idp.com/oauth2/v1/device/authorize
По запросу конечной точки авторизации устройства поставщик удостоверений сгенерирует код устройства вместе со ссылкой для подтверждения его аутентификации.
Эта ссылка будет отправлена на устройство.
С этого момента устройство запускается одновременно:
- Отправлять запросы с кодом устройства на соответствующую конечную точку, чтобы обменять его на токен;
- Отображение ссылки для подтверждения на экране.
Плюсы:
- Сорт! Устройства могут быть аутентифицированы!
- Отныне вам придется покупать исключительно дорогую «умную» бытовую технику.
Заключение
В этой статье кратко рассматриваются наиболее распространенные гранты OIDC и типичные сценарии применения.TLDR: в 99% случаев достаточно предоставления кода авторизации, дополненного PKCE и токенами обновления.
Расширяемость протокола OIDC позволяет создавать собственные гранты и заявлять об их поддержке при обращении к конечной точке обнаружения.
Я намеренно проигнорировал СИБА — интересный, многообещающий, но довольно сырой грант, который пока не поддерживается популярными провайдерами OIDC, такими как Okta или Auth0. Надеюсь, эта статья помогла вам лучше понять процесс аутентификации в целом и процедуру получения токена в частности.
Оставайтесь на связи!
P.S.
Эта же статья доступна и на английском языке в блоге Флэнта .Там вы также можете подписаться на технический контент от наших инженеров, которым можно легко поделиться с ИТ-коллегами по всему миру.
Читайте также в нашем блоге:
- «Иллюстрированное руководство по OAuth и OpenID Connect» ;
- «Азбука безопасности в Kubernetes: аутентификация, авторизация, аудит» ;
- «Пользователи и авторизация RBAC в Kubernetes» .
-
Интерфейсы: Мой, Твой, Твой, Наш Или Этот.
19 Oct, 24 -
Эти Забавные Sim-Карты
19 Oct, 24 -
Lian Li Pc-Q07 — Идеальный Корпус Mini-Itx?
19 Oct, 24