PHPackages                             ekapusta/oauth2-esia - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. ekapusta/oauth2-esia

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

ekapusta/oauth2-esia
====================

Allows to authenticate in ESIA and get authenticated individual personal information.

2.0.0(3mo ago)73189.8k↓12.8%511MITPHPPHP ^7.4 || ^8.0CI passing

Since May 18Pushed 1mo ago10 watchersCompare

[ Source](https://github.com/ekapusta/oauth2-esia)[ Packagist](https://packagist.org/packages/ekapusta/oauth2-esia)[ RSS](/packages/ekapusta-oauth2-esia/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (7)Versions (33)Used By (1)

ЕСИА провайдер для OAuth 2.0 Client
===================================

[](#есиа-провайдер-для-oauth-20-client)

Позволяет аутентифицироваться в ЕСИА и получать персональную информацию аутентифицированного лица.

Сделано как адаптер к PHP League [OAuth 2.0 Client](https://github.com/thephpleague/oauth2-client).

Поддерживаются версии PHP от 5.6 до 8.5.

Покрытие кода юнит-тестами: 100%.

Установка
---------

[](#установка)

```
composer require ekapusta/oauth2-esia

```

Использование
-------------

[](#использование)

Использование аналогично обычному OAuth 2.0 Client с провайдером `Ekapusta\OAuth2Esia\Provider\EsiaProvider`:

### Конфигурация провайдера

[](#конфигурация-провайдера)

```
use Ekapusta\OAuth2Esia\Provider\EsiaProvider;
use Ekapusta\OAuth2Esia\Security\JWTSigner\OpenSslCliJwtSigner;
use Ekapusta\OAuth2Esia\Security\Signer\OpensslPkcs7;

$provider = new EsiaProvider([
    'clientId'      => 'XXXXXX',
    'redirectUri'   => 'https://your-system.domain/auth/finish/',
    'defaultScopes' => ['openid', 'fullname', '...'],
    // Для работы с тестовым порталом
    // 'remoteUrl' => 'https://esia-portal1.test.gosuslugi.ru',
    // 'remotePublicKey' => EsiaProvider::RESOURCES.'esia.test.public.key',
    // Для работы с GOST3410_2012_256 подписями (другие уже не поддерживаются порталами Госуслуг)
    'remoteCertificatePath' => EsiaProvider::RESOURCES.'esia.gost.prod.public.key',
], [
    'signer' => new OpensslPkcs7('/path/to/public/certificate.cer', '/path/to/private.key'),
    // Для работы с GOST3410_2012_256 подписями (другие уже не поддерживаются порталами Госуслуг)
    'remoteSigner' => new OpenSslCliJwtSigner('/path/to/openssl'),
]);
```

### Какой из подписателей (signer) использовать?

[](#какой-из-подписателей-signer-использовать)

- RSA ключи уже не поддерживаются.
- Если вы используете PHP с прекомпилированными в openssl GOST алгоритмами, то `OpensslPkcs7` достаточно.
- Если у вас есть openssl-совместимая утилита, то можно использовать `OpensslCli`. У неё есть `toolpath` параметр.
- Если у вас есть утилита, не совместимая с openssl, то можно по образцу `OpensslCli` сделать свою.
- Для целей тестирования используется docker с параметром `'toolpath' => 'docker run --rm -i -v $(pwd):$(pwd) -w $(pwd) rnix/openssl-gost openssl'`.

Какой из удалённый подписывателей (remote signer) использовать?
---------------------------------------------------------------

[](#какой-из-удалённый-подписывателей-remote-signer-использовать)

- Для подписей GOST3410\_2012\_256, а они только одни и остались, используйте `OpenSslCliJwtSigner`, передавая ей путь к `openssl`. Для докера используйте `docker run --rm -i -v $(pwd):$(pwd) -v /tmp/tmp -w $(pwd) rnix/openssl-gost openssl'`. `/tmp ` volume важен!
- Аналогично, если у вас есть свои утилиты, то можете сделать аналог `OpenSslCliJwtSigner` со своими деталями имплементации.

### Схема аутентификации

[](#схема-аутентификации)

Стандартна.

```
// https://your-system.domain/auth/start/
$authUrl = $provider->getAuthorizationUrl();
$_SESSION['oauth2.esia.state'] = $provider->getState();
header('Location: '.$authUrl);
exit;

// https://your-system.domain/auth/finish/?state=...&code=...
if ($_SESSION['oauth2.esia.state'] !== $_GET['state']) {
    exit('The guard unravels the crossword.');
}

$accessToken = $provider->getAccessToken('authorization_code', ['code' => $_GET['code']]);
$esiaPersonData = $provider->getResourceOwner($accessToken);
var_export($esiaPersonData->toArray());
```

Пример $esiaPersonData
----------------------

[](#пример-esiapersondata)

```
{
  "resourceOwnerId": 1000404446,
  "stateFacts": [
    "EntityRoot"
  ],
  "firstName": "Имя006",
  "lastName": "Фамилия006",
  "middleName": "Отчество006",
  "birthDate": "26.05.2000",
  "birthPlace": "Москва",
  "gender": "F",
  "trusted": true,
  "citizenship": "RUS",
  "snils": "000-000-600 06",
  "inn": "585204118212",
  "updatedOn": 1523386683,
  "contacts": {
    "stateFacts": [
      "hasSize"
    ],
    "size": 3,
    "eTag": "5F535ACCAEB3018D0AAA8C46027E3CF2C4BD0197",
    "elements": [
      {
        "stateFacts": [
          "Identifiable"
        ],
        "id": 14216773,
        "type": "EML",
        "vrfStu": "VERIFIED",
        "value": "EsiaTest006@yandex.ru",
        "verifyingValue": "EsiaTest006@yandex.ru",
        "vrfValStu": "VERIFYING",
        "isCfmCodeExpired": true,
        "eTag": "17DCA3945F1B8B54496F59EB146BDC7DADAD7BC8"
      },
      {
        "stateFacts": [
          "Identifiable"
        ],
        "id": 14249750,
        "type": "PHN",
        "vrfStu": "NOT_VERIFIED",
        "value": "+7(840)0000006",
        "eTag": "943C1145E4973324599CD0E4FF136186502C93C5"
      },
      {
        "stateFacts": [
          "Identifiable"
        ],
        "id": 14244504,
        "type": "MBT",
        "vrfStu": "VERIFIED",
        "value": "+7(000)0000006",
        "verifyingValue": "+7(111)1111111",
        "vrfValStu": "VERIFYING",
        "isCfmCodeExpired": true,
        "eTag": "F3AA3B18B35BC12E53E0B7A7EAF13EC41EBD02AD"
      }
    ]
  },
  "addresses": {
    "stateFacts": [
      "hasSize"
    ],
    "size": 2,
    "eTag": "47B43F0210344E272F338073C382C5955651C5E2",
    "elements": [
      {
        "stateFacts": [
          "Identifiable"
        ],
        "id": 530,
        "type": "PLV",
        "addressStr": "г Чебоксары, пр-кт Мира",
        "fiasCode": "bb5f4fab-64ea-4042-a61b-9b2bdb55442d",
        "flat": "1",
        "countryId": "RUS",
        "house": "1",
        "zipCode": "428022",
        "city": "Чебоксары",
        "street": "Мира",
        "region": "Чувашская Республика",
        "eTag": "3553085EBBC08CEBFD73957B7D5BAFDFDA096CCA"
      },
      {
        "stateFacts": [
          "Identifiable"
        ],
        "id": 15893,
        "type": "PRG",
        "addressStr": "г Чебоксары, пр-кт Мира",
        "fiasCode": "bb5f4fab-64ea-4042-a61b-9b2bdb55442d",
        "flat": "1",
        "countryId": "RUS",
        "house": "1",
        "zipCode": "428022",
        "city": "Чебоксары",
        "street": "Мира",
        "region": "Чувашская Республика",
        "eTag": "C90BE244DC0650255C9D3078C7C7EDEA8013BB6E"
      }
    ]
  },
  "documents": {
    "stateFacts": [
      "hasSize"
    ],
    "size": 2,
    "eTag": "E752C6CFC8CBAE112527BF2AA07CB0A173143065",
    "elements": [
      {
        "stateFacts": [
          "EntityRoot"
        ],
        "id": 3571,
        "type": "RF_PASSPORT",
        "vrfStu": "VERIFIED",
        "series": "5303",
        "number": "925695",
        "issueDate": "01.01.2006",
        "issueId": "006006",
        "issuedBy": "УФМС006",
        "eTag": "2E1F79E93B9DF6F5A579F95069630742D41C6AFB"
      },
      {
        "stateFacts": [
          "EntityRoot"
        ],
        "id": 21213,
        "type": "RF_DRIVING_LICENSE",
        "vrfStu": "NOT_VERIFIED",
        "series": "1222",
        "number": "884455",
        "issueDate": "01.09.2014",
        "expiryDate": "01.08.2024",
        "eTag": "E9D14F10321D0021A1267B8D363B22B102387735"
      }
    ]
  },
  "vehicles": {
    "stateFacts": [
      "hasSize"
    ],
    "size": 1,
    "eTag": "9D0855F880F882EBCFD93C329C4720D5DB4058D9",
    "elements": [
      {
        "stateFacts": [
          "Identifiable"
        ],
        "id": 17743,
        "name": "Моя птичка",
        "numberPlate": "А123АА111",
        "regCertificate": {
          "series": "1231",
          "number": "231231"
        },
        "eTag": "A99823275D311CB97A371A420A59AA6BB08B42B7"
      }
    ]
  },
  "status": "REGISTERED",
  "verifying": false,
  "rIdDoc": 3571,
  "containsUpCfmCode": false,
  "eTag": "61F2A6BF9D17B97E6B56F8B10EB28A7C814FF0B4"
}
```

Тестирование
------------

[](#тестирование)

Node используется для интерактивного логина на тестовый стенд (бот на базе chromium -- puppeteer)

```
vendor/bin/simple-phpunit --debug
```

Ссылки
------

[](#ссылки)

1. [Единая система идентификации и аутентификации](https://ru.wikipedia.org/wiki/%D0%95%D0%B4%D0%B8%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8)
2. [Methodical recommendations](https://digital.gov.ru/documents/metodicheskie-rekomendaczii-po-ispolzovaniyu-esia)

###  Health Score

63

—

FairBetter than 99% of packages

Maintenance86

Actively maintained with recent releases

Popularity49

Moderate usage in the ecosystem

Community22

Small or concentrated contributor base

Maturity79

Established project with proven stability

 Bus Factor1

Top contributor holds 98.6% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~104 days

Recently: every ~18 days

Total

28

Last Release

91d ago

Major Versions

1.5.1 → 2.0.02026-02-17

PHP version history (3 changes)1.0PHP ^5.6 || ^7.0

1.5.0PHP ^5.6 || ^7.0 || ^8.0

2.0.0PHP ^7.4 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/5f986f04f2e4314d3b96ed62117f4298f07d8952d3b5ec6e00cf127d63f4046f?d=identicon)[garex](/maintainers/garex)

---

Top Contributors

[![garex](https://avatars.githubusercontent.com/u/77981?v=4)](https://github.com/garex "garex (144 commits)")[![Kaile](https://avatars.githubusercontent.com/u/5454122?v=4)](https://github.com/Kaile "Kaile (1 commits)")[![SergeySidorov](https://avatars.githubusercontent.com/u/5655042?v=4)](https://github.com/SergeySidorov "SergeySidorov (1 commits)")

---

Tags

esiaoauth2oauth2-provideropenid-connectoauth2OpenID Connectoauth2-provideresia

### Embed Badge

![Health badge](/badges/ekapusta-oauth2-esia/health.svg)

```
[![Health](https://phpackages.com/badges/ekapusta-oauth2-esia/health.svg)](https://phpackages.com/packages/ekapusta-oauth2-esia)
```

###  Alternatives

[google/auth

Google Auth Library for PHP

1.4k272.7M162](/packages/google-auth)[league/oauth2-google

Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client

42121.2M118](/packages/league-oauth2-google)[patrickbussmann/oauth2-apple

Sign in with Apple OAuth 2.0 Client Provider for The PHP League OAuth2-Client

1132.5M6](/packages/patrickbussmann-oauth2-apple)[thenetworg/oauth2-azure

Azure Active Directory OAuth 2.0 Client Provider for The PHP League OAuth2-Client

2509.6M48](/packages/thenetworg-oauth2-azure)[stevenmaguire/oauth2-keycloak

Keycloak OAuth 2.0 Client Provider for The PHP League OAuth2-Client

2275.9M27](/packages/stevenmaguire-oauth2-keycloak)[simplesamlphp/simplesamlphp-module-oidc

A SimpleSAMLphp module adding support for the OpenID Connect protocol

5016.9k1](/packages/simplesamlphp-simplesamlphp-module-oidc)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
