Авторизация пользователей через OAUTH2 в ЕСИА: различия между версиями

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску
(Как все работает)
(Как все работает)
 
(не показано 8 промежуточных версий этого же участника)
Строка 54: Строка 54:
 
Делаем заявку для подключения к ЕСИА. Описание есть [http://minsvyaz.ru/ru/documents/4244/ тут].<br>
 
Делаем заявку для подключения к ЕСИА. Описание есть [http://minsvyaz.ru/ru/documents/4244/ тут].<br>
 
==Как все работает==
 
==Как все работает==
# Сначала делаем запрос на https://esia-portal1.test.gosuslugi.ru/aas/oauth2/ac на авторизацию . Более подробно можно посмотреть в документации. Единственно, scope дб openid.  Это ссылка с GET параметрами.<br>Структура запроса
+
# Сначала делаем запрос на https://esia-portal1.test.gosuslugi.ru/aas/oauth2/ac на авторизацию . Более подробно можно посмотреть в документации. Единственно, scope дб openid.  Это ссылка с GET параметрами (В.2.2).<br>Структура запроса
 
##client_id=LPUV01355 - Выданный при регистрации ИС на сайте ГУ. Можно посмотреть [https://esia.gosuslugi.ru/console/tech/ тут]
 
##client_id=LPUV01355 - Выданный при регистрации ИС на сайте ГУ. Можно посмотреть [https://esia.gosuslugi.ru/console/tech/ тут]
 
##client_secret=MIIG1wYJKoZI.........
 
##client_secret=MIIG1wYJKoZI.........
 
##redirect_uri=https%3A%2F%2Fzapis.volmed.org.ru%2Fesia.php
 
##redirect_uri=https%3A%2F%2Fzapis.volmed.org.ru%2Fesia.php
##scope=openid
+
##scope=openid fullname birthday gender snils medical_doc email    # Указываем все scope, к которым нам нужен доступ, что бы при Логине в ЕСИА запросило разрешение к этим параметрам
 
##response_type=code
 
##response_type=code
 
##state=5f0fd916-2499-4719-8236-d895ac458979
 
##state=5f0fd916-2499-4719-8236-d895ac458979
Строка 64: Строка 64:
 
##timestamp=2017.07.01+10%3A59%3A50+%2B0300
 
##timestamp=2017.07.01+10%3A59%3A50+%2B0300
 
#В ответ получаем code авторизации.
 
#В ответ получаем code авторизации.
#Используем данный code для запроса токена. Структура запроса  
+
#Используем данный code для запроса токена. Запрос на адрес https://esia-portal1.test.gosuslugi.ru/aas/oauth2/te  (п. В.2.3 Получение маркера доступа в обмен на авторизационный код). Структура запроса  
 
##[client_id] => LPUV01355
 
##[client_id] => LPUV01355
 
##[code] => Полученный при авторизации код  
 
##[code] => Полученный при авторизации код  
Строка 71: Строка 71:
 
##[state] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813  снова формируется новый
 
##[state] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813  снова формируется новый
 
##[redirect_uri] => https://zapis.volmed.org.ru/esia/response.php (Может и не нужен)
 
##[redirect_uri] => https://zapis.volmed.org.ru/esia/response.php (Может и не нужен)
##[scope] => openid    - В доке написано, что scope дб такой же, как при авторизации ([http://minsvyaz.ru/uploaded/presentations/esiametodicheskierekomendatsii223.pdf тут] стр 135)
+
##[scope] => openid fullname birthday gender snils medical_doc email   #- В доке написано, что scope дб такой же, как при авторизации ([http://minsvyaz.ru/uploaded/presentations/esiametodicheskierekomendatsii223.pdf тут] стр 135)
 
##[timestamp] => 2017.07.01 11:15:40 +0300
 
##[timestamp] => 2017.07.01 11:15:40 +0300
 
##[token_type] => Bearer
 
##[token_type] => Bearer
 
##[refresh_token] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813
 
##[refresh_token] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813
#В ответ получаем маркер обновления, который можно использовать для продления сессии, когда данная сессия устареет
+
#В ответ получаем следующий массив в json формате
#Вот далее пока не понятно. По идее мы должны послать запрос на получение маркера доступа (п.В.3.2 документации). Вот его структура
+
##[state] => 85caac25-8af0-43eb-9fce-590d4588b58f - набор случайных символов, имеющий вид 128-битного идентификатора запроса, генерируется по стандарту UUID (совпадает с идентификатором запроса);
##[client_id] => LPUV01355
+
##[token_type] => Bearer – тип предоставленного маркера, в настоящее время ЕСИА поддерживает только значение “Bearer”;
##[response_type] => token
+
##[expires_in] => 3600 – время, в течение которого истекает срок действия маркера (в секундах);
##[grant_type] => client_credentials
+
##[refresh_token] => b147fb72-387c-4cee-ac91-6f23ca9014c9 – маркер обновления для данного ресурса.
##[scope] => fullname gender
+
##[id_token] => eyJhbGciOiJSUzI1NiI...................
##[state] => a4947434-f9ac-4267-b83b-7e4036998898
+
##[access_token] => eyJhbGciOiJSUzI1NiIsInNidCI6ImFjY2VzcyIsInR5cCI6IkpXVCIsIn.............
##[timestamp] => 2017.07.01 11:47:14 +0300
+
#access_tiket согласно '''В.5 Сведения о структуре и проверке маркера доступа''', состоит из 3 разделов разбитых точкой (HEADER.PAYLOAD.SIGNATURE)
##[token_type] => Bearer
+
##Разбиваем эту строку на 3 переменных по точке.
##[client_secret] => MIIG1wYJK...............
+
##URL декодируем вторую часть. Получаем json закодированную строку.
 +
##Декодируем Json закодированную строку и получаем.
 +
<pre>[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;
 +
</pre>
 +
#Далее согласно описанию '''Б2 Предоставление персональных данных пользователей''' стр.88 формируем GET запрос на адрес https://esia-portal1.test.gosuslugi.ru/rs/prns/1000330799, где 1000330799 - это oid пользователя, полученный из запроса токена.<br>В  запрос  должен  быть  добавлен header с  маркером  доступа,  позволяющим  получить доступ к данному ресурсу,<pre>curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . [access_token]]);</pre>[access_token] - это access_token из запроса токена.  
 +
#В ответ получаем JSON c с нужными нам параметрами.
 +
<pre>
 +
[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] =>
 +
</pre>
 +
 
 
На этом пока все. Буду дописывать, по мере продвижения.
 
На этом пока все. Буду дописывать, по мере продвижения.
  
 
Использую [https://github.com/fr05t1k/esia Class]<br>
 
Использую [https://github.com/fr05t1k/esia Class]<br>

Текущая версия на 20:10, 3 июля 2017

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

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

создаем файл 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