Выход
Завершите сессию пользователя в VoxKey и верните браузер в своё приложение по OIDC RP-Initiated Logout.
1. Зарегистрируйте, куда можно вернуть пользователя
VoxKey возвращает браузер только на адрес, который приложение зарегистрировало заранее. Незарегистрированный адрес не принимается никогда.
В админ-панели: откройте приложение → Настройки → URI возврата после выхода → добавьте адрес → Сохранить изменения.
Через Management API:
curl -X PATCH https://your-domain.com/api/v1/{realmUUID}/applications/{appId} \
-H "Authorization: Bearer $M2M_TOKEN" \
-H "Content-Type: application/json" \
-d '{"post_logout_redirect_uris": ["https://app.example.com/logout-callback"]}'
Список заменяет предыдущий целиком. Каждый элемент — полный URL.
Адрес сравнивается побуквенно: схема, хост, порт, путь, завершающий слэш. https://app.example.com/logout-callback и https://app.example.com/logout-callback/ — два разных адреса.
У машинных (M2M) приложений нет браузера, который нужно вернуть, поэтому им эта настройка не предлагается.
2. Отправьте браузер на end-session эндпоинт
Адрес эндпоинта опубликован в discovery-документе realm'а как end_session_endpoint:
GET https://your-domain.com/oauth2/{realmUUID}/logout
?id_token_hint={id_token}
&post_logout_redirect_uri=https://app.example.com/logout-callback
&state={opaque_value}
| Параметр | Обязателен | Смысл |
|---|---|---|
id_token_hint | да, чтобы вернуться в приложение | ID-токен, который VoxKey выдал этому пользователю для вашего приложения. Доказывает, какое приложение просит, и что завершается сессия именно этого пользователя. |
post_logout_redirect_uri | нет | Один из зарегистрированных адресов. |
state | нет | Вернётся вам без изменений при редиректе. |
client_id | нет | Если передан, должен совпадать с приложением, которому выдан id_token_hint. |
Что происходит
| Запрос | Результат |
|---|---|
Валидный id_token_hint, зарегистрированный post_logout_redirect_uri | Сессия завершена, браузер возвращён на этот адрес вместе со state |
Валидный id_token_hint, без post_logout_redirect_uri, зарегистрирован хотя бы один адрес | Сессия завершена, браузер возвращён на первый зарегистрированный адрес |
Валидный id_token_hint, адрес не зарегистрирован | Сессия завершена, браузер отправлен на страницу входа realm'а; в лог пишется warning |
Валидный id_token_hint, не зарегистрировано ничего | Сессия завершена, браузер отправлен на страницу входа realm'а |
client_id не совпадает с приложением из id_token_hint | Отказ, сессия не трогается |
Нет id_token_hint | VoxKey не может понять, кто просит, поэтому сессию не трогает и просит пользователя подтвердить выход на странице realm'а. post_logout_redirect_uri не используется. |
Последняя строка сделана намеренно: ссылка, которая завершает сессию без доказательства, — это ссылка, которую кто угодно может поставить на любую страницу. Спецификация просит провайдера в этом случае спросить пользователя, и VoxKey спрашивает.
Если что-то не так
Пользователь всегда попадает на страницу входа VoxKey. Адрес из post_logout_redirect_uri не зарегистрирован у этого приложения или отличается от зарегистрированного (проверьте завершающий слэш и схему). VoxKey пишет об этом в лог: Logout asked for a post-logout address the client did not register.
Пользователя просят подтвердить выход. В запросе не было id_token_hint — или он выдан другим realm'ом или другому пользователю, не тому, кто сейчас вошёл. Просроченный id_token_hint принимается: он всё равно говорит, кто просит.