img3

© 2014 - 2024 esia.pro

Инструкция по интеграции модуля авторизации через ЕСИА (Ruby)

1 Общее описание

Библиотека (gem) содержит набор функций реализованных на языке программирования Ruby позволяющих организовать взаимодействие с сервисами Единой системы идентификации и аутентификации (ЕСИА) по протоколу OAuth 2.0. Подробную информацию о данном протоколе и принципах взаимодействия с ЕСИА можно получить в методических рекомендациях по использованию ЕСИА Важно учесть, что библиотека авторизации поставляется в 2-х версиях базовой и расширенной. Основным отличием расширенной версии от базовой является возможность получения дополнительного набора сведений о пользователе (см. Приложение Б - Перечень запрашиваемых областей доступа). Условия поставки базовой или расширенной версии необходимо обговаривать заранее с Вашим персональным менеджером.

2 Перечень поставляемых файлов

  • Gemfile - файл, содержащий перечень необходимых гемов;
  • Gemfile.lock - файл, сформированный бандлером bundle install, в котором содержится полный перечень зависимостей для данного гема;
  • omniauth-esia_oauth.gemspec - файл спецификации гема;
  • bin/test.rb - тест для проверки функциональности гема;
  • lib/omniauth-esia_oauth.rb - модуль, в котором подключаются все необходимые зависимости;
  • lib/omniauth/strategies/esia_oauth.rb - модуль, реализующий взаимодействие с сервисами ЕСИА;
  • lib/esia_oauth/
  • access_token.rb - модуль, реализующий функции для получения маркера доступа от ЕСИА;
  • cryptopro_crypt.rb - модуль, реализующий функции подписания и проверки подписи на основе ГОСТ2012 алгоритмов, используя прямые (системные) вызовы КриптоПРО CSP;
  • jigner.rb - модуль, реализующий функции подписания и проверки подписи на основе ГОСТ2012 и RSA алгоритмов, используя сетевые вызовы (по http-протоколу) сервиса подписания Jigner;
  • openssl_crypt.rb - модуль, реализующий функции подписания и проверки подписи на основе ГОСТ2012 алгоритмов, используя прямые (системные) вызовы OpenSSL;
  • rsa_crypt.rb - модуль, реализующий функции подписания и проверки подписи на основе RSA-алгоритма, используя встроенные функции-обёртки Ruby для работы с OpenSSL;
  • utils.rb - модуль, реализующий функции кодирования/декодирования base64 в соответствии с требованиями RFC4684;
  • version.rb - модуль, содержащий глобальную константу, определяющую версию гема.

3 Основные функции

Основными функциями библиотеки авторизации являются: - получение авторизационного кода ЕСИА; - обмен авторизационного кода на маркер доступа; - получение данных пользователя из ЕСИА (в приложении Б перечислены скоупы, которые может получать базовая и расширенная версии библиотеки); - выход (логаут) на стороне ЕСИА; - подписание запросов к ЕСИА на основе криптографических средств, установленных на удалённом сервере (взаимодействие с сервисом подписания Jigner).

4 Интеграция библиотеки

Перед началом интеграции необходимо: - выполнить конфигурирование OpenSSL, подключив gost-engine с поддержкой алгоритмов ГОСТ Р 34.10-2012 и ГОСТ Р 34.11- 2012. Если подписание происходит на стороне сервиса Jigner, то OpenSSL настраивать не нужно; - настроить для вашей системы HTTPS (это обязательное требование, поскольку данные между вашей системой и ЕСИА передаются в открытом виде); - выполнить экспорт ключевой пары (сформированной по ГОСТ2012) из криптоконтейнера (экспорт можно сделать с помощью нашей утилитой). Если подписание будет происходить на стороне Jigner, то экспорт делать не нужно; - настроить систему на технологическом портале тестовой/промышленной ЕСИА. На технологическом портале в окне редактирования параметров системы указать URL возврата после авторизации и логаута, а также установить алгоритм подписания запросов GOST3410_2012_256.

img1

img2

Поскольку библиотека поставляется в виде модулей с открытым исходным кодом она может быть интегрирована в кодовую базу любого проекта на Ruby (при соблюдении требований к зависимостям, которые описаны в разделе 5). Для интеграции библиотеки необходимо выполнить следующие шаги описанные ниже.

Шаг 0. Установить необходимые зависимости, описанные в разделе 5.

Шаг 1. Распаковать архив с библиотекой в рабочей директории, в которую она должна быть установлена. Подключить гем в Gemfile

gem 'omniauth-esia_oauth', path: '/<working_directory_path>/omniauth-esia'

