Как пользоваться порталом разработчика
Портал даёт вам управлять своими приложениями и доступом ваших пользователей на едином провайдере входа IDPMR. Ниже — путь от нуля до работающего приложения.
- 1
Станьте разработчиком
Войдите и на главной нажмите «Стать разработчиком». Это включает вам доступ к консоли. Роль разработчика также может выдать администратор.
- 2
Создайте приложение
Раздел «Приложения» → форма создания. Укажите название, при необходимости — Redirect URIs и scopes. Портал сгенерирует
ClientIdи секрет — секрет показывается один раз, сохраните его сразу.Владельцем приложения становитесь вы — оно видно только вам (и администратору). - 3
Выберите grant types
Grant type определяет, как приложение получает токены. Кратко:
authorization_codeВеб/SPA/мобильные — вход пользователя. Обычно с PKCE.client_credentialsСервис-к-сервису, без пользователя. Нужен секрет.refresh (offline_access)Продление сессии без повторного входа.device_codeУстройства без браузера (TV, IoT).token-exchangeОбмен токена — вызов другого API от имени пользователя.hybridГибридный поток. Взаимоисключающий с authorization_code.Интерактивные (authorization_code / hybrid) нельзя комбинировать — портал сам блокирует несовместимые. PKCE применяется только к ним. - 4
Оформите приложение
На странице приложения («Настроить»): загрузите логотип (не меньше 512×512 — будет уменьшен до 512×512) и описание в Markdown. И логотип, и описание показываются пользователю на форме входа. Здесь же — время жизни токенов и переключатель
reference-токенов. - 5
Опишите роли и claims
Для каждого приложения задайте роли и claims (тип + значение) — это права, которые попадут в токен пользователя при входе в ваше приложение. Claims одного приложения не видны другим.
- 6
Назначьте их пользователям
На странице приложения назначьте роль или claim конкретному уже зарегистрированному пользователю — по
sub, логину или email. При следующем входе в ваше приложение пользователь получит их в токене.Портал не создаёт пользователей — только находит существующих и выдаёт им доступ к вашему решению. - 7
Объединяйте в группы (по желанию)
Раздел «Группы» даёт двум связанным приложениям два общих ресурса. Первое — приложения группы могут вызывать API друг друга: клиент запрашивает scope соседа (
other-app.read), и токен получает его аудиторию. Доступ действует, пока приложение в группе.Второе (опционально, флажок «claims группы» в настройках приложения) — в токен добавляются claims/роли пользователя из соседних приложений группы с префиксом источника:
other-app.role,other-app.department. По умолчанию флажок выключен. Стандартные OIDC-claims профиля (sub,name,email…) всегда плоские и выдаются по scopeopenid/profile/email.Как читать роли/claims: если токен выдан одному API (обычный случай) — они плоские (
role,department), стандартный[Authorize(Roles=…)]работает без настройки. Если же токен запрошен сразу под несколько API (audсодержит больше одного) — плоская роль была бы неоднозначной (чья именно?), поэтому каждая роль/claim префиксуется владельцем:my-app.role,other-app.role. Тогда читайте свои по своему client_id. Универсальное правило ниже покрывает оба случая.// Универсально: плоскую роль (одна аудитория) ИЛИ свою префиксную (несколько аудиторий) var myId = "my-app-1a2b"; var myRoles = User.FindAll("role").Select(c => c.Value) .Concat(User.FindAll(myId + ".role").Select(c => c.Value)); var dept = User.FindFirst("department")?.Value ?? User.FindFirst(myId + ".department")?.Value; // Роль пользователя в СОСЕДНЕМ приложении — всегда по его префиксу: var partnerRole = User.FindFirst("partner-app.role")?.Value;
- 8
Управляйте доступом из кода
То же самое можно делать программно из вашего backend через Identity API. Приложение получает токен по client-credentials (scope
claims.manage) и назначает claims своим пользователям — например, сразу после регистрации или оплаты.# 1) получить токен приложения curl -X POST https://id.local/connect/token \ -d "grant_type=client_credentials&client_id=$ID&client_secret=$SECRET&scope=claims.manage" # 2) выдать пользователю claim curl -X POST https://id.local/api/v1/users/user@mail/claims?by=email \ -H "Authorization: Bearer $TOKEN" \ -d '{"type":"plan","value":"pro"}'
Ответ единообразный ({"status":"accepted"}) независимо от того, существует ли пользователь — это защита от перечисления. Диагностика доступна администратору в журнале.
Как вызвать Identity API: scopes, роли и claims
Всё, что портал делает через интерфейс, доступно и программно — через Identity API (REST).
Своё приложение как «клиента API» регистрировать не нужно: API только проверяет ваш обычный
JWT access-token IDPMR — его подпись публичным ключом провайдера, издателя (iss) и аудиторию
aud=idpmr-claims-api. Кто и что может вызывать, определяют два системных scope:
claims.manage
Приложение управляет своими ролями и claims.Поток —
client_credentials (backend, нужен client_id + секрет).Scope включает администратор в AdminUI (флажок «Разрешить самоуправление claims»); вместе с ним добавляются grant
client_credentials и секрет.Область —
/api/v1/*: назначать и снимать роли/claims своим пользователям.
developer.console
Разработчик управляет своими приложениями.Поток — пользовательский токен разработчика (интерактивный вход).
Нужен claim
developer (кнопка «Стать разработчиком» или администратор) и scope
developer.console. Так работает сам портал — токен он получает за вас.Область —
/api/v1/dev/*: клиенты, группы, scopes, гранты.
| Эндпоинты | Scope | Claim | Тип токена |
|---|---|---|---|
/api/v1/*свои роли и claims — пользователям |
claims.manage |
— | приложение · client_credentials |
/api/v1/dev/*консоль разработчика |
developer.console |
developer |
пользователь-разработчик |
/api/v1/clients/{clientId}/logoлоготип приложения |
— | — | без токена (публично) |
claims.manage / developer.console) и claim developer — это
не те роли и claims, что вы заводите для своих приложений (те попадают в токены ваших
пользователей и к вызову Identity API отношения не имеют). Отдельной «роли» для вызова нет./api/v1/dev/* дополнительно проверяют владение: вы управляете
только своими приложениями (сверяется owner_sub = ваш sub). Системные клиенты
IDPMR (idpmr-admin-ui, idpmr-devportal) через Identity API недоступны.Пример получения токена под claims.manage и вызова — в шаге 8 выше.
Для developer.console отдельный токен добывать не нужно: портал вызывает Identity API от вашего имени.
Частые вопросы
ClientId = ваш client_id,
а ClientSecret — introspection-секрет ресурса (его выдаёт администратор в AdminUI на карточке приложения при включённом «Reference token»).
// Ваш API: принимать И JWT, И reference-токены (introspection) // dotnet add package IdentityModel.AspNetCore.OAuth2Introspection services.AddAuthentication("token") .AddJwtBearer("jwt", o => o.Authority = ISSUER) // JWT — локально .AddOAuth2Introspection("introspection", o => { o.Authority = ISSUER; o.ClientId = "my-app-1a2b"; // = ваш client_id (имя ресурса) o.ClientSecret = SECRET; // introspection-секрет ресурса }); // Схему выбирайте по формату токена: JWT содержит две точки, reference — нет.