ЕСОЗ - публічна документація
RC_warranty_UA_PIS. Confidant patient sign-up validation
Мета
Цей WS призначений для перевірки підписаного вмісту як частини процесу реєстрації пацієнта довіреною особою, вилучення даних пацієнта, якщо вони дійсні, і створення токену сессії для виконання подальших кроків.
Ключові положення
Даний метод має використовуватись тільки фрон-енд частиною Auth
Даний метод вимагає довірену особу, яка вже автентифікована
Перевірити підписни контент так як і jwt та дані пацієнта в ньому
Згенерувати токен сессії (jwt) для підвтердження запиту на реєстрацію
Специфікація
Авторизація
Превірити валідність токену доступу
в разі помилки - повернути 401 (“Invalid access token”)
Перевірити, що токен дійсний
в разі помилки - повернути 401 (“Invalid access token”)
Перевірити скоупи користувача на можливість виконання даної дії (scope =
confidant_person:sign_up
)повернути 403 (“Your scope does not allow to access this resource. Missing allowances: confidant_person:sign_up”) в разі невалідних скоупів
Перевірити підписаний контент
Перевірити, що
signed_content
таsigned_content_encoding
вказанів разі помилки - повернути 422 ('required property signed_content was not present' or ‘required property signed_content_encoding was not present')
Перевірити, що підписний контент це валідний base64
в разі помилки - повернути 422 ('Invalid signed content')
Перевірити, що підписаний контекнт закодовано в значенні 'base64'
в разі помилки - повернути 422 ('is invalid')
Перевірити, що цифровий підпис валідний
в разі помилки - повернути 400
Перевірити, що підписант запиту пов'язаний з автентифікованою персоною. Отримати персону з MPI використовуючи
x-person-id
та впевневшись, щоperson.tax_id
абоperson.documents
відповідають підписанту по drfo (з цифрового підпису)яккщо значення drfo відповідає tax_id з врахуванням regexp (
^[0-9]{10}$
) - порівняти з person.tax_idякщо значення drfo відповідає номеру national_id з врахуванням regexp (
^[0-9]{9}$
) - порівняти з документом з типом 'NATIONAL_ID'якщо значення drfo містить хоча б одну літеру, виконати зворотну транслітерацію поля використовуючи існуючий алгоритм (описаний тут), тоді перевірити, що значення рівне номеру паспорту з врахуванням regexp (
^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$
) - порівняти з документом типу 'PASSPORT'в разі помилки - повернути 401 ('Unable to authenticate signer')
Перевірити запит на реєстрацію персони
Запит на реєстрацію персони сам по собі має містити дані пацієнта (персони) та деякі обмеження як частину авторизації PIS
Перевірити дані персони у відповідності https://e-health-ua.atlassian.net/wiki/spaces/PCAB/pages/17599399482/warranty_Rules+to+validate+patient+data#Person-with-confidant
Перевірити, що значення поля
patient_signed
рівне ‘true’в разі помилки - повернути 422 ('value is not allowed in enum')
Перевірити значення поля
process_disclosure_data_consent
, що воно рівне ‘true’в разі помилки - повернути 422 ('value is not allowed in enum')
Сервісна логіка
Згенерувати JWT
Отримати значення JWT TTL з параметру
JWT_LOGIN_TTL
(в хвилинах).Декодувати поле
signed_content
та розрахувати хеш MD5.Згенерувати JWT з наступними параметрами:
alg =
HS512
aud =
pis-registration
content_hash = хеш MD5 декодований зі значення поля
signed_content
exp = iat +
JWT_LOGIN_TTL
iat = now()
iss =
EHealth
jti = згенерований uuid з JWT
nbf = now() - 1 секунда
sub = content_hash
typ =
access
Відобразити дані персони
Відобразити дані персони (пацієнта) у відповідності до специфікації
ЕСОЗ - публічна документація