Шаг 2. Если для подписания запросов к ЕСИА используется Jigner, то ключевую пару вашей системы необходимо загрузить в криптохранилище сервиса (см. инструкцию по эксплуатации Jigner), в ином случае создайте директорию для хранения сертификатов (в Rails-приложении это может быть config/keys/) и загрузите в неё сертификат и ключ в PEM-формате (для извлечения ключа и сертификата из криптоконтейнера можно воспользоваться нашей утилитой). Удостоверьтесь, что тот же сертификат загружен на технологическом портале тестовой/промышленной ЕСИА.

Шаг 3. В ту же директорию со 2-го шага необходимо положить файл сертификата ЕСИА в PEM формате с именем esia-test.crt или esia-prod.crt в зависимости от окружения (тестовое/промышленное), в котором запускается код.

Шаг 4. ВАЖНО Настроить доступ к директориям для размещения файлов сертификата и ключа таким образом, чтобы их файлы нельзя было получить извне.

Шаг 5. В файле config/initializers/devise.rb задать конфигурационные параметры для библиотеки.

Devise.setup do |config|
  config.omniauth :esia_oauth,
    # redirect_uri: 'http://wifi.rnds.pro/prophet/accounts/auth/esia_oauth/callback',
    # logout_redirect_uri: 'http://wifi.rnds.pro/',
    # client_id: 'PRDT01611',
    scope: 'openid fullname id_doc', # набор скоупов доступный для всех систем, подключаемых к ЕСИА
    #В 2.13 уже нет коротких
    # scope: [
      # 'openid',
      # 'birth_cert_doc', 'birthdate', 'birthplace', 'contacts', 'drivers_licence_doc',
      # 'email', 'foreign_passport_doc', 'fullname', 'gender', 'id_doc', 'inn',
      # 'medical_doc', 'military_doc', 'mobile', 'residence_doc', 'snils',
      # 'temporary_residence_doc', 'vehicles', 'kid_fullname', 'kid_birthdate',
      # 'kid_gender', 'kid_snils', 'kid_inn', 'kid_birth_cert_doc', 'kid_medical_doc',
    # ].join(" "),

    # при crypto_provider = :cryptopro не заполняется
    cert_path: "#{Rails.root}/config/keys/oauth_cert.crt",

    # при crypto_provider = :cryptopro не заполняется
    pkey_path: "#{Rails.root}/config/keys/oauth_secret.key",

    # при crypto_provider = :cryptopro не заполняется
    esia_cert_path: "#{Rails.root}/config/keys/oauth_esia_cert.crt",

    debug: false,
    test: false,
    contacts_info: true,
    addresses_info: true,
    docs_info: true,
    orgs_info: true,
    kids_info: false,
    vehicle_info: true,
    crypto_provider: :rsa #одно из значений :rsa(по умолчанию), :cryptopro, :openssl
    cryptopro_opts: { # заполняется только при crypto_provider = :cryptopro
                      kps: 'CN=test',
                      pin: '123456789',
                      path: nil
    }
    end

Более подробно параметры библиотеки описаны в приложении А.

Шаг 6. В модели пользователя включить модуль :omniauthable для devise

class User < ActiveRecord::Base

  devise :omniauthable

end

Шаг 7. В маршрутах приложения настроить обработчики

devise_for :users, :controllers => {
  omniauth_callbacks: 'users/omniauth_callbacks'
}

devise_scope :user do
  get '/users/logout/:provider', to: 'users/omniauth_callbacks#logout', as: 'omniauth_logout', provider: /esia/
end

Шаг 8. Добавить контроллер для обработки аутентификации и выхода через ЕСИА

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  
  #хеш с данными полученными от ЕСИА
  def get_auth
    @auth ||= request.env["omniauth.auth"]
    @auth[:info][:snils] =@auth[:info][:snils].to_s.gsub(/[^\d]*/, '').strip if @auth[:info][:snils]
    @auth
  end
  
  #сюда попадаем при любом ответе от ЕСИА
  def esia_oauth

    if get_auth[:info].has_key?(:logout)
      #Выход из ЕСИА прошел успешно
      if get_auth[:info][:logout]
        redirect_to destroy_user_session_path
        return 
      else
        flash[:notice] = "Ошибка выхода из ЕСИА"
        return
      end

      user = User.find_by_name_id(get_auth[:info][:esia_name_id])
      Rails.logger.info "***** Logout User: #{user.inspect}"
      return
    end
    if signed_in?
      #обновляем информацию о пользователе 
      current_user.esia = get_auth
      #сохраняем идентификатор сессии пользователя в базу для дальнейшего LogoutRequest от самой ЕСИА
      current_user.name_id = get_auth[:info][:esia_name_id]
      current_user.save

      #сохраняем идентификатор сессии ЕСИА для дальнейшего запроса LogoutRequest от нас
      session[:esia_session_index] = get_auth[:extra][:esia_session_index]
      redirect_to :back and return
    end
        
    #ищем или создаем пользователя в нашей ИС
    user = User.where(identifier: get_auth.info.userid).first_or_create
    user.esia = get_auth
    user.name_id = get_auth[:info][:esia_name_id]      
    session[:esia_session_index] = get_auth[:extra][:esia_session_index]
    user.save

    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "ЕСИА"
    sign_in_and_redirect user, :event => :authentication

    #обрабатываем ошибки если есть
    flash[:notice] = "devise.omniauth_callbacks.error"
    redirect_to root_path
  end

  #сюда попадаем при запросе на выход из ЕСИА от нашей ИС
  def logout
    redirect_to user_omniauth_authorize_path(:esia, logout: true,
      esia_name_id: current_user.name_id,
      esia_session_index: session[:esia_session_index] || "") and return
  end
 
