Xoauth top что это
OAuth 2.0 простым и понятным языком
На хабре уже писали про OAuth 1.0, но понятного объяснения того, что такое OAuth 2.0 не было. Ниже я расскажу, в чем отличия и преимущества OAuth 2.0 и, как его лучше использовать на сайтах, в мобильных и desktop-приложениях.
Что такое OAuth 2.0
OAuth 2.0 — протокол авторизации, позволяющий выдать одному сервису (приложению) права на доступ к ресурсам пользователя на другом сервисе. Протокол избавляет от необходимости доверять приложению логин и пароль, а также позволяет выдавать ограниченный набор прав, а не все сразу.
Чем отличаются OpenID и OAuth
Не смотря на то, что объяснений на эту тему уже было много, она по-прежнему вызывает некоторое непонимание.
OpenID предназначен для аутентификации — то есть для того, чтобы понять, что этот конкретный пользователь является тем, кем представляется. Например, с помощью OpenID некий сервис Ололо может понять, что зашедший туда пользователь, это именно Рома Новиков с Mail.Ru. При следующей аутентификации Ололо сможет его опять узнать и понять, что, это тот же Рома, что и в прошлый раз.
OAuth же является протоколом авторизации, то есть позволяет выдать права на действия, которые сам Ололо сможет производить в Mail.Ru от лица Ромы. При этом Рома после авторизации может вообще не участвовать в процессе выполнения действий, например, Ололо сможет самостоятельно заливать фотографии на Ромин аккаунт.
Как работает OAuth 2.0
Как и первая версия, OAuth 2.0 основан на использовании базовых веб-технологий: HTTP-запросах, редиректах и т. п. Поэтому использование OAuth возможно на любой платформе с доступом к интернету и браузеру: на сайтах, в мобильных и desktop-приложениях, плагинах для браузеров…
Ключевое отличие от OAuth 1.0 — простота. В новой версии нет громоздких схем подписи, сокращено количество запросов, необходимых для авторизации.
Авторизация для приложений, имеющих серверную часть
Пример
Здесь и далее примеры приводятся для API Mail.Ru, но логика одинаковая для всех сервисов, меняются только адреса страниц авторизации. Обратите внимание, что запросы надо делать по HTTPS.
Редиректим браузер пользователя на страницу авторизации:
Здесь и далее, client_id и client_secret — значения, полученные при регистрации приложения на платформе.
После того, как пользователь выдаст права, происходит редирект на указанный redirect_uri:
Обратите внимание, если вы реализуете логин на сайте с помощью OAuth, то рекомендуется в redirect_uri добавлять уникальный для каждого пользователя идентификатор для предотвращения CSRF-атак (в примере это 123). При получении кода надо проверить, что этот идентификатор не изменился и соответствует текущему пользователю.
Используем полученный code для получения access_token, выполняя запрос с сервера:
Обратите внимание, что в последнем запросе используется client_secret, который в данном случае хранится на сервере приложения, и подтверждает, что запрос не подделан.
В результате последнего запроса получаем сам ключ доступа (access_token), время его «протухания» (expires_in), тип ключа, определяющий как его надо использовать, (token_type) и refresh_token о котором будет подробнее сказано ниже. Дальше, полученные данные можно использовать для доступа к защищенным ресурсам, например, API Mail.Ru:
Авторизация полностью клиентских приложений
Пример
Открываем браузер со страницей авторизации:
После того, как пользователь выдаст права, происходит редирект на стандартную страницу-заглушку, для Mail.Ru это connect.mail.ru/oauth/success.html:
Приложение должно перехватить последний редирект, получить из адреса acess_token и использовать его для обращения к защищенным ресурсам.
Авторизация по логину и паролю
Авторизация по логину и паролю представляет простой POST-запрос, в результате которого возвращается access token. Такая схема не представляет из себя ничего нового, но вставлена в стандарт для общности и рекомендуется к применению только, когда другие варианты авторизации не доступны.
Пример
Восстановление предыдущей авторизации
Обычно, access token имеет ограниченный срок годности. Это может быть полезно, например, если он передается по открытым каналам. Чтобы не заставлять пользователя проходить авторизацию после истечения срока действия access token‘а, во всех перечисленных выше вариантах, в дополнение к access token‘у может возвращаться еще refresh token. По нему можно получить access token с помощью HTTP-запроса, аналогично авторизации по логину и паролю.
Пример
Минусы OAuth 2.0
Во всей этой красоте есть и ложка дегтя, куда без нее?
OAuth 2.0 — развивающийся стандарт. Это значит, что спецификация еще не устоялась и постоянно меняется, иногда довольно заметно. Так, что если вы решили поддержать стандарт прямо сейчас, приготовьтесь к тому, что его поддержку придется подпиливать по мере изменения спецификации. С другой стороны, это также значит, что вы можете поучаствовать в процессе написания стандарта и внести в него свои идеи.
Безопасность OAuth 2.0 во многом основана на SSL. Это сильно упрощает жизнь разработчикам, но требует дополнительных вычислительных ресурсов и администрирования. Это может быть существенным вопросом в высоко нагруженных проектах.
Заключение
OAuth — простой стандарт авторизации, основанный на базовых принципах интернета, что делает возможным применение авторизации практически на любой платформе. Стандарт имеет поддержку крупнейших площадок и очевидно, что его популярность будет только расти. Если вы задумались об API для вашего сервиса, то авторизация с использованием OAuth 2.0 — хороший выбор.
Авторизация OAuth 2.0: два полезных решения для тестировщиков
Senior Test Automation Engineer в Sigma Software
Многие из нас хотя бы раз сталкивались с интеграцией сторонних сервисов на проектах. Обычно такую функциональность мы тестируем вручную, авторизуясь через Google-аккаунт и подобные сервисы.
Когда же дело доходит до тестирования API, часто возникает вопрос: как можно автоматизировать этот процесс? Какой способ генерации токенов даст больше преимуществ в случае одной интеграции… А в случае десятка?
В этой статье я хочу описать основные способы авторизации OAuth 2.0 Протокол авторизации, позволяющий выдать одному сервису (приложению) права на доступ к ресурсам пользователя на другом сервисе. Он избавляет от необходимости доверять приложению логин и пароль. во время реализации API-тестов, а также их преимущества и недостатки.
Авторизации через сервис-аккаунт часто бывает достаточно для получения доступа к ресурсам во время автотестов. Но бывают ситуации, когда нам нужно знать, кто заходит в систему, какие права есть у пользователя и так далее. В таких случаях нам нужно использовать веб-сервер-авторизацию, которая требует действий пользователя. Об этом и поговорим.
OAuth 2.0: сценарий для веб-серверных приложений
В целом, OAuth 2.0 Authorization code flow включает в себя:
Наиболее проблемная для автоматизации часть сценария — второй пункт, поскольку реализация может варьироваться в зависимости от сервиса, и мы не можем контролировать, каким способом сервис обрабатывает аутентификацию пользователя. Кроме того, здесь требуются действия пользователя.
Способы автоматизации сценария авторизации
Отталкиваясь от требований проекта, мы можем реализовать сценарий авторизации OAuth2.0 двумя способами:
Подход №1: использование HTTP-запросов
Основная идея этого подхода — использовании только HTTP-протокола для авторизации пользователя, включая отправку сервису учетных данных пользователя.
Перед реализацией нам необходимо собрать следующую информацию:
Получив все необходимые данные, мы можем перейти к реализации сценария авторизации.
Ниже я привожу пример модуля авторизации для Box Service, реализованного на PowerShell.
Самая трудоемкая часть этого подхода связана с общей формой входа и подтверждения пользователя, поскольку нам нужно выяснить, как передать учетные данные пользователя в запрос и какие заголовки нужны, чтобы запрос работал.
Преимущества | Недостатки |
1. Стабильность. Скрипт работает стабильно по сравнению с подходом, когда мы взаимодействуем с браузером. 2. Быстрый запуск. Поскольку мы не настраиваем драйвер, это экономит время при запуске скрипта. 3. Не требует дополнительных настроек в CI. | 1. Довольно долгое время на реализацию из-за особенностей реализации OAuth 2.0 конкретного стороннего сервиса. 2. Требует конфиденциальной информации, например client_secret . |
Подход №2: HTTP-запрос и взаимодействие с браузером
Основная идея — выполнить самую трудоемкую часть подхода №1 с помощью веб-драйвера.
Данные, которые нужно собрать:
Ниже можно найти UML-диаграммы этого подхода:
UML-диаграмма подхода №2
Здесь переиспользуемые классы отмечены зеленым. Единственное, что нужно добавить для подключения нового стороннего сервиса — это объект страницы AuthForm для соответствующего сервиса (оранжевый класс на изображении).
2. Не требует конфиденциальной информации, такой как client_secret.
3. Флоу можно использовать повторно.
2. Требует дополнительной контейнеризации в CI.
3. Имеется риск нестабильности процесса авторизации из-за использования веб-драйвера.
Вывод
Оба подхода имеют свои недостатки и преимущества и могут быть реализованы в рамках автоматизации тестов. Но давайте обозначим условия, при которых мы можем извлечь из каждого подхода максимум преимуществ.
Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.
Про очередных интернет мошенников и как их можно посильно наказать.
Всем доброго времени суток! Сегодня будет очередной пост про интернет мошенников и как их можно посильно наказать.
История началась где то полтора месяца назад.
Тут следует пояснить, что у нас с ним на двоих есть одна PCP винтовка (достаточно дорогая, что бы позволить себе её в одну харю), которую мы пользуем в основном на пикниках для стрельбы по всяческим банкам, но тешим себя мыслью, что когда нить попрем на охоту на утку или байбака)))) Ну и периодически покупаем на нее всяческие всякие сошки, прицелы и прочие тактикульные штучки, коих набрался уже целый чемодан.
Так вот, на том скриншоте вижу я какой то, нереальных размеров ночной прицел и крупным шрифтом написано: цена 1990 рублей. И дальше что бла-бла-бла, оплата при получении.
Я, зная, что даже самые простые ночные прицелы стоят от 20 000 рублей, а уж тем более тепловизоры (а это был именно тепловизор) стартуют и вовсе от 200 000 р. и выше, просто написал ему что это какая то ерунда и что даже время тратить не стоит.
Ну не стоит так не стоит. товарищ спорить не стал и мы благополучно про это забыли.
Но как оказалось забыли мы, но не нас.
И вот с тех самых пор, куда бы я ни пошел, какую бы новость ни читал, эти прицелы начали преследовать уже и меня. Точнее их вездесущие баннеры.
«Сайтом» оказался обычны одностраничник. На нем очень доходчиво расписывается достоинства товара, что это акционная цена и что акция вот-вот закончится. Внизу даже есть реквизиты:
ИНН 7725776121 г.Москва 115114
ул.Шлюзовая набережная 4
Вбиваем в поисковик и видим:
1. Фирма действительно существует.
2. Уставной капитал 200 с лишним миллионов рублей (ого, фирма серьёзная)))).
3. Фирма, по всей видимости, владеет сетью магазинов RESERVED, CROPP, HOUSE, MOHITO т HOMEYOU, возможно помимо всего прочего.
Поиск по отзывам даёт 2 типа результатов:
2. Отзывы «довольных» клиентов неких интернет магазинов с рассказами о том, как им вместо дорогостоящих покупок (прицелы, лазерные уровни, наборы посуды, чехлы для сидений, шторы и т.д.) приходила на почту всякая мелочь.
Здесь можно было бы остановиться, т.к. стало понятно, что под вывеской реально действующей фирмы скрываются (точнее ведут преступную деятельность, не особо то и скрываясь) банальные жулики.
Но мне захотелось понять, как же они работают и почему эту лавочку до сих пор не прикрыли т.к. судя по отзывам много кто писал заявления в полицию.
Здравствуйте Xxxxx Yyyyyyy Zzzzzzz! Ваш заказ и подарок приняты на доставку. Срок прибытия 3-7 дней. Ожидайте СМС с номером заказа!
Ок, переходим на сайт почты, вбиваем трек номер и видим:
Посылка c объявленной ценностью 3 890 ₽ и наложенным платежом 3 890,00 ₽ 347 г
От кого: ООО «Оникс-М»
Куда: Oooooo Ggggggg, 123123
Естественно никто и не планировал забирать посылку.
Теперь немного о том, как данная схема работает и почему обращаться в полицию практически бесполезно:
наказывается штрафом в размере до трехсот тысяч рублей или в размере заработной платы или иного дохода осужденного за период до двух лет, либо обязательными работами на срок до четырехсот восьмидесяти часов, либо исправительными работами на срок до двух лет, либо принудительными работами на срок до пяти лет с ограничением свободы на срок до одного года или без такового, либо лишением свободы на срок до пяти лет с ограничением свободы на срок до одного года или без такового.
Только вот согласно примечанию №1 к той же статье: Значительным ущербом в части пятой настоящей статьи признается ущерб в сумме, составляющей не менее десяти тысяч рублей.
То есть в данном действии нет признаков уголовного состава преступления и следовательно в полиции (с большим удовольствием) откажутся возбуждать уголовное дело, а порекомендуют обратиться в суд.
2-ое (интересное) Суд с большой долей вероятности классифицирует это деяние как нарушение Статьи 398 ГК РФ «Последствия неисполнения обязательства передать индивидуально-определенную вещь». А здесь всё просто, Суд обяжет продавца передать Вам купленную вещь, а при её отсутствии (еще бы, прицел то реально стоит аж 230 т.р) возместить уплаченную стоимость и компенсацию «упущенной выгоды». Ну и судебные расходы (которые почти наверняка в несколько раз превысят стоимость «купленой» вещи). И подавать в Суд Вам придется не на ООО «РЕ Трэйдинг» реквизиты которого у нас есть, а на некую ООО «Оникс-М» без указания ИНН, коих в России зарегистрировано аж 53 штуки)))) И мне почему то кажется, если кто либо из потерпевших и решится на подобную «авантюру» то уже на этапе поиска ответчика энтузиазм пропадет окончательно. Тем более, что даже если мы точно узнали нужную нам фирму (что сделать в принципе не так уж и сложно), нужно будет подавать иск по месту нахождения ответчика, а соответственно оплачивать адвокату дорогу и проживание или же ездить на заседания самому, а уж ответчик понимая все это будет стараться растянуть удовольствие по максимуму))) Ну и не следует забывать еще одну вещь, даже если Вы выиграете суд, получите на руки исполнительный лист, нет ни какой гарантии, что к тому моменту фирму банально не «бросят», естественно без денег на счетах и какой бы то ни было собственности на балансе.
Теперь о том, как я в меру своих сил наказал засранцев.
Я скинул адреса их сайтов многим своим знакомым с кратким описанием, что и зачем и попросил заказать что нибудь у них. Откликнулись 18 человек. Всех попросил указывать регионы достаточно удалённые от Москвы, что бы наши «Бизнесмены» попали на более дорогую доставку. Если предположить, что в среднем доставка 1 посылки стоила жуликам 500 р. то всего они лишились 9500 рублей своей незаконной прибыли. И останавливаться я не собираюсь))))
Авторизация и аутентификация для всех
Аутентификация и авторизация необходимы для многих приложений. Допустим, вы разработали приложение и внедрили в него аутентификацию и авторизацию — использовали для этого стороннюю библиотеку аутентификации или платформу идентификации. Выполнив свою работу, как обычно вы не стали разбираться, что происходит за кулисами, или почему что-то происходит определенным образом. Но если вы хотите получить общее представление о том, что происходит на самом при использовании стандартов OAuth 2.0 и OpenID Connect, читайте дальше!
Аутентификация — это сложно. Почему так? Стандарты Auth хорошо определены, но в них сложно разобраться. И это нормально! Мы собираемся пройти через это максимально доступным способом. Мы рассмотрим концепции идентификации шаг за шагом, опираясь на наши знания по мере продвижения вперед. К тому времени, когда мы закончим, вы должны иметь фундамент и знать, куда нужно обратиться если вам нужно будет больше информации.
Введение
Когда я говорил семье или друзьям, что я «работаю в identity», они часто предполагали, что это означает, что я работал в правительстве, в организации выдающей водительские права, или что я помогал людям разрешать мошенничество с кредитными картами.
Однако ни то, ни другое не было правдой. Ранее я работал в компании Auth0,, которая управляет цифровой идентификацией. (Сейчас я являюсь участником программы Auth0 Ambassadors и являюсь экспертом Google Developer по SPPI: Security, Privacy, Payments, and Identity — безопасность, конфиденциальность, платежи и идентификация.)
Цифровая идентификация
Цифровая идентификация это набор атрибутов, которые определяют отдельного пользователя в контексте функции, предоставляемой конкретным приложением.
Скажем, вы управляете компанией по продаже обуви онлайн. Цифровой идентификацией пользователей вашего приложения может быть номер их кредитной карты, адрес доставки и история покупок. Их цифровая идентификация зависит от вашего приложения.
Это приводит нас к …
Аутентификация
В широком смысле, аутентификация относится к процессу проверки того, что пользователь является тем, кем он себя заявляет.
Как только система сможет установить это, мы приходим к …
Авторизация
Авторизация касается предоставления или отказа в правах доступа к ресурсам.
Стандарты
Вы можете вспомнить, что я упомянул, что аутентификация основывается на четко определенных стандартах. Но откуда эти стандарты берутся?
Есть много разных стандартов и организаций, которые управляют работой Интернета. Два органа, которые представляют для нас особый интерес в контексте аутентификации и авторизации, — это Инженерная рабочая группа по Интернету (Internet Engineering Task Force — IETF) и Фонд OpenID (OpenID Foundation — OIDF).
IETF (Internet Engineering Task Force)
IETF — это большое открытое международное сообщество сетевых инженеров, операторов, поставщиков и исследователей, которые занимаются развитием интернет-архитектуры и бесперебойной работой интернета.
OIDF (OpenID Foundation)
OIDF — это некоммерческая международная организация людей и компаний, которые стремятся обеспечить, продвигать и защищать технологии OpenID.
Теперь, когда нам известны спецификации и кто их пишет, давайте вернемся к авторизации и поговорим о:
OAuth 2.0
OAuth 2.0 является одной из наиболее часто упоминаемых спецификаций, когда речь идет о сети, а также часто неправильно представленной или неправильно понятой.
OAuth не является спецификацией аутентификации. OAuth имеет дело с делегированной авторизацией. Помните, что аутентификация — это проверка личности пользователя. Авторизация касается предоставления или отказа в доступе к ресурсам. OAuth 2.0 предоставляет доступ к приложениям от имени пользователей.
Как было до OAuth
Чтобы понять цель OAuth, нам нужно вернуться назад во времени. OAuth 1.0 был создан в декабре 2007 года. До этого, если нам требовался доступ к сторонним ресурсам, это выглядело так:
Допустим, вы использовали приложение под названием HireMe123. HireMe123 хочет настроить событие календаря (например, встречу на собеседование) от вашего имени (пользователя). HireMe123 не имеет собственного календаря; поэтому нужно использовать другой сервис под названием MyCalApp для добавления событий.
После того, как вы вошли в HireMe123, HireMe123 запросит у вас ваши учетные данные для входа в MyCalApp. Вы должны ввести свое имя пользователя и пароль на сайте HireMe123.
Затем HireMe123 используя ваш логин получить доступ к API MyCalApp, и затем сможет создавать события календаря с использованием ваших учетных данных.
Совместное использование учетных данных — это плохо!
Этот подход основывался на совместном использовании личных учетных данных пользователя из одного приложения с совершенно другим приложением, и это не очень хорошо.
Так как, HireMe123 поставил на карту защиты вашей учетной записи MyCalApp гораздо меньше. Если HireMe123 не защитит ваши учетные данные MyCalApp надлежащим образом, и они в конечном итоге будут украдены или взломаны, кто-то сможет написать несколько неприятных статей в блоге, но HireMe123 как бы останется в стороне.
HireMe123 также получает слишком большой доступ к MyCalApp от вашего имени. HireMe123 получает все те же привелегии, что и вы, потому что он использовал ваши учетные данные для получения этого доступа. Это означает, что HireMe123 может читать все ваши события календаря, редактировать их, изменять настройки и т. д.
Появление OAuth
Все эти недостатки приводит нас к OAuth.
OAuth 2.0 — это открытый стандарт для выполнения делегированной авторизации. Это спецификация, которая говорит нам, как предоставить сторонним пользователям доступ к API без предоставления учетных данных.
Используя OAuth, пользователь теперь может делегировать HireMe123 для вызова MyCalApp от имени пользователя. MyCalApp может ограничить доступ к своему API при вызове сторонними клиентами без риска совместного использования информации для входа или предоставления слишком большого доступа. Это делается с помощью:
Сервер авторизации
Сервер авторизации — это набор конечных точек (методов API) для взаимодействия с пользователем и выдачи токенов. Как это работает?
Давайте вернемся к ситуации с HireMe123 и MyCalApp, только теперь у нас есть OAuth 2.0:
MyCalApp теперь имеет сервер авторизации. Предположим, что HireMe123 уже зарегистрирован как известный клиент в MyCalApp, что означает, что сервер авторизации MyCalApp распознает HireMe123 как объект, который может запрашивать доступ к своему API.
Предположим также, что вы уже вошли в систему с HireMe123 через любую аутентификацию, которую HireMe123 настроил для себя. HireMe123 теперь хочет создавать события от вашего имени.
HireMe123 отправляет запрос авторизации на сервер авторизации MyCalApp. В ответ сервер авторизации MyCalApp предлагает вам — пользователю — войти в систему с помощью MyCalApp (если вы еще не вошли в систему). Вы аутентифицируетесь с MyCalApp.
Затем сервер авторизации MyCalApp запросит у вас согласие разрешить HireMe123 получать доступ к API MyCalApp от вашего имени. В браузере откроется приглашение, в котором будет запрошено ваше согласие на добавление в календарь событий HireMe123 (но не более того).
Если вы скажете «да» и дадите свое согласие, то сервер авторизации MyCalApp отправит код авторизации в HireMe123. Это позволяет HireMe123 знать, что пользователь MyCalApp (вы) действительно согласился разрешить HireMe123 добавлять события с использованием пользовательского (вашего) MyCalApp.
MyCalApp затем выдаст токен доступа для HireMe123. HireMe123 может использовать этот токен доступа для вызова MyCalApp API в рамках разрешенных вами разрешений и создания событий для вас с помощью MyCalApp API.
Ничего плохо больше не происходит! Пароль пользователя знает только MyCalApp. HireMe123 не запрашивает учетные данные пользователя. Проблемы с совместным использованием учетных данных и слишком большим доступом больше не являются проблемой.
А как насчет аутентификации?
На данный момент, я надеюсь, стало ясно, что OAuth предназначен для делегированного доступа. Это не распространяется на аутентификацию. В любой момент, когда аутентификация включалась в процессы, которые мы рассмотрели выше, вход в систему осуществлялся любым процессом входа в систему, который HireMe123 или MyCalApp реализовали по своему усмотрению. OAuth 2.0 не прописывал, как это должно быть сделано: он только покрывал авторизацию доступа сторонних API.
Так почему же аутентификация и OAuth так часто упоминаются вместе друг с другом?
Проблема входа в систему
То, что происходит после того, как OAuth 2.0 установил способ доступа к сторонним API, заключается в том, что приложение также требуется регистрировать пользователей у себя. Используя наш пример: HireMe123 нужно, чтобы пользователь MyCalApp мог залогиниться, используя свою учетную запись MyCalApp, даже несмотря на то, что он не был зарегистрирован в HireMe123.
Но, как мы упоминали выше, OAuth 2.0 предназначен только для делегированного доступа. Это не протокол аутентификации. Но это не помешало людям попытаться использовать его и для аутентификации, и это представляет проблему.
Проблемы с использованием токенов доступа для аутентификации
Если HireMe123 предполагает успешный вызов API MyCalApp с токеном доступа, достаточным что бы пользователь считался аутентифицированным, у нас возникают проблемы, поскольку у нас нет способа проверить, был ли выдан токен доступа правильному пользователю.
Это называется запутанной проблемой делегирования. HireMe123 не знает, откуда взялся этот токен и кому он был выдан. Если мы помним: аутентификация — это проверка того, что пользователь — это тот, кем он себя заявляет. HireMe123 не может знать это из-за того, что он может использовать этот токен доступа для доступа к API.
Как уже упоминалось, это не остановило людей от неправильного использования токенов доступа и OAuth 2.0 для аутентификации. Быстро стало очевидно, что формализация аутентификации поверх OAuth 2.0 была необходима, чтобы разрешить входы в приложения сторонних разработчиков, сохраняя безопасность приложений и их пользователей.
OpenID Connect
Это подводит нас к спецификации под названием OpenID Connect, или OIDC. OIDC — это спецификация OAuth 2.0, в которой говорится, как аутентифицировать пользователей. OpenID Foundation (OIDF) является руководителем стандартов OIDC.
OIDC — это уровень идентификации для аутентификации пользователей на сервере авторизации. Помните, что сервер авторизации выдает токены. Токены представляют собой закодированные фрагменты данных для передачи информации между сторонами (такими как сервер авторизации, приложение или API ресурса). В случае OIDC и аутентификации сервер авторизации выдает токены ID.
ID Токены
Идентификационные токены предоставляют информацию о событии аутентификации и идентифицируют пользователя. Идентификационные токены предназначены для клиента. Это фиксированный формат, который клиент может анализировать и проверять, чтобы извлечь идентификационную информацию из токена и тем самым аутентифицировать пользователя.
OIDC объявляет фиксированный формат для токенов ID, которым является JWT.
JSON Web Token (JWT)
JSON Web Tokens, или JWT (иногда произносится как «jot»), состоит из трех URL-безопасных сегментов строки, соединенных точками. Сегмент заголовка, сегмента полезной нагрузки и крипто сегмента.
Сегмент заголовка
Первый сегмент является сегментом заголовка (header segment). Он может выглядеть примерно так:
Сегмент заголовка — это объект JSON, содержащий в закодирован виде алгоритм и тип токена. Он закодирован в base64Url (байтовые данные представлены в виде текста, который является URL-адресом и безопасным для имени файла).
Декодированный заголовок выглядит примерно так:
Сегмент полезной нагрузки
Второй сегмент — это сегмент полезной нагрузки (payload segment). Он может выглядеть так:
Это объект JSON, содержащий фрагмент данных называемый claim, который содержат информацию о пользователе и событии аутентификации. Например:
Оно также кодируется в base64Url.
Крипто сегмент
Последний сегмент — крипто сегмент (crypto segment) или подпись (signature). JWT подписаны, поэтому они не могут быть изменены в процессе использования. Когда сервер авторизации выдает токен, он подписывает его с помощью ключа.
Когда клиент получает идентификационный токен, он также проверяет подпись с помощью ключа. (Если использовался алгоритм асимметричной подписи, для подписи и проверки используются разные ключи; в этом случае только сервер авторизации может подписывать токены.)
Claim
Claim можно перевести как требование, утверждение или как заявление.
Теперь, когда мы знаем об анатомии JWT, давайте поговорим подробнее об claim, этом фрагменте данных из сегмента полезной нагрузки. Согласно его названию, токены ID предоставляют идентификационную информацию, которая присутствует в формуле claim.
Аутентификационный Claim
Некоторые строки аутентификации в токене ID включают:
Одноразовый номер nonce привязывает запрос авторизации клиента к полученному токену. Одноразовый номер — это криптографически случайная строка, которую клиент создает и отправляет с запросом авторизации. Затем сервер авторизации помещает одноразовый номер в токен, который отправляется обратно в приложение. Приложение проверяет, совпадает ли одноразовый номер в токене с отправленным с запросом авторизации. Таким образом, приложение может проверить, что токен пришел из того места, откуда он запросил токен.
Идентификационные данные (Identity Claim)
Claim также включают информацию о конечном пользователе. Вот несколько примеров таких данных:
Некоторые из стандартных строк профиля в токене ID включают:
После того как мы рассмотрели спецификации OAuth 2.0 и OpenID Connect пришло посмотреть, как применить наши знания в области идентификации.
Аутентификация с помощью ID токенов
Давайте посмотрим на OIDC аутентификацию на практике.
Обратите внимание, что это упрощенная схема. Есть несколько разных потоков в зависимости от архитектуры вашего приложения.
Наши объекты здесь: браузер, приложение, запущенное в браузере, и сервер авторизации. Когда пользователь хочет войти в систему, приложение отправляет запрос авторизации на сервер авторизации. Учетные данные пользователя проверяются сервером авторизации, и если все хорошо, сервер авторизации выдает идентификационный токен приложению.
Затем клиентское приложение декодирует маркер идентификатора (который является JWT) и проверяет его. Это включает в себя проверку подписи, и мы также должны проверить данные claim. Вот некоторые примеры проверок:
После того как мы установили подлинность токена ID, пользователь проходит аутентификацию. Теперь у нас есть доступ к identity claims и мы знаем, кто этот пользователь.
Теперь пользователь аутентифицирован. Пришло время взаимодействовать с API.
Доступ к API с помощью токенов доступа
Мы немного поговорили о токенах доступа ранее, еще когда мы смотрели, как делегированный доступ работает с OAuth 2.0 и серверами авторизации. Давайте посмотрим на некоторые детали того, как это работает, возвращаясь к нашему сценарию с HireMe123 и MyCalApp.
Токены доступа
Токены доступа (Access Token) используются для предоставления доступа к ресурсам. С токеном доступа, выданным сервером авторизации MyCalApp, HireMe123 может получить доступ к API MyCalApp.
В отличие от токенов ID, которые OIDC объявляет как веб-токены JSON, токены доступа не имеют определенного формата. Они не должны быть (и не обязательно) JWT. Однако во многих решениях для идентификации используются JWT как маркеры доступа, поскольку есть готовый формат и он обеспечивает хорошую проверку.
В итоге HireMe123 получает два токена от сервера авторизации MyCalApp: токен идентификации (Token ID) (если проверка пользователя прошла успешна) и токен доступа (Access Token) для доступа к ресурсам конечному пользователю.
Токены доступа прозрачны для клиента
Токены доступа предназначены для API ресурса, и важно, чтобы они были прозрачны для клиента. Зачем?
Токены доступа могут измениться в любое время. У них должно быть короткое время истечения, поэтому пользователь может часто получать новые. Они также могут быть переизданы для доступа к различным API или использования разных разрешений. Клиентское приложение никогда не должно содержать код, который опирается на содержимое токена доступа. Код, который делает это, был бы хрупким и почти гарантированно сломался.
Доступ к ресурсным API
Допустим, мы хотим использовать токен доступа для вызова API из одностраничного приложения. Как это выглядит?
Мы рассмотрели аутентификацию выше, поэтому давайте предположим, что пользователь вошел в наше приложение JS в браузере. Приложение отправляет запрос авторизации на сервер авторизации, запрашивая токен доступа для вызова API.
Затем, когда наше приложение хочет взаимодействовать с API, мы присоединяем токен доступа к заголовку запроса, например, так:
Затем авторизованный запрос отправляется в API, который проверяет токен с помощью промежуточного программного обеспечения middleware. Если все проверено, то API возвращает данные (например, JSON) в приложение, запущенное в браузере.
Это замечательно, но есть кое-что, что может произойти с вами прямо сейчас. Ранее мы заявляли, что OAuth решает проблемы с излишним доступом. Как это решается здесь?
Делегирование со Scopes
Как API узнает, какой уровень доступа он должен предоставить приложению, запрашивающему использование его API? Мы делаем это с помощью scopes.
Scopes (Области действия) «ограничивают возможности приложения от имени пользователя». Они не могут предоставлять привилегии, которых у пользователя еще нет. Например, если у пользователя MyCalApp нет разрешения на создание новых корпоративных учетных записей MyCalApp, scopes, предоставленные HireMe123, также никогда не позволят пользователю создавать новые корпоративные учетные записи.
Scopes делегируют управление доступом к API или ресурсу. Затем API отвечает за объединение входящих scopes с фактическими правами пользователя для принятия соответствующих решений по управлению доступом.
Давайте рассмотрим это на нашем примере.
Я использую приложение HireMe123, и HireMe123 хочет получить доступ к стороннему API MyCalApp для создания событий от моего имени. HireMe123 уже запросил токен доступа для MyCalApp с сервера авторизации MyCalApp. Этот токен содержит некоторую важную информацию, такую как:
HireMe123 отправляет запрос в API MyCalApp с токеном доступа в своем заголовке авторизации. Когда MyCalApp API получает этот запрос, он может увидеть, что токен содержит scope write: events.
Но MyCalApp размещает учетные записи календаря для сотен тысяч пользователей. В дополнение к рассмотрению scope в токене, промежуточному программному обеспечению (middleware) API MyCalApp необходимо проверить sub идентификатор пользователя, чтобы убедиться, что этот запрос от HireMe123 может только использовать мои привилегии для создания событий с моей учетной записью MyCalApp.
В контексте делегированной авторизации scopes (области действия) показывают, что приложение может делать от имени пользователя. Они являются подмножеством общих возможностей пользователя.
Предоставление согласия
Помните, когда сервер авторизации спрашивал пользователя HireMe123 о его согласии разрешить HireMe123 использовать привилегии пользователя для доступа к MyCalApp?
Этот диалог согласия может выглядеть примерно так:
HireMe123 может запросить множество различных областей, например:
В общем, мы должны избегать увеличения количества областей с правами пользователя. Тем не менее, можно добавить разные области для отдельных пользователей, если ваш сервер авторизации обеспечивает управление доступом на основе ролей (Role-Based Access Control — RBAC).
С RBAC вы можете настроить роли пользователей с определенными разрешениями на вашем сервере авторизации. Затем, когда сервер авторизации выдает токены доступа, он может включать роли определенных пользователей в свои области.
Ресурсы и что дальше?
Мы рассмотрели много материала, и даже не приблизились к рассмотрению всему что есть в области аутентификации и авторизации. Я надеюсь, что это была полезная статья по идентификации, авторизации и аутентификации.
В настоящее время я работаю над несколькими дополнительными постами в блоге, в которых более подробно рассматриваются веб-токены JSON, а также аутентификация и авторизация для приложений JavaScript.
Если вы хотите узнать больше, гораздо больше по этим темам, вот несколько полезных ресурсов для вас:
Выучить больше
Серия видеороликов Learn Identity в документах Auth0 — это лекционная часть нового учебного курса по найму для инженеров в Auth0, представленного главным архитектором Витторио Берточчи. Если вы хотите лично узнать, как это делается в Auth0, она абсолютно бесплатна и доступна для всех.
Спецификации OAuth 2.0 и OpenID Connect являются сложными, но как только вы ознакомитесь с терминологией и получите базовые знания об идентификации, они будут полезны, информативны и станут намного более удобочитаемыми. Почитать их можно здесь: The OAuth 2.0 Authorization Framework и OpenID Connect Specifications..
JWT.io — это ресурс о JSON Web Token, который предоставляет инструмент отладчика и каталог библиотек подписи/проверки JWT для различных технологий.
OpenID Connect Playground — это отладчик, который позволяет разработчикам шаг за шагом исследовать и тестировать вызовы и ответы OIDC.
Спасибо!
Если вы хотите пообщаться, я доступен в Твиттере на @KimMaida, и я также выступаю на конференциях и мероприятиях. Я надеюсь увидеть вас когда-нибудь, и большое спасибо за чтение!