Авторизация пользователей через OAUTH2 в ЕСИА: различия между версиями
Перейти к навигации
Перейти к поиску
Misha (обсуждение | вклад) (→Регистрация ИС) |
Misha (обсуждение | вклад) (→Как все работает) |
||
(не показано 11 промежуточных версий этого же участника) | |||
Строка 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 | ||
##access_type=offline | ##access_type=offline | ||
##timestamp=2017.07.01+10%3A59%3A50+%2B0300 | ##timestamp=2017.07.01+10%3A59%3A50+%2B0300 | ||
+ | #В ответ получаем code авторизации. | ||
+ | #Используем данный code для запроса токена. Запрос на адрес https://esia-portal1.test.gosuslugi.ru/aas/oauth2/te (п. В.2.3 Получение маркера доступа в обмен на авторизационный код). Структура запроса | ||
+ | ##[client_id] => LPUV01355 | ||
+ | ##[code] => Полученный при авторизации код | ||
+ | ##[grant_type] => authorization_code | ||
+ | ##[client_secret] => MIIG1wYJKoZIhvcNAQcCoIIGy.... формируется как и при авторизации | ||
+ | ##[state] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813 снова формируется новый | ||
+ | ##[redirect_uri] => https://zapis.volmed.org.ru/esia/response.php (Может и не нужен) | ||
+ | ##[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 | ||
+ | ##[token_type] => Bearer | ||
+ | ##[refresh_token] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813 | ||
+ | #В ответ получаем следующий массив в json формате | ||
+ | ##[state] => 85caac25-8af0-43eb-9fce-590d4588b58f - набор случайных символов, имеющий вид 128-битного идентификатора запроса, генерируется по стандарту UUID (совпадает с идентификатором запроса); | ||
+ | ##[token_type] => Bearer – тип предоставленного маркера, в настоящее время ЕСИА поддерживает только значение “Bearer”; | ||
+ | ##[expires_in] => 3600 – время, в течение которого истекает срок действия маркера (в секундах); | ||
+ | ##[refresh_token] => b147fb72-387c-4cee-ac91-6f23ca9014c9 – маркер обновления для данного ресурса. | ||
+ | ##[id_token] => eyJhbGciOiJSUzI1NiI................... | ||
+ | ##[access_token] => eyJhbGciOiJSUzI1NiIsInNidCI6ImFjY2VzcyIsInR5cCI6IkpXVCIsIn............. | ||
+ | #access_tiket согласно '''В.5 Сведения о структуре и проверке маркера доступа''', состоит из 3 разделов разбитых точкой (HEADER.PAYLOAD.SIGNATURE) | ||
+ | ##Разбиваем эту строку на 3 переменных по точке. | ||
+ | ##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
Регистрация ИС
- Получаем ЭЦП на руководителя для входа на сайт ГУ
- Настраиваем комп для входа с этой ЭЦП. Учтите на данный момент при входе через FF, версия его дб , иначе не установится плагин для работы с ГУ.
- Входим на сайт ГУ.
- Регистрируем организацию.
- Регистрируем ИС. При этом загружаем сгенерированный файл сертификата miac_root.pem.
Создание заявки для подключения к тестовой версии ЕСИА
Делаем заявку для подключения к ЕСИА. Описание есть тут.
Как все работает
- Сначала делаем запрос на https://esia-portal1.test.gosuslugi.ru/aas/oauth2/ac на авторизацию . Более подробно можно посмотреть в документации. Единственно, scope дб openid. Это ссылка с GET параметрами (В.2.2).
Структура запроса- client_id=LPUV01355 - Выданный при регистрации ИС на сайте ГУ. Можно посмотреть тут
- client_secret=MIIG1wYJKoZI.........
- redirect_uri=https%3A%2F%2Fzapis.volmed.org.ru%2Fesia.php
- scope=openid fullname birthday gender snils medical_doc email # Указываем все scope, к которым нам нужен доступ, что бы при Логине в ЕСИА запросило разрешение к этим параметрам
- response_type=code
- state=5f0fd916-2499-4719-8236-d895ac458979
- access_type=offline
- timestamp=2017.07.01+10%3A59%3A50+%2B0300
- В ответ получаем code авторизации.
- Используем данный code для запроса токена. Запрос на адрес https://esia-portal1.test.gosuslugi.ru/aas/oauth2/te (п. В.2.3 Получение маркера доступа в обмен на авторизационный код). Структура запроса
- [client_id] => LPUV01355
- [code] => Полученный при авторизации код
- [grant_type] => authorization_code
- [client_secret] => MIIG1wYJKoZIhvcNAQcCoIIGy.... формируется как и при авторизации
- [state] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813 снова формируется новый
- [redirect_uri] => https://zapis.volmed.org.ru/esia/response.php (Может и не нужен)
- [scope] => openid fullname birthday gender snils medical_doc email #- В доке написано, что scope дб такой же, как при авторизации (тут стр 135)
- [timestamp] => 2017.07.01 11:15:40 +0300
- [token_type] => Bearer
- [refresh_token] => 5d77d9ac-5d55-494d-8a0c-1e5f021aa813
- В ответ получаем следующий массив в json формате
- [state] => 85caac25-8af0-43eb-9fce-590d4588b58f - набор случайных символов, имеющий вид 128-битного идентификатора запроса, генерируется по стандарту UUID (совпадает с идентификатором запроса);
- [token_type] => Bearer – тип предоставленного маркера, в настоящее время ЕСИА поддерживает только значение “Bearer”;
- [expires_in] => 3600 – время, в течение которого истекает срок действия маркера (в секундах);
- [refresh_token] => b147fb72-387c-4cee-ac91-6f23ca9014c9 – маркер обновления для данного ресурса.
- [id_token] => eyJhbGciOiJSUzI1NiI...................
- [access_token] => eyJhbGciOiJSUzI1NiIsInNidCI6ImFjY2VzcyIsInR5cCI6IkpXVCIsIn.............
- access_tiket согласно В.5 Сведения о структуре и проверке маркера доступа, состоит из 3 разделов разбитых точкой (HEADER.PAYLOAD.SIGNATURE)
- Разбиваем эту строку на 3 переменных по точке.
- URL декодируем вторую часть. Получаем json закодированную строку.
- Декодируем 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;
- Далее согласно описанию Б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 из запроса токена. - В ответ получаем 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