end

5 Зависимости

Библиотека авторизации предъявляет следующие языковые требования

Ruby 2.3

В окружении библиотеки авторизации должна присутствовать утилита

OpenSSL v.1.1.x

которую можно вызвать посредством системного вызова. OpenSSL должна поддерживать алгоритмы ГОСТ2012. Для этого необходимо установить расширение

Gost-engine

В случае использования сервиса подписания запросов Signer (Jigner) его необходимо развернуть и настроить к нему доступ со стороны системы, в которую интегрируется библиотека. Для работы библиотеки авторизации необходимо:

* ruby 2.3.0
* devise 3.5.2
* omniauth 1.9.1
* omniauth-oauth2 1.6.0
* awesome_print 1.8.0
* rsa 0.1.4
* uuid 2.3.9

ПРИЛОЖЕНИЕ А
Описание конфигурационных параметров

Библиотека авторизации принимает на вход набор параметров, описанных в таблице А.1.

Таблица А.1 - Описание параметров

Наименование параметра Описание параметра
logout_redirect_uri Определяет адрес возврата в ИС после логаута пользователя в ЕСИА
redirect_uri Определяет адрес возврата в ИС после авторизации пользователя в ЕСИА
client_id Мнемоника, полученная при регистрации ИС в минкомсвязи
scope Перечень областей данных, к которым предоставляется доступ для ИС после авторизации
cert_path Путь к файлу сертификата, содержащему публичный ключ ИС
pkey_path Путь к файлу, содержащему приватный ключ ИС
pkey_file_name Путь к файлу, содержащему закрытый ключ ИС
debug Включение/отключение режима отладки
esia_cert_path Путь к файлу, содержащему сертификат ЕСИА
test Принимает значения TRUE/FALSE. Если указать значение TRUE запросы будут направляться тестовой ЕСИА, а иначе промышленной
contacts_info Получать/не получать данные о контактах
addresses_info Получать/не получать данные об адресах
orgs_info Получать/не получать данные об организациях
docs_info Получать/не получать данные документа удостоверяющего личность
kids_info Получать/не получать данные о детях
vehicle_info Получать/не получать данные о транспортных средствах
crypto_provider Наименование криптопровайдера (возможные значения rsa, openssl, cryptopro)
cryptopro_opts Настройки криптопровайдера (указывается только для cryptopro)

ПРИЛОЖЕНИЕ Б
Перечень запрашиваемых областей доступа

Библиотека авторизации в базовой и расширенной версии запрашивает доступ к разным наборам областей данных (scope) и как следствие получает разные наборы сведений о пользователе. Перечень областей данных (scope) для базовой версии библиотеки приведён в таблице Б.1, а для расширенной версии в таблице Б.2.

Таблица Б.1 - Перечень запрашиваемых областей доступа в базовой версии библиотеки

Название scope Состав набора данных Запрашивается(+)/Не запрашивается(-)
1. fullname Просмотр фамилии, имени и отчества:
- фамилия;
- имя;
- отчество.
+
2. birthdate дата рождения, указанная в учетной записи +
3. gender пол, указанный в учетной записи +
4. snils СНИЛС, указанный в учетной записи +
5. inn ИНН, указанный в учетной записи +
6. id_doc Просмотр данных о документе, удостоверяющем личность:
- серия и номер документа, удостоверяющего личность;
- дата выдачи;
- кем выдан;
- код подразделения;
- гражданство.
+
7. birthplace место рождения. +

Таблица Б.2 - Перечень запрашиваемых областей доступа в расширенной версии библиотеки

