Фреймворк OAuth 2 предназначен для ограничения доступа к личным кабинетам, заведенным на ресурсах HTTP. Типичные примеры реализации – DigitalOcean, GitHub, Facebook. Его работа основана на делегировании процесса аутентификации серверу, где расположен аккаунт. Такой подход позволяет запрашивать доступ из сторонних приложений. Например, для регистрации за счет подстановки учетных данных.
Возможно использование OAuth 2 в облачных сервисах, на настольных компьютерах и в мобильном ПО для смартфонов, планшетов. В этом материале мы рассмотрим основные варианты практического применения инструмента.
Фреймворк позволяет назначить 4 роли: владелец, клиент, сервер и сервер для авторизации. Последовательно разберемся во всех существующих.
Таковым признается пользователь, авторизуемый под своей учеткой для открытия личного аккаунта. Открытая область имеет ограничения прав – только чтение или с возможностью записи, внесения изменений.
На ресурсном сервере держат данные по пользовательским аккаунтам (в защищенном виде). Сервер авторизации предназначен для проверки подлинности вводимых логинов и паролей. На нем же есть функция создания токенов авторизации, применяемых программами. Через них последние будут получать доступ к информации пользователя.
Оба серверы логически объединены в единую систему. Именно так их видят внешние сервисы по интерфейсу API. Поэтому мы объединим понятия ресурсного и авторизационного сервера, дадим им единое название: «Сервис», API.
Под клиентом будем понимать программу, запрашивающую открытие доступа к аккаунту. Перед активацией требуется соблюдение двух условий: авторизация внутри программы и положительный ответ от интерфейса API.
Мы провели обзор ролей OAuth 2, теперь рассмотрим открытый протокол авторизации, схему обмена информацией. Для этого приведем перечень (последовательность) типовых операций.
Варианты:
Последовательность может быть иной, здесь многое зависит от разработчика и назначения ПО. Но на практике стараются придерживаться единой схемы.
Перед тем как начать пользоваться OAuth, надо зарегистрировать программу в сервисе. Такую процедуру проводят в пункте Developer или API на сайте. В него необходимо внести:
Третий пункт – это ссылка на страницу, которую сервис будет открывать при отказе в доступе (или после успешной авторизации).
При регистрации приложения будут созданные учетные данные пользователя – это идентификатор Client ID и секрет клиента Client Secret. Первый представляет собой публичную строку, которую использует интерфейс API для определения достоверности программы. И для генерации отдельных URL, куда направляются авторизованные пользователи. Секрет используют при аутентификации в API, поэтому он открыт только интерфейсу и программе.
Система OAuth 2 предполагает четыре варианта запроса авторизации исходя из ситуации:
Теперь рассмотрим варианты подробнее.
Наиболее популярный тип предоставления авторизации, т.к. удобен для программ, когда исходный код и секрет клиента размещены на защищенном сервере и недоступны для посторонних. Важно, чтобы программа была способна взаимодействовать с веб-браузером или иным агентом пользователя, в том числе принимать коды авторизации по API.
Предоставим пользователю ссылку:
https://cloud.example.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
Ссылка состоит из компонентов:
При нажатии на сформированную ссылку сначала происходит вход в систему, где личность подтверждается (или нет). И по результату происходит авторизация приложения или отказ в ней.
При выборе варианта «Авторизовать приложение» система перенаправит браузер по ссылке, какую мы внесли на шаге регистрации пользователя. Ссылка будет выглядеть так:
https://example.com/callback?code=AUTHORIZATION_CODE
Программа отправляет на сервер код авторизации и информацию для аутентификации, включая секрет клиента. Пример POST-запроса:
https://cloud.example.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL
При успешной авторизации система API вернет токен доступа. Ответ будет выглядеть следующим образом:
{"access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read","uid":100101,"info":{"name":"User","email":"info@example.com"}}
Все, программа подключилась к серверу.
Вариант авторизации применяют в мобильных приложениях, ресурсах, доступных через окно веб-браузера. Отличие от предыдущего – нет гарантий конфиденциальности секрета клиента. Метод базируется на передаче токена доступа пользователю и далее приложению. Он будет доступным и другим программам на смартфоне-планшете. Есть еще одна особенность: нет проверки софта на подлинность, не поддерживаются токены обновления доступа.
Процедура коннекта выглядит так: ПО запрашивает у пользователя данные авторизации, при успехе сервер передает токен доступа браузеру или приложению. После этого можно пользоваться функционалом программы или онлайн-сервиса.
Сервис авторизации предлагает ссылку (сначала ее запрашивают через API на сервере). Ее вид схож с предыдущим вариантом всего с одним исключением – вместо кода система запрашивает токен.
https://cloud.example.com/v1/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
Первое, что должен сделать пользователь после нажатия ссылки – это произвести вход в систему, чтобы подтвердить личность (при первом входе, если данные ранее не были сохранены). Исходя из корректности введенных данных сервер либо подтверждает вход, либо возвращает отказ.
Выбор пункта «Авторизовать приложение» вызывает функцию перенаправления с применением токена доступа. Это выглядит так:
https://example.com/callback#token=ACCESS_TOKEN
Браузер пользователя (или иной пользовательский агент) автоматически переходит по указанному пути, в процессе происходит сохранение токена доступа.
Программа вернет страницу, содержащую скрипт для сохранения токена доступа из полной ссылки, сохраненной веб-браузером.
Браузер автоматически запустит скачанный скрипт и передаст извлеченный токен программе. Все, процесс авторизации закончен. Токен будет действовать в течение заданного времени или до момента его принудительного отзыва.
Вариант предполагает ввод данных авторизации пользователя напрямую в сервисе (логин и пароль). Приложение самостоятельно отправляет их на сервер для подключения к активным сервисам. Этот способ применяют только при технической недоступности двух предыдущих. Например, когда само запускаемое приложение является частью сервиса или операционки, а не пользовательским решением.
Пользователь вводит учетные данные при запросе приложения. Оно запрашивает у сервера токен доступа, запрос выглядит так:
https://oauth.example.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID
При корректности введенных данных сервер автоматически возвращает запрошенный токен. Все, процедура авторизации завершена.
Вариант подразумевает открытие доступа к собственным ресурсам сервиса после ввода корректных логина-пароля. Это иногда необходимо, например, для обновления регистрационной информации или организации доступа к иным данным, размещенным на сервере.
Программа запросит токен доступа путем направления идентификационных данных и секрета клиента на сервер, предназначенный для подтверждения авторизации. Запрос выглядит так:
https://oauth.example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
При корректности введенных данных пользовательскому приложению будет возвращен токен для доступа к сервисам. Процедура завершена.
После получения токена доступа программа может обращаться к аккаунту по API с учетом запретов вроде «только для чтения». Такая возможность доступна вплоть до истечения срока действия или запроса на отзыв токена. Приведем пример обращения по API с применением curl:
curl -X POST -H "Authorization: Bearer ACCESS_TOKEN""https://api.example.com/v2/$OBJECT"
При наличии достоверного токена API проведет обработку направленного запроса. При ошибке, например из-за просрочки или повреждения файла, интерфейс вернет сообщение об ошибке Invalid Request.
Последнего можно избежать, если своевременно обновлять модули авторизации. Для этого следует предусмотреть запросы типа:
https://cloud.example.com/v1/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN
По результату приложение получит обновление токена доступа и сможет продолжать работу с удаленными сервисами без повторной авторизации.
Мы завершили рассмотрение способов, как использовать OAuth в приложениях в зависимости от их особенностей. Теперь пользователь имеет представление, каким образом осуществляется доступ к удаленным сервисам, какие детали необходимо учитывать при выборе метода обращения к серверу. В качестве тестовой площадки можно использовать облачные ресурсы провайдера Timeweb Cloud.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.