IDPMR Developer Войти
ПОМОЩЬ

Как пользоваться порталом разработчика

Портал даёт вам управлять своими приложениями и доступом ваших пользователей на едином провайдере входа IDPMR. Ниже — путь от нуля до работающего приложения.

  1. 1

    Станьте разработчиком

    Войдите и на главной нажмите «Стать разработчиком». Это включает вам доступ к консоли. Роль разработчика также может выдать администратор.

  2. 2

    Создайте приложение

    Раздел «Приложения» → форма создания. Укажите название, при необходимости — Redirect URIs и scopes. Портал сгенерирует ClientId и секрет — секрет показывается один раз, сохраните его сразу.

    Владельцем приложения становитесь вы — оно видно только вам (и администратору).
  3. 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. 4

    Оформите приложение

    На странице приложения («Настроить»): загрузите логотип (не меньше 512×512 — будет уменьшен до 512×512) и описание в Markdown. И логотип, и описание показываются пользователю на форме входа. Здесь же — время жизни токенов и переключатель reference-токенов.

  5. 5

    Опишите роли и claims

    Для каждого приложения задайте роли и claims (тип + значение) — это права, которые попадут в токен пользователя при входе в ваше приложение. Claims одного приложения не видны другим.

  6. 6

    Назначьте их пользователям

    На странице приложения назначьте роль или claim конкретному уже зарегистрированному пользователю — по sub, логину или email. При следующем входе в ваше приложение пользователь получит их в токене.

    Портал не создаёт пользователей — только находит существующих и выдаёт им доступ к вашему решению.
  7. 7

    Объединяйте в группы (по желанию)

    Раздел «Группы» даёт двум связанным приложениям два общих ресурса. Первое — приложения группы могут вызывать API друг друга: клиент запрашивает scope соседа (other-app.read), и токен получает его аудиторию. Доступ действует, пока приложение в группе.

    Второе (опционально, флажок «claims группы» в настройках приложения) — в токен добавляются claims/роли пользователя из соседних приложений группы с префиксом источника: other-app.role, other-app.department. По умолчанию флажок выключен. Стандартные OIDC-claims профиля (sub, name, email…) всегда плоские и выдаются по scope openid/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. 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

Как вызвать 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, гранты.
ЭндпоинтыScopeClaimТип токена
/api/v1/*
свои роли и claims — пользователям
claims.manage приложение · client_credentials
/api/v1/dev/*
консоль разработчика
developer.console developer пользователь-разработчик
/api/v1/clients/{clientId}/logo
логотип приложения
без токена (публично)
Доступ к самому Identity API даёт системный scope (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 от вашего имени.

Частые вопросы

Не вижу консоль после входа. Нажмите «Стать разработчиком» на главной — доступ включается сразу.
Потерял секрет приложения. Его нельзя показать повторно (хранится хэшем) — на странице приложения нажмите «Перевыпустить секрет».
Reference-токен не проходит в моё API. Reference-токены непрозрачны — проверяются через introspection, а не как JWT. Ваш API аутентифицируется на introspection как ресурс: 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 — нет.
Claim не появился в токене. Убедитесь, что назначили его нужному пользователю и что он входит именно в ваше приложение — claims привязаны к конкретному client.
Вижу только свои приложения. Так и задумано — вы владелец. Чужие приложения недоступны.