Appearance
Регистрация и настройка OAuth-клиента
OAuth-клиент — это запись, которая представляет ваше приложение перед SSO-сервером: по ней проверяется, кто запрашивает вход, куда можно редиректить пользователя и какие данные о нём отдавать. Один клиент обычно соответствует одному приложению или одному направлению интеграции (веб-версия и CLI одного продукта могут быть как одним клиентом, так и двумя — в зависимости от того, нужны ли им разные redirect URI и разный набор scope).
Создание клиента
GET /admin/clients/new
POST /admin/clients/newДоступно org-admin (клиент создаётся сразу в вашей организации, поле organizationId подставляется автоматически и недоступно для редактирования) и глобальному администратору.
Поля формы
| Поле | Обязательно | Описание |
|---|---|---|
name | ✓ | Название приложения — показывается пользователю на экране согласия и на странице входа |
description | — | Внутреннее описание, не показывается пользователю |
website | — | Ссылка на сайт приложения |
redirectUris | ✓ | Список разрешённых redirect URI, по одному на строку. Точное совпадение — без него /authorize отклонит запрос |
allowedScopes | — | Список scope через пробел, которые клиент вправе запрашивать. Пусто — разрешены все. Применяется и к Authorization Code, и к Client Credentials. Какие scope есть и когда какой запрашивать — reference/appendix-scopes.md |
status | ✓ | active или suspended. У приостановленного клиента /authorize и /token отвечают ошибкой — используйте для временного отключения интеграции без удаления клиента |
client_id генерируется автоматически и не редактируется. client_secret — тоже автоматически, показывается один раз на странице клиента после создания (см. ниже).
Логаут-эндпоинты (опционально)
Заполняются, если ваше приложение должно узнавать о выходе пользователя со стороны SSO — подробный протокол в 03-web-app.md.
| Поле | Описание |
|---|---|
backchannelLogoutUri | URL, на который SSO пришлёт server-to-server уведомление о выходе |
frontchannelLogoutUri | URL, который SSO подгрузит скрытым iframe на странице выхода |
postLogoutRedirectUris | Список URI, куда можно вернуть пользователя после выхода (по одному на строку). Redirect за пределы этого списка игнорируется — защита от open redirect |
Брендирование страницы входа
Применяется только к страницам OAuth-потока (/login, /consent) — не к личному кабинету (/account).
| Поле | Описание |
|---|---|
logoUrl | URL логотипа |
brandName | Название, если должно отличаться от name |
primaryColor | Hex-цвет кнопок и акцентов, например #667eea |
Получение client_id и client_secret
После создания клиента откройте его страницу /admin/clients/:id — там указан client_id (тот же, что в списке /admin/clients) и client_secret в открытом виде. Секрет нигде больше не показывается в незашифрованном виде — сохраните его сразу в свой секрет-менеджер. Что делать, если секрет утёк или потерян, — 06-operations.md.
Issuer сервера и полный список эндпоинтов — в discovery-документе:
bash
curl http://localhost:3002/.well-known/openid-configurationСверьте authorization_endpoint, token_endpoint, jwks_uri и end_session_endpoint с тем, что собираетесь использовать в интеграции — это тот же issuer, что и в iss claim ваших токенов.
Редактирование позже
GET /admin/clients/:id
POST /admin/clients/:idТа же форма, что при создании, — с уже заполненными значениями. client_id показан, но не редактируется. Организация клиента, если она была задана при создании, тоже зафиксирована и не меняется через эту форму.
org-admin не видит и не может открыть клиентов из чужой организации — /admin/clients/:id вернёт 403.
RBAC-клеймы в токене
Если приложению нужно знать роли и группы пользователя внутри SSO (например, чтобы отобразить разный интерфейс для разных ролей), запросите scope roles:
scope=openid profile rolesВ access token, ID token и ответе /userinfo появятся:
json
{
"roles": ["admin", "pam_approver"],
"groups": ["engineering"]
}Если клиент привязан к организации — токен дополнительно содержит org_id (см. 01-organization-and-access.md).
roles/groups относятся к самому SSO — это роли уровня Identity Provider, а не роли внутри вашего приложения. Используйте этот клейм как источник данных для собственной модели прав, а не как готовую замену ей.