img3

© 2014 - 2024 esia.pro

FAQ PHP

Вопрос Ответ
При перенаправлении обратно на сайт ничего не происходит: ни авторизация, ни регистрация В параметрах компоненты 'OAuth2LogoutUri', 'OAuth2AuthUri', 'OAuth2RefreshTokenUri', 'OAuth2UnTrustedUserRedirectURI' необходимо указать URI вашей системы ('OAuth2OnlyTrustedUsers' нужно убрать, в вашей версии компоненты он не используется)
Как переключиться в прод? Параметры:
OAuth2IsTestEnvironment нужно установить в false
OAuth2Site => https://esia.gosuslugi.ru
OAuth2IsTestEnvironment => false
Если логирование не нужно:
OAuth2IsDebug => false
Какой сертификат используется для проверки подписи ЕСИА при взаимодействии с промышленным контуром? Если файл сертификата лежит в директории по умолчанию и в параметрах не указан полный путь, то файл должен называться esia-prod.crt для прода и esia-test.crt для теста
Каким образом происходит переключение между использованием RSA и ГОСТ Для определения алгоритма подписания запросов со стороны вашей системы есть специальный параметр, задающий алгоритм. В случае проверки подписи ЕСИА проверяется заголовок маркера доступа и на основе его информации определяется алгоритм, которым необходимо проверить подпись токена.
В логах вижу ошибку с refresh_token, но при этом авторизация работает. Уточните, как исправить?
OAuth2\Utils\
Exceptions\OAuth2GetParameterException

