Росреестр и другие ведомства


Сведения Росреестра и других ведомств: недвижимость в собственности, полис ОМС, студенческий билет, удостоверение государственного гражданского служащего, сведения об учителе. Подробный кейс: недвижимость (подстраница).

Общий механизм (согласие, шаги конвейера, состояния ответа) описан на странице «Цифровой профиль ФЛ: все виды сведений и реализация».

Виды сведений

Сведениеdoc_typeОбласть доступаФорматПримечание
Недвижимость в собственностиREG_REALESTATEreg_realestateXML, ZIPподробно: кейс 8.7.5.1
Полис ОМС и прикрепление к медицинской организацииMDCL_PLCYmedical_docXML
Полис ОМС ребёнкаKID_MDCL_PLCYkid_medical_docXML
Удостоверение государственного гражданского служащегоSERVANTservantXML
Студенческий билетSTUDENT_TICKETstudent_ticketJSON
Сведения об учителеTEACHER_CERTIFICATEteacher_certificateJSON

Права и согласие

Параметр permissions в redirectForm (перед кодированием — JSON-массив). В запросе авторизации в scope остаётся только openid. В scopes указываются только необходимые области.

[
  {
    "sysname": "<ТИП_СОГЛАСИЯ>",
    "scopes": [
      {
        "sysname": "reg_realestate"
      },
      {
        "sysname": "medical_doc"
      },
      {
        "sysname": "kid_medical_doc"
      },
      {
        "sysname": "servant"
      },
      {
        "sysname": "student_ticket"
      },
      {
        "sysname": "teacher_certificate"
      }
    ],
    "purposes": [
      {
        "sysname": "<ЦЕЛЬ>"
      }
    ],
    "actions": [
      {
        "sysname": "ALL_ACTIONS_TO_DATA"
      }
    ],
    "responsibleObject": "<ФИО_ИЛИ_ПОДРАЗДЕЛЕНИЕ>",
    "expire": "<СРОК_В_МИНУТАХ>"
  }
]

Шаги запросов

Шаги конвейера после проверки токена и is_trusted. В конвейер включаются только необходимые виды сведений: каждый шаг — отдельный запрос к ЕСИА.

[
  {
    "t": 0,
    "r": "person",
    "m": "GET",
    "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}",
    "h": {
      "Authorization": "Bearer {{.token.access_token}}"
    }
  },
  {
    "t": 0,
    "r": "reg_realestate",
    "m": "GET",
    "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/REG_REALESTATE",
    "h": {
      "Authorization": "Bearer {{.token.access_token}}"
    }
  },
  {
    "t": 0,
    "r": "mdcl_plcy",
    "m": "GET",
    "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/MDCL_PLCY",
    "h": {
      "Authorization": "Bearer {{.token.access_token}}"
    }
  },
  {
    "t": 0,
    "r": "kid_mdcl_plcy",
    "m": "GET",
    "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/KID_MDCL_PLCY",
    "h": {
      "Authorization": "Bearer {{.token.access_token}}"
    }
  },
  {
    "t": 0,
    "r": "servant",
    "m": "GET",
    "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/SERVANT",
    "h": {
      "Authorization": "Bearer {{.token.access_token}}"
    }
  },
  {
    "t": 0,
    "r": "student_ticket",
    "m": "GET",
    "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/STUDENT_TICKET",
    "h": {
      "Authorization": "Bearer {{.token.access_token}}"
    }
  },
  {
    "t": 0,
    "r": "teacher_certificate",
    "m": "GET",
    "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/TEACHER_CERTIFICATE",
    "h": {
      "Authorization": "Bearer {{.token.access_token}}"
    }
  }
]

Состояние ответа

JavaScript-шаг определяет состояние каждого ответа (yes, pending, NO_CONSENT, error, no):

{
  "reg_realestate_status": "r = \"no\"; d = reg_realestate; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
  "mdcl_plcy_status": "r = \"no\"; d = mdcl_plcy; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
  "kid_mdcl_plcy_status": "r = \"no\"; d = kid_mdcl_plcy; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
  "servant_status": "r = \"no\"; d = servant; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
  "student_ticket_status": "r = \"no\"; d = student_ticket; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
  "teacher_certificate_status": "r = \"no\"; d = teacher_certificate; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;"
}

Отображение в атрибуты

{
  "fn": "{{.person.firstName}}",
  "ln": "{{.person.lastName}}",
  "mn": "{{.person.middleName}}",
  "un": "",
  "e": "",
  "p": "",
  "l": "",
  "xid": "",
  "rid": "state",
  "x": {
    "reg_realestate_status": "{{.reg_realestate_status}}",
    "mdcl_plcy_status": "{{.mdcl_plcy_status}}",
    "kid_mdcl_plcy_status": "{{.kid_mdcl_plcy_status}}",
    "servant_status": "{{.servant_status}}",
    "student_ticket_status": "{{.student_ticket_status}}",
    "teacher_certificate_status": "{{.teacher_certificate_status}}"
  }
}

