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

Материал из Wiki МИАЦ ВО
Версия от 14:33, 1 июля 2017; Misha (обсуждение | вклад) (Как все работает)
Перейти к навигации Перейти к поиску

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

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

создаем файл 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
    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 - В доке написано, что 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
    2. [token_type] => 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 закодированную строку и получаем.
      1. [exp] => 1498910323 - время прекращения действия (“exp”) – в секундах с 1 января 1970 г. 00:00:00 GMT;
      2. [scope] => openid область доступа (“scope”), в качестве значения – название области, к которой предоставляется доступ (например, id_doc)
      3. [iss] => http://esia.gosuslugi.ru/ - организация, выпустившая маркер (“iss”), для маркеров ЕСИА всегда имеет определенное значение, которое совпадает с полем «субъект» используемого сертификата ЕСИА (http://субъект);
      4. [nbf] => 1498906723 - время начала действия (“nbf”) – в секундах с 1 января 1970 г. 00:00:00 GMT, т.е. маркер нельзя обрабатывать до наступления указанного времени;
      5. [1] => e16a6dac86d15984ce2b28cd3922104adf19eba87f8f2b19b86d03940d8d6b94 - идентификатор маркера (“urn:esia:sid”) – набор случайных символов, имеющий вид 128-битного идентификатора, сгенерированного по стандарту UUID.
      6. [2] => 1000330799 - идентификатор субъекта (“urn:esia:sbj_id”), в качестве значения указывается oid, этот идентификатор уникален для каждого субъекта, зарегистрированного в ЕСИА;
      7. [client_id] => LPUV01351
      8. [iat] => 1498906723 - время выдачи (“iat”) – в секундах с 1 января 1970 г. 00:00:00 GMT;
маркер обновления , который можно использовать для продления сессии, когда данная сессия устареет
  1. Вот далее пока не понятно. По идее мы должны послать запрос на получение маркера доступа (п.В.3.2 документации). Запрос на адрес https://esia-portal1.test.gosuslugi.ru/aas/oauth2/te Вот его структура
    1. [client_id] => LPUV01355 мнемоника ИС
    2. [response_type] => token
    3. [grant_type] => client_credentials
    4. [scope] => fullname gender то что мы хотим получить с сайта ГУ
    5. [state] => a4947434-f9ac-4267-b83b-7e4036998898 генерится новый
    6. [timestamp] => 2017.07.01 11:47:14 +0300
    7. [token_type] => Bearer
    8. [client_secret] => MIIG1wYJK............... генерится как обычно

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

Использую Class