Мета
Цей WS призначений для реєстрації пацієнта в системі на основі даних, отриманих з Інформаційної системи пацієнтів
Ключові положення
Цей метод має використовуватися лише інтерфейсом Auth
Перевіряє маркер сеансу (jwt), який було отримано в результаті підписаного вмісту, а також перевірки даних пацієнта по PIS. Patient sign-up validation та підписного контенту, пропустити повторну перевірку даних пацієнта.
Створити в системі як користувача, так і пацієнта
Генерує токен доступу для подальших дій
Специфікація
Перевірити підписаний контент
Перевірити, що вказани
signed_content
таsigned_content_encoding
в разі помилки - повернути 422 ('required property signed_content was not present' or ‘required property signed_content_encoding was not present')
Перевірити, що поле
signed_content
це валідна строка в форматі base64в разі помилки - повернути 422 ('Invalid signed content')
Перевірити, що поле
signed_content_encoding
рівне 'base64'в разі помилки - повернути 422 ('value is not allowed in enum')
Перевірити, що цифровий підпис валідний
в разі помилки - повернути 401 з текстом помилки валідації цифрового підпису
Перевірити, що значення drfo з цифрового підпису належить персоні в запиті на реєстрацію, на основі формату поля:
якщо значення рівне tax_id враховуючи regexp (
^[0-9]{10}$
), поле містить tax_id, використати полеtax_id
з запиту на реєстрацію для порвіняння;якщо значення рівне номеру national_id враховуючи regexp (
^[0-9]{9}$
), поле містить номер national_id, використовувати полеdocuments.number
зdocuments.type = 'NATIONAL_ID'
для порівняння;якщо значення містить хоча б одну літеру, виконати зворотну транслітерацію поля, використовуючи існуючий алгоритм (описано here), тоді перевірити, що значення рівне номеру паспорта враховуючи regexp (
^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$
), якщо рівний, поле містить номер паспорту, використати полеdocuments.number
зdocuments.type = 'PASSPORT'
для порівняння;в разі помилки - повернути 409 ('Registration person and person that sign should be the same')
Перевірити, що last_name з цифрового підпису належить персоні з запиту на реєстрацію, поле last_name
в разі помилки - повернути 422 ('Input name doesn't match name from digital signature')
Перевірити, що first_name з запиту на реєстрацію вказано в рядку given_nameз цифрового підпису
в разі помилки - повернути 422 ('Input name doesn't match name from digital signature')
Перевірити JWT
перевірити підпис JWT
перевірити емітента (
iss
= Ehealth)перевірити aud (
aud
= pis-registration)перевірити строк дії (
exp
в майбутньому)в разі помилки - повернути 401 ('JWT is invalid.')
перевірити, що
content_hash
рівний значенню MD5 хеш закодований в поліsigned_content
в разі будь-якої помилки - повернути 401 ('Unauthorized.')
Перевірити otp
Отримати значення з конфігураційного параметру PIS_VALIDATE_ALL_PHONES
якщо встановлено false - перевірити, що номер телефону з поля authentication_methods має бути перевірений (номер не вказано в таблиці
verified_phones
в базі даних верифікації), якщо телефон має бути верифікований, перевірити, що значення з поля$.otp
в запиті рівний коду верифікації, що було направлено на телефон та хеш md5 hash закодований$.signed_content
рівний значенню, що зберігається (через таблицюverifications
в базі даних по верифікації)якщо встановлене рівним true - перевірити, що значення з поля
$.otp
в запиті рівне коду верифікації, що було направлено на телефон та хеш md5 закодований$.signed_content
рівне значенню, що зберігається (по таблиціverifications
в базі даних верифікації)в разі помилки - повернути 422 ('Invalid verification code')
Сервісна логіка
Оновити otp
Якщо була викликана перевірка otp, оновіть запис для otp і номера телефону в таблиці
verifications
у базі данихverification
, установіть:status = ‘verified’
Якщо було викликано перевірку otp, перевірте наявність запису для номера телефону в таблиці
verified_phones
бази данихverification
, якщо не існує - створіть запис, установіть:id = автогенерований uuid
phone_number = номер верифікованого номеру телефону з запиту
updated_at = now()
Знайти користувача
Встановити значення drfo з цифрового підпису.
Здійснити пошук існуючого користувача в базі даних mithril, таблиця
users
, де tax_id = drfo з цифрового підпису та is_active = true.якщо користувача знайдено - перевірити, що він не заблокований (is_blocked <> true)
якщо заблокований - повернути 401 ('User is blocked.').
якщо не заблокований - зберегти
user_id
та перейти до p.3.
якщо користувача не було знайдено - перейти до https://e-health-ua.atlassian.net/wiki/spaces/PCAB/pages/17415143630/PIS.+Patient+sign-up+registration#Search-or-create-person
Здійснити пошук персони в базі даних mpi, таблиця
persons
, з id = person_id зі знайденого корис тувача, status = active та is_active = trueв разі, якщо персону не було знайдено - повернути 401 ('Person not found.')
в разі, якщо персону знайдено - перевірити, що його вік більше ніж значення глобального параметру no_self_auth_age
в разі помилки - повернути 401 ('Incorrect person age for such an action.')
в разі, якщо вік персони коректний - зберегти
user_id
та перейти до https://e-health-ua.atlassian.net/wiki/spaces/PCAB/pages/17415143630/PIS.+Patient+sign-up+registration#Generate-authorization-token
Знайти або створити персону
Здійснити пошук активної персони в базі даних mpi з даними по персоні з запиту на реєстрацію у відповідності до існуючого процесу, описаного тут 1f1fa-1f1e6Create/Update person request | Search person
Розразувати скор згідно результатів порівнянн між знайденою активною персоною та персоною з запиту на реєстрацію, використовуючи процес дедублікації, описаний тут Deduplication process
Порівняти отриманий скор з конфіг параметром PIS_ONLINE_DEDUPLICATION_MATCH_SCORE, встановленим на рівні ‘0.95’:якщо одна активна персона з порівняльним скором > PIS_ONLINE_DEDUPLICATION_MATCH_SCORE була знайдена - перевірити, що її вік більше за значення глобального параметру no_self_auth_age
в разі помилки - повернути 401 ('Incorrect person age for such an action.')
в разі, якщо вік персони коректний - зберегти
person_id
та перейти до p.2.
якщо більше одної персони з порівняльним скором > PIS_ONLINE_DEDUPLICATION_MATCH_SCORE було знайдено - повернути 401 ('It is impossible to uniquely identify the person.')
якщо відсутністі активні персони з порівняльним скором > PIS_ONLINE_DEDUPLICATION_MATCH_SCORE було знайдено - перейти до p.3.
Здійснити пошук активного користувача в базі даних mithril, таблиця
users
, з person_id = person_id знайденої персони та is_active = true.якщо користувача було знайдено - перевірити, що він не заблокований (is_blocked <> true)
в разі якщо заблокований - повернути 401 ('User is blocked.').
в разі, якщо не заблокований - оновити користувача, встановити tax_id = drfo з цифрового підпису, встановити settings.trusted_source = true, зберегти
user_id
та перейти до https://e-health-ua.atlassian.net/wiki/spaces/PCAB/pages/17415143630/PIS.+Patient+sign-up+registration#Generate-authorization-token
якщо користувача не було знайдено - перейти до https://e-health-ua.atlassian.net/wiki/spaces/PCAB/pages/17415143630/PIS.+Patient+sign-up+registration#Create-user
Створити нову персону в базу даних mpi, встановит значення в наступних таблицях на основі персони з запиту на реєстрацію:
persons
таблицяperson_phones
таблицяperson_addresses
таблицяperson_documents
таблицяperson_authentication_methods
таблиця
Зберегти підписаний контент до медіа-сховища
Відправити персону на перевірку - створити запит в таблиці
person_verifications
дляperson_id
, встановити значення для кожного стріма з верифікації:Ручна верифікація NHS
якщо
$.person.documents
містить документи з типом = 'PERMANENT_RESIDENCE_PERMIT' або$.person.unzr
не пусто та перші 8 цифр$.person.unzr
!=$.person.birth_date
або$.person.documents
містить документ з типом з конфігураційного параметру PIS_PERSON_LEGAL_CAPACITY_DOCUMENT_TYPES
- скан-копії документів персони мають бути завантажені до сховища даних після реєстрації персони по Initialize Person documents uploadвстановити nhs_verification_status = NOT_VERIFIED
встановити nhs_verification_reason = DOCUMENTS_TRIGGERED
в іншому випадку - скан-копії документів персони не потрібні, встановити статус верифікації у відповідності до логіки, описаної тут: IL.Sign person request (modified)_EN | Manual NHS verification
верифікація з реєстром DRFO - у відповідності до логіки, описаної тут: IL.Sign person request (modified)_EN | DRFO registry verification
верифікація з реєстром актів смерті DRACS -у відповідності до логіки, описаної тут: IL.Sign person request (modified)_EN | DRACS death acts registry verification
Розрахувати кумулятивний статус верифікації у відповідності до логіки, описаної тут: IL.Sign person request (modified)_EN | Calculate cumulative verification status
Створити користувача
Створорити користувача для активного пацієнта в базі даних mithril, таблиця
users
, встановити:id = автогенерований uuid
settings = ‘{“trusted_source”: true}’
priv_settings = ‘{"login_hstr": [], "otp_error_counter": 0}’
inserted_at = now()
updated_at = now()
password_set_at = now()
tax_id = значення
drfo
з цифрового підписуperson_id =
person_id
персони, що була знайдена на кроці ‘Search or create patient’.
Створити глобальну роль для створеного користувача в базі даних mithril, таблиця
global_user_roles
, встановити:id = автогенерований uuid
user_id = user_id користувача, створеного на кроці p.4
role_id = id ролі з назвою ‘PATIENT’
inserted_at = now()
updated_at = now()
Згенерувати авторизаційний токен
Згенерувати auth_token зі скоупом
app:authorize
дляuser_id
таclient_id of Auth UI (from env)
Зберегти токен до бази даних mithil, таблиця
tokens
, встановити:id = uuid токену
name = назва токену (‘access_token’)
value = захешований токен
expires_at = дата та час, коли закінчується строк дії токену в форматі unix-time
details = додаткові деталі по токену (scope, client_id, grant_type), де
scope = ‘app:authorize’
client_id = id клієнта для Auth UI
grant_type = ‘pis_auth’
user_id = id користувача
inserted_at = now()
updated_at = now()
Відобразити відповідь у відповідності до специфікації.