Особенности

  • Файлы выписок недвижимости получаются отдельными методами .../extraction, .../{doc_id}/file (XML) и архивом всех объектов (ZIP).
  • Студенческий билет и сведения об учителе возвращаются в формате JSON; остальные виды — XML.
  • Для запроса данных ребёнка (KID_MDCL_PLCY) используется область kid_medical_doc.

Подробный кейс: недвижимость (подстраница раздела).

Полный пример конфигурации

Файл конфигурации внешнего провайдера (extidp.json) целиком. Значение typeDetails — строка с JSON; значения в <...> задаются при настройке.

[
  {
    "id": "<UUID_ПРОВАЙДЕРА>",
    "redirectMethod": 0,
    "authorizeUri": "{{.extidp_details.baseUrl}}/aas/oauth2/v2/ac",
    "logoutRedirectMethod": 0,
    "logoutUri": "{{.extidp_details.baseUrl}}/aas/oauth2/api/logout",
    "logoutForm": {
      "redirect_url": "https://<адрес-после-выхода>",
      "client_id": "{{ .extidp_details.clientID }}"
    },
    "type": "esia",
    "name": "dp-other",
    "synonym": "esia",
    "typeDetails": "{\n  \"baseUrl\": \"https://esia-portal1.test.gosuslugi.ru\",\n  \"clientCertHash\": \"<ХЕШ_СЕРТИФИКАТА_ГОСТ_Р_34.11-2012_256>\",\n  \"clientID\": \"<MNEMONIC_ИС_В_ЕСИА>\",\n  \"cryptoProvider\": {\n    \"name\": \"cprocsp_raw\",\n    \"details\": {\n      \"certPath\": \"/opt/esia-adapter/certs/<сертификат_ИС>.cer\",\n      \"containerName\": \"<ИМЯ_КОНТЕЙНЕРА>\",\n      \"containerPIN\": \"<PIN_КОНТЕЙНЕРА>\",\n      \"sha1Thumbprint\": \"<SHA1_ОТПЕЧАТОК>\",\n      \"hashAlg\": \"GOST3411_2012_256\"\n    }\n  },\n  \"scope\": \"openid\",\n  \"scopeOrg\": \"\"\n}",
    "redirectForm": {
      "response_type": "code",
      "client_id": "{{ .extidp_details.clientID }}",
      "redirect_uri": "{{ .extidp_request.CallbackURI }}",
      "scope": "{{ .extidp_details.scope }}",
      "client_secret": "{{ $ts := timeFormat \"2006.01.02 15:04:05 Z0700\" .process_started }}{{ $clientSecretRaw := join .extidp_details.clientID .extidp_details.scope $ts .extidp_request.ID .extidp_request.CallbackURI }}{{ cryptoSign .context $clientSecretRaw .extidp_details.cryptoProvider | base64 }}",
      "client_certificate_hash": "{{ .extidp_details.clientCertHash }}",
      "timestamp": "{{ timeFormat \"2006.01.02 15:04:05 Z0700\" .process_started }}",
      "state": "{{ .extidp_request.ID }}",
      "access_type": "offline",
      "code_challenge_method": "{{ .extidp_details.cryptoProvider.details.hashAlg }}",
      "code_challenge": "{{ cryptoHashSum .context .code_verifier .extidp_details.cryptoProvider }}",
      "permissions": "{{ $perm := printf `[{\"sysname\":\"<ТИП_СОГЛАСИЯ>\",\"scopes\":[{\"sysname\":\"reg_realestate\"},{\"sysname\":\"medical_doc\"},{\"sysname\":\"kid_medical_doc\"},{\"sysname\":\"servant\"},{\"sysname\":\"student_ticket\"},{\"sysname\":\"teacher_certificate\"}],\"purposes\":[{\"sysname\":\"<ЦЕЛЬ>\"}],\"actions\":[{\"sysname\":\"ALL_ACTIONS_TO_DATA\"}],\"responsibleObject\":\"<ФИО_ИЛИ_ПОДРАЗДЕЛЕНИЕ>\",\"expire\":<СРОК_В_МИНУТАХ>}]` }}{{ $perm | base64 }}"
    },
    "userInfoPipeline": [
      {
        "t": 1,
        "d": {
          "state": "{{ guid }}"
        }
      },
      {
        "t": 0,
        "r": "token",
        "m": "POST",
        "u": "{{.extidp_details.baseUrl}}/aas/oauth2/v3/te",
        "d": {
          "client_certificate_hash": "{{.extidp_details.clientCertHash}}",
          "client_id": "{{.extidp_details.clientID}}",
          "client_secret": "{{$ts := timeFormat \"2006.01.02 15:04:05 Z0700\" .process_started}}{{$clientSecretRaw := join .extidp_details.clientID .extidp_details.scope $ts .state .extidp_request.CallbackURI .code}}{{ cryptoSign .context $clientSecretRaw .extidp_details.cryptoProvider | base64 }}",
          "code": "{{.code}}",
          "grant_type": "authorization_code",
          "redirect_uri": "{{.extidp_request.CallbackURI}}",
          "scope": "{{.extidp_details.scope}}",
          "state": "{{.state}}",
          "timestamp": "{{timeFormat \"2006.01.02 15:04:05 Z0700\" .process_started}}",
          "token_type": "Bearer",
          "code_verifier": "{{ .code_verifier }}"
        }
      },
      {
        "t": 1,
        "d": {
          "verify_id_token": "{{ cryptoVerifyJWT .context .token.id_token .extidp_details.cryptoProvider }}"
        }
      },
      {
        "t": 2,
        "d": {
          "id_token_claims": "jwt(token.id_token)"
        }
      },
      {
        "t": 1,
        "d": {
          "is_trusted": "{{ with index .id_token_claims \"urn:esia:sbj\" \"urn:esia:sbj:is_tru\" }}{{ if not . }}{{ fail \"user is not trusted\" }}{{ end }}{{ end }}"
        }
      },
      {
        "t": 0,
        "r": "person",
        "m": "GET",
        "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}",
        "h": {
          "Authorization": "Bearer {{.token.access_token}}"
        }
      },
      {
        "t": 1,
        "d": {
          "person_ok": "{{ with .person.oid }}{{ else }}{{ fail \"cp: pso response has no oid\" }}{{ end }}"
        }
      },
      {
        "t": 0,
        "r": "reg_realestate",
        "m": "GET",
        "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/REG_REALESTATE",
        "h": {
          "Authorization": "Bearer {{.token.access_token}}"
        }
      },
      {
        "t": 0,
        "r": "mdcl_plcy",
        "m": "GET",
        "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/MDCL_PLCY",
        "h": {
          "Authorization": "Bearer {{.token.access_token}}"
        }
      },
      {
        "t": 0,
        "r": "kid_mdcl_plcy",
        "m": "GET",
        "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/KID_MDCL_PLCY",
        "h": {
          "Authorization": "Bearer {{.token.access_token}}"
        }
      },
      {
        "t": 0,
        "r": "servant",
        "m": "GET",
        "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/SERVANT",
        "h": {
          "Authorization": "Bearer {{.token.access_token}}"
        }
      },
      {
        "t": 0,
        "r": "student_ticket",
        "m": "GET",
        "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/STUDENT_TICKET",
        "h": {
          "Authorization": "Bearer {{.token.access_token}}"
        }
      },
      {
        "t": 0,
        "r": "teacher_certificate",
        "m": "GET",
        "u": "{{.extidp_details.baseUrl}}/digital/api/public/v1/pso/{{printf \"%.0f\" .id_token_claims.sub}}/doc/TEACHER_CERTIFICATE",
        "h": {
          "Authorization": "Bearer {{.token.access_token}}"
        }
      },
      {
        "t": 2,
        "d": {
          "reg_realestate_status": "r = \"no\"; d = reg_realestate; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
          "mdcl_plcy_status": "r = \"no\"; d = mdcl_plcy; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
          "kid_mdcl_plcy_status": "r = \"no\"; d = kid_mdcl_plcy; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
          "servant_status": "r = \"no\"; d = servant; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
          "student_ticket_status": "r = \"no\"; d = student_ticket; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;",
          "teacher_certificate_status": "r = \"no\"; d = teacher_certificate; if (Array.isArray(d)) { if (d.length && d[0].error) { r = \"error\"; } else if (d.length && d[0].status) { r = \"yes\"; } else if (d.length && d[0].requestId) { r = \"pending\"; } else if (d.length && d[0].statusDoc) { r = d[0].statusDoc; } } else if (d) { if (d.statusDoc) { r = d.statusDoc; } else if (d.requestId) { r = \"pending\"; } else if (d.error) { r = \"error\"; } else if (d.status) { r = \"yes\"; } } r;"
        }
      }
    ],
    "attrMapping": {
      "fn": "{{.person.firstName}}",
      "ln": "{{.person.lastName}}",
      "mn": "{{.person.middleName}}",
      "un": "",
      "e": "",
      "p": "",
      "l": "",
      "xid": "",
      "rid": "state",
      "x": {
        "reg_realestate_status": "{{.reg_realestate_status}}",
        "mdcl_plcy_status": "{{.mdcl_plcy_status}}",
        "kid_mdcl_plcy_status": "{{.kid_mdcl_plcy_status}}",
        "servant_status": "{{.servant_status}}",
        "student_ticket_status": "{{.student_ticket_status}}",
        "teacher_certificate_status": "{{.teacher_certificate_status}}"
      }
    },
    "isActive": false
  }
]

Обсуждение