Название scope Состав набора данных Запрашивается(+)/Не запрашивается(-)
1. fullname Просмотр фамилии, имени и отчества:
- фамилия;
- имя;
- отчество.
+
2. birthdate дата рождения, указанная в учетной записи +
3. gender пол, указанный в учетной записи +
4. snils СНИЛС, указанный в учетной записи +
5. inn ИНН, указанный в учетной записи +
6. id_doc Просмотр данных о документе, удостоверяющем личность:
- серия и номер документа, удостоверяющего личность;
- дата выдачи;
- кем выдан;
- код подразделения;
- гражданство.
+
7. birthplace место рождения. +
8. medical_doc Просмотр данных полиса ОМС:
- номер полиса ОМС;
- срок действия.
+
9. military_doc Просмотр данных военного билета:
- серия и номер военного билета;
- дата выдачи;
- орган, выдавший документ.
+
10. foreign_passport_doc Просмотр данных заграничного паспорта:
- фамилия, имя, отчество буквами латинского алфавита;
- серия и номер заграничного паспорта;
- дата выдачи;
- срок действия;
- орган, выдавший документ;
- гражданство.
+
11. drivers_licence_doc Просмотр данных водительского удостоверения:
- серия и номер водительского удостоверения;
- дата выдачи;
- срок действия.
+
12. birth_cert_doc Просмотр данных свидетельства о рождении:
- серия и номер свидетельства;
- дата выдачи;
- место государственной регистрации.
+
13. residence_doc Просмотр данных вида на жительство:
- серия и номер вида на жительство;
- дата выдачи.
+
14. temporary_residence_doc Просмотр данных разрешения на временное проживание:
- серия и номер разрешения на временное проживание;
- дата выдачи.
+
15. vehicles Просмотр данных транспортных средств:
- государственный регистрационный знак;
- серия и номер свидетельства о регистрации.
+
16. email адрес электронной почты, указанный в учетной записи +
17. mobile номер мобильного телефона +
18. contacts Просмотр данных о контактах и адресах:
- номер домашнего телефона;
- номер мобильного телефона;
- адрес электронной почты;
- адрес регистрации;
- адрес места проживания.
+
19. usr_org список организаций пользователя. +
20. usr_avt Просмотр изображения (аватара) пользователя:
- получения изображения (аватара);
- создание и обновление изображения (аватара);
- получение исходного изображения (аватара)
-
21. self_employed Просмотр данных о самозанятых
- признак самозанятого;
- категория (вид деятельности).
-
22. kid_fullname Просмотр фамилии, имени и отчества:
- фамилия;
- имя;
- отчество.
+
23. kid_birthdate дата рождения ребенка +
24.. kid_gender Пол ребенка +
25. kid_snils СНИЛС ребенка +
26. kid_inn ИНН ребенка +
27. kid_birth_cert_doc Просмотр данных свидетельства о рождении:
- серия свидетельства;
- номер свидетельства;
- дата выдачи свидетельства;
- кем выдано свидетельство.
-
28. kid_medical_doc Просмотр данных полиса ОМС:
- номер полиса ОМС;
- действителен до ОМС.
-
1. org_shortname Сокращенное наименованиеорганизации -
2. org_fullname Полное наименованиеорганизации -
3. org_type Тип организации -
4. org_ogrn ОГРН организации -
5. org_inn ИНН организации -
6. org_leg ОПФ организации -
7. org_kpp КПП организации -
8. org_agencyterrange Территориальнаяпринадлежность ОГВ -
9. org_agencytype Тип ОГВ -
10. org_oktmo ОКТМО организации -
11. org_ctts Контакты организации: номер телефона, номер факса, адрес электронной почты -
12. org_addrs Адреса организации (почтовый адрес, юридический адрес): индекс, идентификатор страны, адрес в виде строки (не включая дом, строение, корпус, номер квартиры), строение, корпус, дом, квартира, код ФИАС, регион,город, внутригородской район, район, поселение, доп. территория, улица на доп. территории, улица -
13. org_vhls Транспортные средства организации: название, государственный регистрационный знак, серия и номер свидетельства орегистрации -
14. org_grps Группы, владельцемкоторых является организация -
15. org_emps Данные о сотрудникахорганизации -
16. org_brhs Данные о филиалах организации (название, КПП, ОПФ, контакты,адреса) -
17. org_brhs_ctts Контакты филиаловорганизации -
18. org_brhs_addrs Адреса филиаловорганизации -
19. org_rcs Центры регистрацииорганизации -
20. org_stms Системы, владельцемкоторых является организация -
21. org_invts Приглашения, направленныеорганизацией -
22. categories Данные присвоенных организации видовдеятельности -
  • Инструкция по интеграции модуля авторизации через ЕСИА (Ruby)
  • 1 Общее описание
  • 2 Перечень поставляемых файлов
  • 3 Основные функции
  • 4 Интеграция библиотеки
  • 5 Зависимости
  • ПРИЛОЖЕНИЕ А Описание конфигурационных параметров
  • ПРИЛОЖЕНИЕ Б Перечень запрашиваемых областей доступа