Связанный выход пользователя (Logout Endpoint)

Связанный выход пользователя позволяет завершить сессии авторизации по всех связанных с провайдером проектах. Выход выполняется через браузер пользователя.

Особенности:

  • Средняя сложность интеграция.
  • Подойдет всем проектам.

Как это работает:

  • Клиентское приложение при авторизации пользователя хранит его токен доступа в сессии/куки.
  • Во время выхода пользователя из учетной записи на стороне клиентского приложения необходимо перенаправить пользователя на специальный эндпоинт выхода (Logout Endpoint).
  • Сервис авторизации для уже авторизованного пользователя выведет окно подтверждения.
  • На странице подтверждения пользователь может выбрать нужное ему действие: продолжить или отмена для возврата.
  • После любого выбора пользователь вернется в приложение клиента.
  • Если выход подтверждается пользователем, то клиентское приложение должно прервать и удалить сессию/куки вместе с токеном доступа.

Перед завершением сессии сервер проверяет:

  • Существование OAuth2-клиента.
  • Корректность post_logout_redirect_uri.
  • Принадлежность post_logout_redirect_uri зарегистрированному клиенту.
  • Корректность параметров запроса.

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

Поддерживается передача параметра state. Если он присутствовал в исходном запросе, он всегда возвращается клиенту без изменений.

  1. Пользователь открывает logout endpoint.
  2. Перенаправьте пользователя на logout [GET] /oauth2/logout и передайте необходимые параметры.
  3. Если параметры корректны и пользователь авторизован, отображается страница подтверждения выхода.
  4. Пользователь подтверждает logout.
  5. Система обрабатывает подтверждение:
    • Пользовательская сессия завершается.
    • Выполняется logout.
    • Пользователь перенаправляется на post_logout_redirect_uri.

Если на шаге 4 пользователь отменяет logout (нажимает Cancel):

  • Сессия не завершается.
  • Пользователь перенаправляется обратно в клиентское приложение со статусом отмены.

Для использования logout необходимо зарегистрировать список допустимых URI возврата (который затем передается в поле post_logout_redirect_uri).

Допускается регистрация одного или нескольких URI.

Во время обработки logout значение post_logout_redirect_uri, переданное клиентом, должно полностью совпадать с одним из зарегистрированных URI.

Пример значений:

  • https://client.example.com/logout
  • https://client.example.com/auth/logout
  • https://localhost:3000/logout

Если URI отсутствует в списке зарегистрированных адресов, сервер возвращает ошибку invalid_client.

Проверить глобальные настройки сервиса и адреса (endpoint) можно по адресу: https://login.softline.ru/.well-known/openid-configuration. Это общая для всех сервисов информация.

Endpoint: https://{instance}/oauth2/logout

Метод: GET

Описание: запускает завершение авторизованного доступа пользователя.

client_id
string
required
Идентификатор клиентского приложения.
post_logout_redirect_uri
string
required
URI, на который необходимо вернуть пользователя после logout.
Перед обработкой запроса сервер выполняет следующие проверки.
  • Параметр присутствует в запросе.
  • URI является абсолютным.
  • Используется схема http или https.
  • URI зарегистрирован у указанного клиента в списке post_logout_redirect_uris.
Если хотя бы одна проверка не проходит, запрос завершается ошибкой.
state
string
optional
Уникальный идентификатор состояния для предотвращения атак.
Если передан, то будет возвращен в ответе. Используйте его чтобы подтвердить подлинность ответа.
status
Результат выполнения действия. Возвращается, если обработка была завершена.
Возможные значения:
  • logout_successful - успешный logout.
  • user_cancelled - пользователь отменил logout.
state
string
Уникальный идентификатор состояния для предотвращения атак.
Должен соответсвовать параметру state из вашего запроса. Соответствие подтверждает, что вы получили ответ на отправленный вами запрос.
error
string
Код ошибки.
Параметр передается только в случае ошибки.
Возможные значения:
  • invalid_request - некорректные параметры запроса:
    • отсутствует client_id и/или post_logout_redirect_uri;
    • URI имеет неверный формат;
    • URI использует неподдерживаемую схему.
  • invalid_client - невозможно использовать указанный OAuth2-клиент:
    • переданный client_id не найден;
    • переданный client_id отозван (revoked);
    • post_logout_redirect_uri не зарегистрирован у клиента.
error_description
Текстовое описание ошибки.
Параметр передается только в случае ошибки.
Возможные значения:
  • Для ошибки invalid_request
    • client_id is required
    • post_logout_redirect_uri is required
    • Invalid post_logout_redirect_uri format
    • post_logout_redirect_uri must use http or https scheme
  • Для ошибки invalid_client
    • Client not found
    • Invalid client_id
    • post_logout_redirect_uri is not registered for this clien

В случае успешного logout, пользователь будет перенаправлен на redirect_uri со статусом logout_successful.

Например, если redirect_uri равен "https://localhost/logout", то пользователь будет перенаправлен на:

https://localhost/logout?status=logout_successful&state=s761MQGea2Yt...

Если logout был отменен пользователем, то он будет перенаправлен на redirect_uri со статусом user_cancelled.

Например, если redirect_uri равен "https://localhost/logout", то пользователь будет перенаправлен на:

https://localhost/logout?status=user_cancelled&state=s761MQGea2Yt...

Ответ на ошибку зависит от того, смог ли сервер определить безопасный post_logout_redirect_uri, на который нужно вернуть ответ.

  • Если безопасный post_logout_redirect_uri определен, то пользователь перенаправляется обратно в клиентское приложение.
    Например, если redirect_uri равен "https://localhost/logout", то пользователь будет перенаправлен на:
    [HTTP 302] https://localhost/logout?error=invalid_client&error_description=Client+not+found&state=s761MQGea2Yt...
  • Если безопасный post_logout_redirect_uri определить не удалось, то сервер возвращает [HTTP 401] и JSON
    Например, отсутствует `post_logout_redirect_uri`:
    {
     "error": "invalid_request",
     "message": "post_logout_redirect_uri is required"
    }