Как правильно (и в какой момент авторизации) задать параметризованные scope в ЕСИА?

Добрый день.

Бьемся с авторизацией портала через ЕСИА с использованием OAuth2/OpenID Connect. Доступ в систему получен, ключи сгенерированы, разрешения на использования определенного списка scope получены. В общем, вся бюрократия соблюдена.

Список разрешенных для нас scope такой: (sbj_inf, openid, fullname, email, mobile, contacts, usr_org - базовые для получения информации о пользователе, его контактах и списке организаций в которых он состоит и дополнительные для получения более подробной информации о его организациях - org_shortname, org_fullname, org_type, org_ogrn, org_inn, org_leg, org_kpp, org_oktmo, org_ctts, org_addrs, org_brhs, org_brhs_ctts, org_brhs_addrs).

При использовании "базовых" scope мы успешно получаем код авторизации (по url на тестовом контуре esia-portal1.test.gosuslugi.ru/aas/oauth2/ac), обмениваем его на маркер доступа (https://esia-portal1.test.gosuslugi.ru/aas/oauth2/te). Здесь все хорошо работает, с использованием полученного Access Token от нас проходят запросы на получение информации о пользователе, его контактах итд.

Дальше сложнее. Скоуп usr_org дает доступ к списку организаций пользователя, в которых содержится краткая информация - название организации, внутренний id и ОГРН (https://esia-portal1.test.gosuslugi.ru/rs/prns/{oi... Нам же нужна более подробная информация об организациях, в которых состоит пользователь. Для этого есть дополнительные scope, например org_fullname, org_type итд. В документации (доступна по адресу, доступ открытый - minsvyaz.ru/uploaded/presentations/esiametodichesk... на страницах 145-147 описывается список этих scope и приводится информация о том, что они должны параметризоваться.

Цитата:
Пример scope:
scope=“http://esia.gosuslugi.ru/org_emps?org_oid=1000000357”


Здесь непонятны сразу два момента.
1. До авторизации невозможно узнать списки организаций пользователя и как следствие узнать их id-шники. А список scope составляется до авторизации (при получении авторизационного кода) и должен совпадать со списком scope, который отправляется в запросе на получение маркера доступа. Соответственно до получения маркера доступа невозможно узнать id организаций, их можно узнать только после получения access token из маркера доступа и отправки подписанных им запросов в систему.

2. Непонятен формат подстановки scope в список для авторизации. Мы уже перебрали от безысходности все варианты - и org_fullname и org_fullname?org_id=id (с реальным id организации из тестового контура) и esia.gosuslugi.ru/org_fullname и https://esia-portal1.test.gosuslugi.ru/org_fullname с параметрами и без.

На любой запрос со scope содержащим org_fullname система отвечает ошибкой в адресной строке браузера вида:
error=invalid_scope&state=d084a665-6122-4c99-89dc-072c911a3dfa&error_description=ESIA-007006%3A+The+requested+scope+is+invalid%2C+unknown%2C+or+malformed.

В документации об этой ошибке только пара строчек - неправильный scope или некорректно составлен.

Если кто-то сталкивался с подобным при работе ЕСИА - подскажите, пожалуйста, будем признательны.
  • Вопрос задан
  • 9197 просмотров
Пригласить эксперта
Ответы на вопрос 4
@NikitaUs
Да, божественная документация ЕСИА всех выводит из себя=) Я сам недавно начал с ЕСИА и потратил немало времени на то чтобы разобраться как правильно c ЭТИМ работать.

Поскольку запрос на получение данных организации подразумевает передачу конкретного orgOid, то тут поможет только запрос двух маркеров последовательно. А вот scope для запроса данных организаций формируется вот в таком формате:
http://esia.gosuslugi.ru/org_shortname?org_oid=1000346115 http://esia.gosuslugi.ru/org_fullname?org_oid=1000346115 http://esia.gosuslugi.ru/org_type?org_oid=1000346115 http://esia.gosuslugi.ru/org_ogrn?org_oid=1000346115 http://esia.gosuslugi.ru/org_inn?org_oid=1000346115 http://esia.gosuslugi.ru/org_kpp?org_oid=1000346115 http://esia.gosuslugi.ru/org_agencyterrange?org_oid=1000346115 http://esia.gosuslugi.ru/org_agencytype?org_oid=1000346115 http://esia.gosuslugi.ru/org_oktmo?org_oid=1000346115 http://esia.gosuslugi.ru/org_ctts?org_oid=1000346115 http://esia.gosuslugi.ru/org_addrs?org_oid=1000346115 http://esia.gosuslugi.ru/org_emps?org_oid=1000346115
Ответ написан
@Sinator
1) Авторизуете пользователя (получаете обратно code по запрошенным скоупам)
2) Меняете code на access_token
3) Запрашиваете данные по пользователю используя access_token (получаете список нужных вам организаций)
4) Создаете еще один запрос через API аналогичный второму пункту и получаем ЕЩЕ ОДИН access_token, но уже для организаций (обратите внимание, что grant_type уже client_credentials, а code и state используется из ответа на первый шаг)
$arParams = [
    'client_id'     => '*CLIENT_CODE*',
    'code'          => $_GET['code'],
    'grant_type'    => 'client_credentials',
    'state'         => $_GET['state'],
    'scope'         => join(' ', [
        "http://esia.gosuslugi.ru/org_inn?org_oid=*111111111*",
        "http://esia.gosuslugi.ru/org_ogrn?org_oid=*111111111*",
        "http://esia.gosuslugi.ru/org_ctts?org_oid=*111111111*",
        "http://esia.gosuslugi.ru/org_fullname?org_oid=*111111111*",
        "http://esia.gosuslugi.ru/org_type?org_oid=*111111111*",
        "http://esia.gosuslugi.ru/org_inn?org_oid=*222222222*",
        "http://esia.gosuslugi.ru/org_ogrn?org_oid=*222222222*",
        "http://esia.gosuslugi.ru/org_ctts?org_oid=*222222222*",
        "http://esia.gosuslugi.ru/org_fullname?org_oid=*222222222*",
        "http://esia.gosuslugi.ru/org_type?org_oid=*222222222*",
        "http://esia.gosuslugi.ru/org_inn?org_oid=*333333333*",
        "http://esia.gosuslugi.ru/org_ogrn?org_oid=*333333333*",
        "http://esia.gosuslugi.ru/org_ctts?org_oid=*333333333*",
        "http://esia.gosuslugi.ru/org_fullname?org_oid=*333333333*",
        "http://esia.gosuslugi.ru/org_type?org_oid=*333333333*",
    ]),
    'timestamp'     => date('Y.m.d H:i:s O'),
    'token_type'    => 'Bearer',
    'client_secret' => '*CLIENT_SECRET*',
];

