img3

© 2014 - 2024 esia.pro

Библиотека авторизации через ЕСИА (PHP)

1 Общее описание

Библиотека содержит набор функций реализованных на языке программирования PHP позволяющих организовать взаимодействие с сервисами Единой системы идентификации и аутентификации (ЕСИА) по протоколу OAuth 2.0. Подробную информацию о данном протоколе и принципах взаимодействия с ЕСИА можно получить в методических рекомендациях по использованию ЕСИА

Важно учесть, что библиотека авторизации поставляется в 2-х версиях базовой и расширенной. Основным отличием расширенной версии от базовой является возможность получения дополнительного набора сведений о пользователе (см. Приложение Б - Перечень запрашиваемых областей доступа). Условия поставки базовой или расширенной версии необходимо обговаривать заранее с Вашим персональным менеджером.

2 Перечень поставляемых файлов

В состав файлов, поставляемых с библиотекой, входят следующие:

  • RndsEsiaOAuth2.php - файл, который необходимо подключить в своем проекте для использования классов библиотеки;
  • Keys - директория, в которой должны размещаться ключ и сертификат ИС (генерируются на стороне клиента ЕСИА);
  • Temp - директория, в которую записываются временные файлы;
  • Log - директория лог-файлов;
  • OAuth2 - директория, в которой содержатся файлы библиотеки, распределенные по следующим директориям:
    • Init - директория, содержащая модули классов, выполняющих автозагрузку классов библиотеки авторизации;
    • Creators - директория, содержащая модули классов, выполняющих формирование объектов данных, запрашиваемых из защищенного хранилища ЕСИА;
    • Services - директория, содержащая модули классов, реализующих сервисы взаимодействия с ЕСИА;
    • Utils - директория, содержащая модули утилитарных классов, реализующих вспомогательные функции для сервисов.

3 Основные функции

Основными функциями библиотеки авторизации являются:

  • получение авторизационного кода ЕСИА;
  • обмен авторизационного кода на маркер доступа;
  • обмен маркера обновления на маркер доступа (без запроса авторизации пользователя на стороне ЕСИА);
  • получение данных пользователя из ЕСИА (в приложении Б перечислены скоупы, которые может получать текущая версия библиотеки);
  • выход (логаут) на стороне ЕСИА;
  • проверка наличия аутентификации пользователей на стороне ЕСИА в фоновом режиме;
  • подписание запросов к ЕСИА на основе криптографических средств, установленных на удалённом сервере.

4 Интеграция библиотеки

Перед началом интеграции необходимо:

  • выполнить конфигурирование OpenSSL, подключив gost-engine с поддержкой алгоритмов ГОСТ Р 34.10-2012 и ГОСТ Р 34.11- 2012. Если подписание происходит на стороне сервиса Signer (Jigner), то OpenSSL настраивать не нужно;
  • настроить для вашей системы HTTPS (это обязательное требование, поскольку данные между вашей системой и ЕСИА передаются в открытом виде);
  • выполнить экспорт ключевой пары (сформированной по ГОСТ2012) из криптоконтейнера (экспорт можно сделать с помощью нашей утилиты). Если подписание будет происходить на стороне Jigner, то экспорт делать не нужно;
  • настроить систему на технологическом портале тестовой/промышленной ЕСИА. На технологическом портале в окне редактирования параметров системы (см. рисунок 1) указать URL возврата после авторизации и логаута, а также установить алгоритм подписания запросов GOST3410_2012_256.

Поскольку библиотека поставляется в виде модулей с открытым исходным кодом она может быть интегрирована в кодовую базу любого проекта на PHP (при соблюдении требований к зависимостям, которые описаны в разделе 5).

Для интеграции библиотеки необходимо выполнить следующие шаги описанные ниже.

Шаг 0. Установить необходимые зависимости, описанные в разделе 5.

Шаг 1. Распаковать архив с библиотекой в рабочей директории, в которую она должна быть установлена.

Шаг 2. Если для подписания запросов к ЕСИА используется Jigner то ключевую пару вашей системы необходимо загрузить в криптохранилище сервиса (см. инструкцию по эксплуатации Jigner), в ином случае выполните действия, описанные далее. В директорию по умолчанию Keys/GOST3410_2012_256 в рабочем каталоге библиотеки авторизации положить ключ и сертификат (с именами secret.key и cert.crt соответственно) в PEM формате (для извлечения ключа и сертификата из криптоконтейнера можно воспользоваться нашей утилитой), сформированные по ГОСТ2012 с длиной ключа 256 бит, и удостовериться, что тот же сертификат загружен на технологическом портале тестовой/промышленной ЕСИА. Если имена и директория файлов ключа и сертификата не соответствуют значениям по-умолчанию необходимо указать полный путь для них в параметрах OAuth2PkeyPath и OAuth2CertPath.

Шаг 3. В директорию по умолчанию Keys/GOST3410_2012_256 в рабочем каталоге библиотеки положить файл сертификата ЕСИА в PEM формате с именем esia-test.crt или esia-prod.crt в зависимости от окружения (тестовое/промышленное), в котором запускается код. Окружение устанавливается с помощью параметра OAuth2IsTestEnvironment. Если имя или директория файла сертификата не соответствуют значениям по-умолчанию необходимо указать полный путь в параметре OAuth2EsiaCertPath.

img1

img2

Рисунок 1 - Поля в окне редактирования параметров системы

Шаг 4. ВАЖНО!!! Настроить доступ к директориям для размещения файлов сертификата, ключа и логов компоненты таким образом, чтобы их файлы нельзя было получить извне.

Шаг 5. Добавить раздел (для MVC необходимо добавить метод в контроллер) для передачи запроса авторизации в ЕСИА. Разместить в данном разделе обработчик (для MVC метод контроллера) для формирования и передачи ЕСИА запроса на авторизацию. Обработчик должен содержать следующий код:

// регистрирует все классы библиотеки
require_once '[путь к рабочей директории]/RndsEsiaOAuth2.php'; 

// подключаем необходимые для авторизации классы
use OAuth2\Utils\OAuth2Configuration;
use OAuth2\Services\OAuth2RequestLogin;

// код формирующий объект конфигурации библиотеки
$arrayConf = array (
   'OAuth2Site'      => "https://esia-portal1.test.gosuslugi.ru",
   'OAuth2LogoutUri' => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php",
   'OAuth2AuthUri'   => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php",
   'OAuth2RefreshTokenUri'   => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php?refresh=true",
   'OAuth2ClientId'  => "RSKL02611",
   'OAuth2Scope'     => "openid fullname id_doc",
   'OAuth2IsDebug'   => TRUE
); //массив с основными параметрами библиотеки (подробнее в приложении А)

$objConf = new OAuth2Configuration($arrayConf);

// код формирующий запрос на авторизацию и выполняющий его передачу ЕСИА
$objLogin = new OAuth2RequestLogin($objConf);
$state_code = $objLogin->getStateCode();
$_SESSION['ESIA_STATE_CODE'] = $state_code; // ВАЖНО! Код идентификации запроса сохраняется 
                                            // в пользовательской сессии 
$objLogin->SendRequestLogin();

Шаг 6. Добавить раздел (для MVC необходимо добавить метод в контроллер) для перехода, после авторизации на стороне ЕСИА (это может быть тот же раздел, что и для передачи запроса на авторизацию). Разместить в данном разделе код обработчика ответа от ЕСИА получаемого в результате авторизации:

require_once '[путь к рабочей директории]/RndsEsiaOAuth2.php'; // регистрирует все классы

// подключаем классы, необходимые для получения данных
use OAuth2\Services\OAuth2RequestInfo;
use OAuth2\Services\OAuth2RequestToken;
use OAuth2\Services\OAuth2SecurityPolicies;
use OAuth2\Utils\OAuth2Configuration;
use OAuth2\Utils\Exceptions\OAuth2AuthPolicyException;
use OAuth2\Utils\Exceptions\OAuth2RequestInfoException;
use OAuth2\Utils\Exceptions\OAuth2TokenRequestException;
use OAuth2\Utils\Exceptions\OAuth2SetParameterException;

// код формирующий объект конфигурации библиотеки
$arrayConf = array (
   'OAuth2Site'       => "https://esia-portal1.test.gosuslugi.ru",
   'OAuth2LogoutUri' => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php",
   'OAuth2AuthUri'   => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php",
   'OAuth2RefreshTokenUri'   => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php?refresh=true",
   'OAuth2ClientId'  => "RSKL02611",
   'OAuth2Scope'     => "openid fullname id_doc",
   'OAuth2IsDebug'   => TRUE
); //массив с основными параметрами библиотеки (подробнее в приложении А)

$objConf = new OAuth2Configuration($arrayConf);

// код обработки ответа ЕСИА после авторизации
if ( isset($_GET['code']) && isset($_GET['state']) ) {
   // ВАЖНО! Полученный код идентификации запроса должен совпадать с 
   // ранее сохраненным в сессии значением 
   if ($_GET['code'] != '' && $_SESSION['ESIA_STATE_CODE'] == $_GET['state']) {

      try {

         $objToken = new OAuth2RequestToken( $objConf, $_GET['code']);         
         $objARE = $objToken->SendRequestToken();
         $objConf->setObjARE($objARE);

         $objInfo = new OAuth2RequestInfo($objConf);
         $objGeneralnfo = $objInfo->getPersonGeneralInfo(); // получение основной 
                                                            // информации о пользователе
         $objSecurityPolicies = new OAuth2SecurityPolicies($objConf);
         $objSecurityPolicies->SecurityPoliciesProcessing($objGeneralnfo);
      }
      catch (OAuth2TokenRequestException $objEx) {

         echo $objEx;
      }
      catch (OAuth2SetParameterException $objEx) {

         echo $objEx;
      }
      catch (OAuth2AuthPolicyException $objEx) {
          echo 'User can not be auth!'  . '<br>'; // or redirect to specific URL
      }
   }
   else {

      echo 'Authorization code or state not valid!'  . '<br>';
   }
}
else {

   echo 'Authorization code or state not defined in $_GET!'  . '<br>';
}

//далее Ваш код обработки данных, полученных от ЕСИА

Шаг 7. Добавить раздел для логаута на стороне ЕСИА. Разместить в данном разделе код для запроса логаута:

// регистрирует все классы библиотеки
require_once '[путь к рабочей директории]/RndsEsiaOAuth2.php'; 

// подключаем необходимые для логаута классы
use OAuth2\Utils\OAuth2Configuration;
use OAuth2\Services\OAuth2RequestLogout;

// код формирующий объект конфигурации библиотеки
$arrayConf = array (
   'OAuth2Site'      => "https://esia-portal1.test.gosuslugi.ru",
   'OAuth2LogoutUri' => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php",
   'OAuth2AuthUri'   => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php",
   'OAuth2RefreshTokenUri'   => "http://besia.d.rnds.pro/auth_module/Testing/testLogin.php?refresh=true",
   'OAuth2ClientId'  => "RSKL02611",
   'OAuth2Scope'     => "openid fullname id_doc",
   'OAuth2IsDebug'   => TRUE
); //массив с основными параметрами библиотеки (подробнее в приложении А)

$objConf = new OAuth2Configuration($arrayConf);

// код формирующий запрос на авторизацию и выполняющий его передачу ЕСИА
$objLogout = new OAuth2RequestLogout($objConf);
$objLogout->SendRequestLogout();

После логаута на стороне ЕСИА произойдет редирект в раздел ИС, в котором должен быть код, выполняющий логаут пользователя на стороне ИС.

5 Зависимости

Библиотека авторизации предъявляет следующие языковые требования

PHP 5.5 или выше

В окружении библиотеки авторизации должна присутствовать утилита

OpenSSL v.1.1.x

которую можно вызвать посредством системного вызова.

OpenSSL должна поддерживать алгоритмы ГОСТ2012. Для этого необходимо установить расширение

Gost-engine

В случае использования сервиса подписания запросов Signer (Jigner) его необходимо развернуть и настроить к нему доступ со стороны системы, в которую интегрируется библиотека.

Необходимо наличие

Grep

Для работы библиотеки авторизации необходимо:

  • наличие активной компоненты openssl (только при использовании алгоритма подписания запросов RSA);

openssl

  • наличие активной компоненты json;

json

  • наличие активной компоненты curl;

curl

  • наличие активной компоненты posix;

posix


ПРИЛОЖЕНИЕ А.
Описание конфигурационных параметров

Библиотека авторизации принимает на вход набор параметров, описанных в таблице А.1.

Таблица А.1 - Описание параметров