Error code[4], line[438] in [/OAuth2/Utils/OAuth2Configuration.php]
Some parameter(s) value(s) is not correct
refresh_token
Также пришлось указать тип алгоритма в параметре OAuth2CryptoAlg, без этого авторизация не работала
Ошибка отсутствия refresh_token означает, что при повторном запросе данных у ЕСИА, если время жизни маркера доступа истекло, будет запрошена авторизация у пользователя. При наличии refresh_token запроса авторизации не происходит, а происходит обмен маркера обновления на маркер доступа. Если ваша система не часто перезапрашивает данные пользователя, то это не критично. Если часто, то значение refresh_token лучше где-то хранить и передавать его в параметре OAuth2StrObjARE. При этом получить строковое представление refresh_token можно с помощью метода getESIAResponse() класса OAuth2RequestToken сразу после получения токена доступа.
Параметр OAuth2CryptoAlg устанавливается по умолчанию в значение GOST3410_2012_256, что соответствует использованию ГОСТ2012, если Вы установили значение RS256, то будет использоваться RSA.
Для чего задаётся OAuth2RefreshTokenUri OAuth2RefreshTokenUri - это URL по которому выпоняется переход в случае, когда в системе обнаружен refresh_token. Например, может быть такой URL. Cистема, получив параметр refresh_token, осуществляет обработку токена обновления. Если нет необходимости хранить и обрабатывать токен обновления, то в этом параметре можно задать тот же URL, что URL возврата после авторизации
Обработка в этой точке подключения практически ничем не отличается от обработки в точке возврата после авторизации. Единственное, что можно предусмотреть, так это извлечение ранее сохранённого токена обновления из базы или сессионной переменной и передача этого значения в объект конфигурации с помощью метода setObjARE(ARE Object - объект, полученный в результате запроса токена у ЕСИА) или включения токена через параметр конфигурации OAuth2StrObjORE.
Что делать в случае возникновения ошбики: Fatal error: OAuth2\Utils\Exceptions\OAuth2ConfigException: [0]: Wrong config parameters list Some parameters not specified: array ( 3 => 'OAuth2RefreshTokenUri', ) in /var/www/html/esiagost/OAuth2
/Utils/OAuth2Configuration.php on line 380?
Нужно в конфигурацию модуля добавить параметр OAuth2RefreshTokenUri и указать для него URL, например, такой: https://yoursite.ru/auth_call_back?refresh_token=true
Учётная запись пользователя не соответствует установленному уровню безопасности По умолчанию CONFIRMED, то есть все УЗ авторизуемых пользователей должны быть подтвержденными, а судя по данным текущего пользователя его УЗ не соответствует этому уровню, поскольку признак trusted = false Изменить уровень безопасности можно с помощью параметра OAuth2UserAccountTypes. Он может принимать одно из значений:
OAuth2Configuration::USER_ACCOUNT_SIMPLIFIED
OAuth2Configuration::USER_ACCOUNT_STANDARD
OAuth2Configuration::USER_ACCOUNT_CONFIRMED
Как получать данные другого scope не заданного в модуле Чтобы получить данные scope необходимо их запросить, например таким образом:
$docs_list_url = $this->config["site"] . "/rs/prns/${user_id}/docs?embed=(elements)";
$docs_list = $this->get($docs_list_url, $header);
то есть сформировать URI и отправить Get-запрос к ЕСИА, в котором обязательно должен присутствовать заголовок, содержащий токен доступа.
Особенности обращения к scope описаны в методических рекомендациях https://digital.gov.ru/ru/documents/6186/
Какие значения необходимо передавать в параметры модуля? Значения для параметров модуля необходимо задавать самостоятельно. В данном случае важно передать запрос соответствующей требованиям протокола и подписанный верным ключом. В списке параметров модуля необходимо изменить следующее:
site - URI системы - поставщика услуг, по которому необходимо отправлять запросы (для авторизации, логаута)
logout_uri - URI клиентской системы, по которому осуществляется редирект после логаута на портале Госуслуг
auth_uri - URI клиентской системы, по которому осуществляется редирект после авторизации на портале Госуслуг
client_id - мнемоника ИС
scope - области данных к которым предоставляется доступ после авторизации в ЕСИА
cert_path - путь к файлу, содержащему открытую часть ключа ИС.
pkey_path - путь к файлу, содержащему закрытую часть ключа ИС.
Что передавать в качестве oid при запросе данных scope? Значение можно получить из json полученного от ЕСИА после авторизации на портале госуслуг.
$oid = $json->{'urn:esia:sbj\_id'}
Затем подставляем $oid в запрос
$this->config["site"] . "/rs/prns/${oid}/ctts?embed=(elements)"
Далее отправляем get запрос, в котором указываем то что получилось + заголовок Authorization: Bearer ${access_token}
Что можно использовать в качестве идентификатора пользователя при получении данных по OAuth протоколу? Со стороны ЕСИА можно получить urn:esia:sb_id. Это идентификатор субъекта, в качестве значения указывается oid этот идентификатор уникален для каждого субъекта, зарегистрированного в ЕСИА.
Какой тип данных необходимо указать в пользовательской ИС для хранения поля содержащего идентификатор пользователя на основе urn:esia:sbj_id? Это поле можно использовать только как числовое, как длинное целое (типа long int в Java). Но только беззнаковое (unsigned), поскольку отрицательных значений быть не может.
Что делать если команда openssl не выполняется под Windows? Необходимо установить утилиту openssl для OC Windows. Ее можно скачать здесь. После установки проверьте, что утилита работает корректно. Для этого выполните команду:
\"C:\Program Files (x86)\GnuWin32\bin\openssl.exe\" smime -sign -in \"${infile}\" -signer \"${cert}\" -inkey \"${pkey}\" -outform DER -out \"${outfile}\"
Только нужно указать свои пути:
\"${infile}\" - путь ко входному файлу, который шифруем
\"${cert}\" - путь к файлу сертификата
\"${pkey}\" - путь к файлу ключа
\"${outfile}\" - путь для выходного файла
В функции private function sign($params) заменить строки:
$command = "openssl smime -sign -in ${infile} -signer ${cert} -inkey ${pkey} -outform DER -out ${outfile} > /dev/null 2>&1";
exec($command);
на:
$command = "\"C:\Program Files (x86)\GnuWin32\bin\openssl.exe\" smime -sign -in \"${infile}\" -signer \"${cert}\" -inkey \"${pkey}\" -outform DER -out \"${outfile}\"";
$command = str_replace('/','\\', $command);
exec($command);
заменив путь к утилите openssl на свой.
Что делать если без прокси-сервера авторизация через ЕСИА работала, а с прокси-сервером не работает? Выдает ошибку “A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond …” В этом случае необходимо разрешить на прокси-сервере прием данных от серверов ЕСИА или организовать обмен данными с ЕСИА в обход прокси-сервера.
Что делать если ИС не получает токен доступа от ЕСИА В этом случае необходимо проверить, что параметр allow_url_fopen (при необходимости, его можно поменять только в php.ini) установлен в значение ON.
Почему в тестовой среде ЕСИА модуль авторизации работает стабильно, а при подключении к промышленному контуру авторизация выполняется некорректно? В этом случае необходимо проверить, что на вашем сервере установлено верное время (при необходимости выполнить синхронизацию с помощью NTLM), а также проверить корректность загруженного на тех. портале сертификата (для этого нужен доступ в личный кабинет тех. портала).
Почему при авторизации ЕСИА выдает сообщение о том, что нет записей об ИС? В этом случае необходимо проверить корректность загруженного на тех. портале сертификата (для этого нужен доступ в личный кабинет тех. портала). Если заявка на подключение к тестовому/промышленному контуру была подана недавно, то, возможно, что ее еще не успели обработать и ИС еще не подключена к ЕСИА. При необходимости можно обратиться в ТП ЕСИА за разъяснениями.
Почему после авторизации на портале госуслуг и последующего редиректа в ИС не происходит обработка данных, которые должна получить система от ЕСИА? Во-первых, необходимо проверить, что на стороне ЕСИА не возникло ошибки. Обычно это видно в URL возврата или в логах тестовой ЕСИА.
Во-вторых, необходимо проверить, что значение state возвращаемое ЕСИА совпадает с сохраненным, еще до авторизации на портале, значением $_SESSION[‘esia_oauth_state’]. Если значения esia_oauth_state в массиве $_SESSION нет, то необходимо проверить доступность каталога, в котором сохраняются пользовательские сессии, для записи.
Подскажите, как выполнить произвольный php код на drupal 9? Создать произвольный раздел, в php-файле набрать код и потом обратиться по URL этого раздела
Какие файлы тестового сервера необходимо переписать на основном? Вот эти:
EsiaOmniAuth.php loginesia.php loginesiaexit.php SiteController.php
/srv/lk/common/models/esia/EsiaOmniAuth.php
/srv/lk/frontend/views/site/loginesia.php
/srv/lk/frontend/views/site/loginesiaexit.php
/srv/lk/frontend/controllers/SiteController.php
При работе модуля будет использоваться расширение openssl для php или отдельная утилита openssl? Расширение openssl для php
Будет ли работать модуль с PHP 5.4 Нет, 5.5 и выше
  • FAQ PHP