Авторизация пользователей через OAUTH2 в ЕСИА

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску

Буду писать основные моменты, когда получится все опишу подробно.
Описание всего этого дела лежит тут. Правда в нем уже куча ошибок. Обещают поправить в будущем.

Генерация ключа

создаем файл config.cfg

# Параметры для генерации открытого ключа.
[ req ]
# Секция основных опций
default_bits=2048
# Число бит
#default_keyfile=miac.pem
# Имя ключа, используемого для сертификата
distinguished_name=req_distinguished_name
# DN организации, выдавшей сертификат
prompt=no
# Брать параметры из конфига неинтерактивный режим
[ req_distinguished_name ]
# DN организации
CN=RU
# Страна
ST=Vologodskaya
# Область
L=Vologda
# Город
O=MIAC
# Название организации
OU=MIAC
# Название отделения
CN=volmed.org.ru
# Имя для сертификата (персоны, получающей сертификат)
emailAddress=miac35@mail.ru
# Мыло организации

Создаем файл генерации esia.sh. Сделал ключи без пароля.

openssl req  -x509 -sha256 -newkey rsa:2048 -nodes -days 3650 \
    -keyout miac_priv.pem \
    -out miac_root.pem \
    -config config.cfg

Запускаем его и получаем 2 файла сертификата.

$ sh esia.sh

Регистрация ИС

  1. Получаем ЭЦП на руководителя для входа на сайт ГУ
  2. Настраиваем комп для входа с этой ЭЦП. Учтите на данный момент при входе через FF, версия его дб , иначе не установится плагин для работы с ГУ.
  3. Входим на сайт ГУ.
  4. Регистрируем организацию.
  5. Регистрируем ИС. При этом загружаем сгенерированный файл сертификата miac_root.pem.

Создание заявки для подключения к тестовой версии ЕСИА

Делаем заявку для подключения к ЕСИА. Описание есть тут.

Как все работает

  1. Сначала делаем запрос на https://esia-portal1.test.gosuslugi.ru/aas/oauth2/ac на авторизацию . Более подробно можно посмотреть в документации. Единственно, scope дб openid. Это ссылка с GET параметрами (В.2.2).
    Структура запроса
    1. client_id=LPUV01355 - Выданный при регистрации ИС на сайте ГУ. Можно посмотреть тут
    2. client_secret=MIIG1wYJKoZI.........
    3. redirect_uri=https%3A%2F%2Fzapis.volmed.org.ru%2Fesia.php
    4. scope=openid fullname birthday gender snils medical_doc email # Указываем все scope, к которым нам нужен доступ, что бы при Логине в ЕСИА запросило разрешение к этим параметрам
    5. response_type=code
    6. state=5f0fd916-2499-4719-8236-d895ac458979
    7. access_type=offline
    8. timestamp=2017.07.01+10%3A59%3A50+%2B0300
  2. В ответ получаем code авторизации.
  3. Используем данный code для запроса токена. Запрос на адрес https://esia-portal1.test.gosuslugi.ru/aas/oauth2/te (п. В.2.3 Получение маркера доступа в обмен на авторизационный код). Структура запроса
    1. [client_id] => LPUV01355
    2. [code] => Полученный при авторизации код
    3. [grant_type] => authorization_code
    4. [client_secret] => MIIG1wYJKoZIhvcNAQcCoIIGy.... формируется как и при авторизации
    5. [state] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813 снова формируется новый
    6. [redirect_uri] => https://zapis.volmed.org.ru/esia/response.php (Может и не нужен)
    7. [scope] => openid fullname birthday gender snils medical_doc email #- В доке написано, что scope дб такой же, как при авторизации (тут стр 135)
    8. [timestamp] => 2017.07.01 11:15:40 +0300
    9. [token_type] => Bearer
    10. [refresh_token] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813
  4. В ответ получаем следующий массив в json формате
    1. [state] => 85caac25-8af0-43eb-9fce-590d4588b58f - набор случайных символов, имеющий вид 128-битного идентификатора запроса, генерируется по стандарту UUID (совпадает с идентификатором запроса);
    2. [token_type] => Bearer – тип предоставленного маркера, в настоящее время ЕСИА поддерживает только значение “Bearer”;
    3. [expires_in] => 3600 – время, в течение которого истекает срок действия маркера (в секундах);
    4. [refresh_token] => b147fb72-387c-4cee-ac91-6f23ca9014c9 – маркер обновления для данного ресурса.
    5. [id_token] => eyJhbGciOiJSUzI1NiI...................
    6. [access_token] => eyJhbGciOiJSUzI1NiIsInNidCI6ImFjY2VzcyIsInR5cCI6IkpXVCIsIn.............
  5. access_tiket согласно В.5 Сведения о структуре и проверке маркера доступа, состоит из 3 разделов разбитых точкой (HEADER.PAYLOAD.SIGNATURE)
    1. Разбиваем эту строку на 3 переменных по точке.
    2. URL декодируем вторую часть. Получаем json закодированную строку.
    3. Декодируем Json закодированную строку и получаем.
[exp] => 1498910323    - время прекращения действия (“exp”) – в секундах с 1 января 1970 г. 00:00:00 GMT;
[scope] => openid  область доступа (“scope”), в качестве значения – название области, к которой 
предоставляется доступ (например, id_doc)
[iss] => http://esia.gosuslugi.ru/ - организация, выпустившая маркер (“iss”), для маркеров ЕСИА всегда 
имеет определенное значение, которое совпадает с полем «субъект» используемого сертификата 
ЕСИА (http://субъект);
[nbf] => 1498906723  - время начала действия (“nbf”) – в секундах с 1 января 1970 г. 00:00:00 GMT, 
т.е. маркер нельзя обрабатывать до наступления указанного времени;
[urn:esia:sid] => e16a6dac86d15984ce2b28cd3922104adf19eba87f8f2b19b86d03940d8d6b94 - идентификатор 
маркера (“urn:esia:sid”) – набор случайных символов, имеющий вид 128-битного идентификатора, 
сгенерированного по стандарту UUID.
[urn:esia:sbj_id] => 1000330799  - идентификатор субъекта (“urn:esia:sbj_id”), в качестве значения 
указывается oid, этот идентификатор уникален для каждого субъекта, зарегистрированного в ЕСИА;
[client_id] => LPUV01351
[iat] => 1498906723   - время выдачи (“iat”) – в секундах с 1 января 1970 г. 00:00:00 GMT;
  1. Далее согласно описанию Б2 Предоставление персональных данных пользователей стр.88 формируем GET запрос на адрес https://esia-portal1.test.gosuslugi.ru/rs/prns/1000330799, где 1000330799 - это oid пользователя, полученный из запроса токена.
    В запрос должен быть добавлен header с маркером доступа, позволяющим получить доступ к данному ресурсу,
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . [access_token]]);
    [access_token] - это access_token из запроса токена.
  2. В ответ получаем JSON c с нужными нам параметрами.
[stateFacts] => Array
(
    [0] => EntityRoot
)
[eTag] => 9110D37207E621894C10053458D54C5EBDFF11BE
[firstName] => Имя004
[lastName] => Фамилия004
[middleName] => Отчество004
[birthDate] => 04.01.1994
[gender] => M
[trusted] => 1
[snils] => 000-000-600 04
[updatedOn] => 1497610026
[status] => REGISTERED
[verifying] => 
[rIdDoc] => 3559
[containsUpCfmCode] => 

На этом пока все. Буду дописывать, по мере продвижения.

Использую Class