Наименование параметра Описание параметра
1 OAuth2Site URL системы - поставщика услуг (ЕСИА)
2 OAuth2LogoutUri Определяет адрес возврата в ИС после логаута пользователя в ЕСИА
3 OAuth2AuthUri Определяет адрес возврата в ИС после авторизации пользователя в ЕСИА
4 OAuth2ClientId Мнемоника, полученная при регистрации ИС в минкомсвязи
5 OAuth2Scope Перечень областей данных, к которым предоставляется доступ для ИС после авторизации
6 OAuth2CertPath Путь к файлу сертификата, содержащему публичный ключ ИС
7 OAuth2PkeyPath Путь к файлу, содержащему приватный ключ ИС
8 OAuth2OpensslPath Полный путь к утилите OpenSSL
9 OAuth2IsDebug Включение/отключение режима отладки
10 OAuth2AccessType Определяет тип доступа к защищенному хранилищу ЕСИА предоставляемому для ИС
11 OAuth2ResponseType Определяет тип ответа ЕСИА при запросе авторизации со стороны ИС
12 OAuth2RefreshTokenUri  определяет URL обработчика токена обновления
13 OAuth2CryptoAlg Определяет крипграфический алгоритм, используемый для подписания запросов
14 OAuth2PrivateKeyPwd Определяет пароль, используемый для закрытой части ключа
15 OAuth2UseCurl Определяет способ передачи запросов через cURL
16 OAuth2EsiaCertPath Путь к файлу, содержащему сертификат ЕСИА
17 OAuth2UserAccountTypes Задаётся как массив значений и определяет уровень доверия к учётной записи пользователя. Может принимать значения OAuth2Configuration::USER_ACCOUNT_SIMPLIFIED, OAuth2Configuration::USER_ACCOUNT_STANDARD, OAuth2Configuration::USER_ACCOUNT_CONFIRMED. Если указано значение OAuth2Configuration::USER_ACCOUNT_SIMPLIFIED то авторизацию будут проходить все пользователи зарегистрированные в ЕСИА, OAuth2Configuration::USER_ACCOUNT_STANDARD определяет уровень доверия только для стандартных УЗ, а значение OAuth2Configuration::USER_ACCOUNT_CONFIRMED позволяет проходить авторизацию пользователям только с подтверждённой УЗ.
18 OAuth2UseBackgroundAuth Определяет возможность проверки наличия аутентификации пользователей на стороне ЕСИА в фоновом режиме
19 OAuth2GetDataType Определяет в каком виде библиотека будет передавать данные клиентской системе. Возможные значения OAuth2Configuration ::OAUTH2_GET_JSON, OAuth2Configuration ::OAUTH2_GET_ARRAY
20 OAuth2StrObjARE Принимает JSON, принятый от ЕСИА в результате получения токена доступа
21 OAuth2IsTestEnvironment Принимает значения TRUE/FALSE в зависимости от окружения, в котором выполняется код библиотеки
22 OAuth2EsiaApiVersion Принимает значения v1 и v2. Определяет версию API, по которой будет происходить взаимодействие с ЕСИА. По умолчанию версия API v2.
23 OAuth2EsiaHashAlgorithm Определяет алгоритм, используемый для вычисления хэша сертификата. Допустимые значения 'sha1', 'md_gost94', 'md_gost12_256', 'md_gost12_512'.
ВАЖНО! чтобы алгоритм вычисления хэша сертификата совпадал с алгоритмом хэширования, использованным при формировании ключевой пары ЭЦП.
24 OAuth2DerCertPath Определяет путь к сертификату ИС, конвертированному в DER. Если ничего не указано путь DER-сертификату будет совпадать с путем PEM-сертификата.

Пример массива, задающего минимально необходимый набор конфигурационных параметров для библиотеки, приведен ниже.

Для тестовой среды ЕСИА:

$arrayConf = array(
                  'OAuth2LogoutUri'            => "http://yoursite.ru/logout_call_back",
                  'OAuth2AuthUri'              => "http://yoursite.ru/auth_call_back",
		              'OAuth2RefreshTokenUri'      => "http://yoursite.ru/refresh_token",
                  'OAuth2ClientId'             => "YOURID123"
                  );

Для промышленной среды ЕСИА:

$arrayConf = array(
		              'OAuth2IsTestEnvironment'    => false,
                  'OAuth2LogoutUri'            => "http://yoursite.ru/logout_call_back",
                  'OAuth2AuthUri'              => "http://yoursite.ru/auth_call_back",
		              'OAuth2RefreshTokenUri'      => "http://yoursite.ru/refresh_token",
                  'OAuth2ClientId'             => "YOURID123"
                  );

ПРИЛОЖЕНИЕ Б.
Перечень запрашиваемых областей доступа

Таблица Б.1 - Перечень запрашиваемых областей доступа