5) С полученным новым токеном делаем запрос на получение информации по организации (на каждую свой):
https://esia-portal1.test.gosuslugi.ru/rs/orgs/222222222/ctts?embed=(contacts.elements)


Документация у них конечно "дно" =)
Ответ написан
@proger_papka
У меня собственно тоже возникла такая же ошибка. Ну не в точь но похожа. Мне нужно получить аватарку пользователя. Для этого нужно получить маркер новый на scope=esia.gosuslugi.ru/usr_avt?oid=1000356243 к примеру. Вообще сейчас в документации написано что любые запросы на конкретный скоуп необходимо делать на основе системы делегирования прав. Когда ты просто посылаешь post сразу и указываешь там этот скоуп, grant_type=CLIENT_CREDENTIALS, response_type=TOKEN и все остальное по аналогии. Но почему то в ответ не приходит json токен а приходит html типо портал временно не доступен(http status = 400). Никто не сталкивался с такой проблеммой? Как вообще сделать эту систему делегирования прав? По сути это тоже самое как получение автаризационного маркера(на общие данные) только указывается скоуп через пробел и grant_type там другой.
Вот вы еще говорите что вы посылаете запрос 2 раз на получение токенна а можите сап запрос полностью показать я имеею ввиду весь со всеми заголовками параметрами итд. Ато рили какая то ерунда.
Ответ написан
Комментировать
@nerobot-jk
Привет! Понадобилось сделать авторизацию через ЕСИА, застрял на моменте получения кода, а именно на шифровании параметра
< client_secret > – подпись запроса в формате PKCS#7 detached signature в кодировке UTF8 от значений следующих параметров HTTP–запроса: scope, timestamp, client_id, state (без
разделителей). должен быть закодирован в формате base64 url safe.
Используемый для проверки подписи сертификат должен быть предварительно
зарегистрирован в ЕСИА и привязан к учетной записи системы-клиента в ЕСИА. ЕСИА
поддерживает сертификаты в формате X.509. ЕСИА поддерживает алгоритм
формирования электронной подписи ГОСТ Р 34.10-2012 и алгоритм криптографического
хэширования ГОСТ Р 34.11-2012.

Можете ткнуть носом на инфу или поделиться куском кода по этой части?
Заранее спасибо!

PS: вроде бы разобрался. :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы