Аутентификация через госуслуги (ЕСИА)
Для аутентификации ЕСИА реализует стандарты SAML и OpenID Connect 1.0, но с некоторыми отличиями от RFC. В данной статье рассматривается реализация аутентификации с использованием OpenID Connect 1.0. Для того, чтобы подключить аутентификацию через ЕСИА к сайту, нужно зарегистрировать ИС на сайте ГосУслуги, и в результате вы получите идентификатор приложения, публичный сертификат и приватный ключ. Далее, на сайте размещается кнопка “Войти через ГосУслуги”, которая перенаправляет пользователя на ЕСИА. Url ссылки рассчитывается следующим образом:
https://<ESIA_HOST>/aas/oauth2/ac?client_id={0}&client_secret={1}
&redirect_uri={2}&scope={3}&response_type=code&state={4}
×tamp={5}&access_type={6}
Параметр | Описание |
---|---|
ESIA_HOST | сервер ЕСИА, для продуктивной среды хост будет esia.gosuslugi.ru, для тестовой среды - esia-portal1.test.gosuslugi.ru. |
client_id | Идентификатор приложения |
client_secret | Секрет приложения, рассчиывтается динамически с использованием ключа и сертификата |
redirect_uri | URL, на который будет перенаправлен пользователь после аутентификации в ЕСИА, содержит ответ аутентификации |
scope | Набор запрашиваемых у пользователя разрешений на доступ к данным |
response_type | тип ответа, который возвращает ЕСИА может быть или code или token |
state | Набор случайных символов, имеющий формат UUID |
timestamp | Время аутентификаци в формате yyyy.MM.dd HH:mm:ss Z |
access_type | online - если требуется доступ только при присуствии пользователя, offline - доступ предоставляется без присуствия пользователя |
Расчет секрета приложения (client_secret)
Секрет приложения расчитывается как подпись конкатенации параметров scope, timestamp, client_id, state, закодированная как base64 URL safe.
Пример класса расчета подписи
Расчет client_secret
Если URL сформирован корректно, пользователя перенаправляет на портал ЕСИА, где пользователь проходит аутентификацию, и соглашается на доступ к его данным. Если аутенитфикация прошла успешно, то ЕСИА перенаправляет пользтваеля на целевой сайт, и в URL передает два параметра code и state
- state - предзназначен для проверки безопасности ответа ЕСИА, должен совпадать со state переданным в URL авторизации ЕСИАю
- code - код авторизации, обменивается на access_token, с помощью которого осуществляется доступ к данным.
Получение метки доступа (access_token)
После того, как получе код авторизации, его нужно обменять на access_token. Для этого нужно отправить POST запрос по адресу
https://<ESIA_HOST>/aas/oauth2/te
с параметрами