Название scope Состав набора данных Запрашивается(+)/Не запрашивается(-)
1. fullname Просмотр фамилии, имени и отчества:
• фамилия;
• имя;
• отчество.
+
2. birthdate дата рождения, указанная в учетной записи +
3. gender пол, указанный в учетной записи +
4. snils СНИЛС, указанный в учетной записи +
5. inn ИНН, указанный в учетной записи +
6. id_doc Просмотр данных о документе, удостоверяющем личность:
• серия и номер документа, удостоверяющего личность;
• дата выдачи;
• кем выдан;
• код подразделения;
• гражданство.
+
7. birthplace место рождения. +
8. medical_doc Просмотр данных полиса ОМС:
• номер полиса ОМС;
• срок действия.
+
9. military_doc Просмотр данных военного билета:
• серия и номер военного билета;
• дата выдачи;
• орган, выдавший документ.
+
10. foreign_passport_doc Просмотр данных заграничного паспорта:
• фамилия, имя, отчество буквами латинского алфавита;
• серия и номер заграничного паспорта;
• дата выдачи;
• срок действия;
• орган, выдавший документ;
• гражданство.
+
11. drivers_licence_doc Просмотр данных водительского удостоверения:
• серия и номер водительского удостоверения;
• дата выдачи;
• срок действия.
+
12. birth_cert_doc Просмотр данных свидетельства о рождении:
• серия и номер свидетельства;
• дата выдачи;
• место государственной регистрации.
+
13. residence_doc Просмотр данных вида на жительство:
• серия и номер вида на жительство;
• дата выдачи.
+
14. temporary_residence_doc Просмотр данных разрешения на временное проживание:
• серия и номер разрешения на временное проживание;
• дата выдачи.
+
15. vehicles Просмотр данных транспортных средств:
• государственный регистрационный знак;
• серия и номер свидетельства о регистрации.
+
16. email адрес электронной почты, указанный в учетной записи +
17. mobile номер мобильного телефона +
18. contacts Просмотр данных о контактах и адресах:
• номер домашнего телефона;
• номер мобильного телефона;
• адрес электронной почты;
• адрес регистрации;
• адрес места проживания.
+
19. usr_org список организаций пользователя. +
20. usr_avt Просмотр изображения (аватара) пользователя:
• получения изображения (аватара);
• создание и обновление изображения (аватара);
• получение исходного изображения (аватара)
-
21. self_employed Просмотр данных о самозанятых
• признак самозанятого;
• категория (вид деятельности).
-
22. kid_fullname Просмотр фамилии, имени и отчества:
• фамилия;
• имя;
• отчество.
+
23. kid_birthdate дата рождения ребенка +
24.. kid_gender Пол ребенка +
25. kid_snils СНИЛС ребенка +
26. kid_inn ИНН ребенка +
27. kid_birth_cert_doc Просмотр данных свидетельства о рождении:
• серия свидетельства;
• номер свидетельства;
• дата выдачи свидетельства;
• кем выдано свидетельство.
+
28. kid_medical_doc Просмотр данных полиса ОМС:
• номер полиса ОМС;
• действителен до ОМС.
+
1. org_shortname Сокращенное наименованиеорганизации -
2. org_fullname Полное наименованиеорганизации -
3. org_type Тип организации -
4. org_ogrn ОГРН организации -
5. org_inn ИНН организации -
6. org_leg ОПФ организации -
7. org_kpp КПП организации -
8. org_agencyterrange Территориальнаяпринадлежность ОГВ -
9. org_agencytype Тип ОГВ -
10. org_oktmo ОКТМО организации -
11. org_ctts Контакты организации: номер телефона, номер факса, адрес электронной почты -
12. org_addrs Адреса организации (почтовый адрес, юридический адрес): индекс, идентификатор страны, адрес в виде строки (не включая дом, строение, корпус, номер квартиры), строение, корпус, дом, квартира, код ФИАС, регион,город, внутригородской район, район, поселение, доп. территория, улица на доп. территории, улица -
13. org_vhls Транспортные средства организации: название, государственный регистрационный знак, серия и номер свидетельства орегистрации -
14. org_grps Группы, владельцемкоторых является организация -
15. org_emps Данные о сотрудникахорганизации -
16. org_brhs Данные о филиалах организации (название, КПП, ОПФ, контакты,адреса) -
17. org_brhs_ctts Контакты филиаловорганизации -
18. org_brhs_addrs Адреса филиаловорганизации -
19. org_rcs Центры регистрацииорганизации -
20. org_stms Системы, владельцемкоторых является организация -
21. org_invts Приглашения, направленныеорганизацией -
22. categories Данные присвоенных организации видовдеятельности -
  • Библиотека авторизации через ЕСИА (PHP)
  • 1 Общее описание
  • 2 Перечень поставляемых файлов
  • 3 Основные функции
  • 4 Интеграция библиотеки
  • 5 Зависимости
  • ПРИЛОЖЕНИЕ А. Описание конфигурационных параметров
  • ПРИЛОЖЕНИЕ Б. Перечень запрашиваемых областей доступа