Авторизация по протоколу OAuth 2.0 в интеграциях

Авторизация по протоколу OAuth 2.0 в интеграциях

В интеграциях с внешними приложениями часто используется протокол OAuth 2.0. Он позволяет приложению получить доступ к данным пользователя без передачи пароля. В этой статье разбирается практический сценарий: получение access_token , обновление токена, работа с ошибками и использование токена аккаунта для фоновых операций.

Подробная диаграмма последовательности процесса авторизации.

Далее описан алгоритм авторизации по протоколу OAuth 2.0.

1 Инициация - получение параметров аккаунта

Пользователь переходит из страницы настройки интеграции в стороннее приложение. В URL передаются параметры аккаунта: account_id и account_name

Стороннее приложение сохраняет account_id (идентификатор аккаунта) и account_name (наименование аккаунта). Они потребуются при создании подключения и получении токена аккаунта.

2 Перенаправление на сервер аутентификации

Приложение перенаправляет пользователя на сервер аутентификации для получения кода авторизации — authorization code :

Параметры запроса:

client_id

Идентификатор стороннего приложения

redirect_uri

URL, на который сервер авторизации перенаправляет пользователя после успешной авторизации.

scope

Запрашиваемые права стороннего приложения

state

Защита от подделки

После успешного входа сервер возвращает временный код авторизации, который может быть использован только один раз — authorization code . Время жизни кода ограничено.

3 Получение access_token и refresh_token (обмен кода на токены)

Сервер стороннего приложения выполняет POST-запрос к серверу аутентификации:

Параметры запроса:

code

Временный код, полученный на предыдущем шаге

grant_type

authorization_code

redirect_uri

URL возврата (должен совпадать с указанным ранее)

В ответе приходит json с access_token и refresh_token . Формат успешного ответа, если access_token получен:

Параметры ответа:

token_type

user_id

Уникальный идентификатор пользователя

expires_in

Время жизни access_token в секундах

expires_at

Дата и время истечения access_token

access_token

Токен доступа (короткоживущий, обычно 1 час)

refresh_token

Токен для обновления access_token (долгоживущий)

refresh_expires_in

Время жизни refresh_token в секундах

refresh_expires_at

Дата и время истечения refresh_token

Формат ответа при ошибке

После получения access_token приложение создаёт подключение в ресурсном сервере:

В случае успешного запроса, в ответе вернется app_id — идентификатор подключения.

Срок жизни access_token ограничен. После истечения срока жизни токена пользователю необходимо вновь пройти авторизацию. Чтобы не проходить авторизацию заново, когда access_token истекает, его обновляют через refresh_token . refresh_token всегда выдается с access_token в одном ответе.

В результате токен обновится или появится информация об ошибке.

После получения access_token приложение создаёт подключение в ресурсном сервере с помощью запроса:

В случае успешного запроса, в ответе вернется app_id — идентификатор подключения.

5 Токен аккаунта для фоновых процессов

После получения пользовательского access_token и refresh_token возникает вопрос: что делать, если интеграции нужно работать в фоне — без участия пользователя? В таких случаях используется токен аккаунта ( account_token ).

Без токена аккаунта фоновые операции привязаны к конкретному пользователю. Если пользователь выйдет из системы или его сессия истечёт — интеграция перестанет работать. Токен аккаунта привязан не к пользователю, а к аккаунту, и может работать независимо.

Пример запроса на получение access_token аккаунта

Что важно учесть

Для фоновых операций используй токен аккаунта — он не привязан к сессии пользователя и подходит для автоматических сценариев.

Для фоновых операций используй токен аккаунта — он не привязан к сессии пользователя и подходит для автоматических сценариев.

access_token имеет ограниченный срок жизни — следует обновлять его заранее через refresh_token , чтобы избежать сбоев в работе интеграции

access_token имеет ограниченный срок жизни — следует обновлять его заранее через refresh_token , чтобы избежать сбоев в работе интеграции

Не выводить токены в логи

Не выводить токены в логи

Заложить права доступа не только на сервере, но и в приложении, чтобы корректно обрабатывать ошибки

Заложить права доступа не только на сервере, но и в приложении, чтобы корректно обрабатывать ошибки

← Cybersecurity