farit-slv / esia-connector
OpenID ESIA authenticating
Requires
- php: >=8.0
- ext-json: *
- guzzlehttp/guzzle: ^6.1.0|^7.0
- psr/http-client: ^1.0
- psr/http-message: ^1.1 || ^2.0
- psr/log: ^1.1 || ^2.0
Requires (Dev)
- codeception/codeception: ^4.0
- codeception/module-asserts: ^1.3
- roave/security-advisories: dev-latest
Suggests
- ext-openssl: SignerPKCS7 support
This package is auto-updated.
Last update: 2024-11-08 20:29:22 UTC
README
Описание
Компонент для авторизации и получения данных на портале "Госуслуги".
Библиотека основана на SbWereWolf/esia-connector
и skiexx/esia-connector
, замена стандартной
PHP функции file_get_contents
на cURL
.
Соответственно этому подписывателю для подписания произвольного текста не требуется приватный ключ (подписывание происходит на веб сервисе), соответственно объект конфигурации не требует путей до приватного ключа и сертификата.
В качестве внешнего подписывателя можно использовать CryptoPro
Внимание!
Основная цель библиотеки - получение токена. Получив токен вы можете выполнять любые API запросы. Библиотека предоставляет только самые базовые запросы для получения данных.
Установка
При помощи composer:
composer require farit-slv/esia-connector
Пример использования
Пример использования в test.php
Предварительно:
- Развернуть сервис веб подписи CryptoPro
- Соответственно запустить с параметрами по умолчанию, так что бы
по адресу
http://localhost:3037/cryptopro/sign
происходила обработка POST запроса на подписание произвольного текста, сигнатура вызова {"text": "$message"} (использовать формат JSON)
Как запустить:
cd ./example/
php -S localhost:8000 test.php
- Открыть в браузере localhost:8000
- Перейти по ссылке
Войти через портал ГосУслуги
- Выполнить аутентификацию на портале ГосУслуг
- Авторизовать для вашей организации доступ к данным профиля пользователя (ГосУслуг)
- Произойдёт редирект на
localhost:8000
- На странице будут отображены данные полученные с ГосУслуг
Как использовать
Пример получения ссылки для авторизации
<?php $config = new \Esia\ConfigWithoutKeyPair([ 'clientId' => 'U407501', /* Код вашей организации в ЕСИА */ 'redirectUrl' => 'http://localhost:8000/', 'portalUrl' => 'https://esia-portal1.test.gosuslugi.ru/', 'scope' => [ 'fullname', /* Просмотр вашей фамилии, имени и отчества */ ], ]); $signer = new HttpSigner( 'http://localhost:3037/cryptopro/sign', [ 'Content-Type' => 'application/json', 'accept' => '*/*', ], 'POST', ); $esia = new \Esia\OpenId($config); $esia->setSigner($signer); <a href="<?=$esia->buildUrl()?>">Войти через портал госуслуги</a>
После редиректа на ваш redirectUrl
вы получите в $_GET['code']
код для получения токена
Пример получения токена и информации о пользователе
$esia = new \Esia\OpenId($config); $esia->setSigner(new \Esia\SignerPKCS7( $config->getCertPath(), $config->getPrivateKeyPath(), $config->getPrivateKeyPassword(), $config->getTmpPath() )); // Вы можете использовать токен в дальнейшем вместе с oid $token = $esia->getToken($_GET['code']); $personInfo = $esia->getPersonInfo();
Конфиг
clientId
- ID вашего приложения.
redirectUrl
- URL куда будет перенаправлен ответ с кодом.
portalUrl
- по умолчанию: https://esia-portal1.test.gosuslugi.ru/
.
Домен портала для авторизация (только домен).
codeUrlPath
- по умолчанию: aas/oauth2/ac
. URL для получения кода.
tokenUrlPath
- по умолчанию: aas/oauth2/te
. URL для получение
токена.
scope
- по умолчанию: fullname birthdate gender email mobile id_doc snils inn
. Запрашиваемые права у пользователя.
privateKeyPath
- путь до приватного ключа.
privateKeyPassword
- пароль от приватного ключа.
certPath
- путь до сертификата.
tmpPath
- путь до дериктории где будет проходить подпись
(должна быть доступна для записи).
Токен и oid
Токен - jwt токен которые вы получаете от ЕСИА для дальнейшего взаимодействия
oid - уникальный идентификатор владельца токена
Как получить oid?
Если 2 способа:
- oid содержится в jwt токене, расшифровав его
- После получения токена oid сохраняется в config и получить можно так
$esia->getConfig()->getOid();
Переиспользование Токена
Дополнительно укажите токен и идентификатор в конфиге
$config->setToken($jwt); $config->setOid($oid);