Мета
Цей WS призначений для перевірки наданого номера телефону в рамках процесу реєстрації, створення та надсилання OTP у контексті хешованого вмісту, який містить номер телефону, який потрібно перевірити.
Ключові положення
Даний метод використовується тільки TRUSTED_PIS, PIS та CABINET типами клієнтів.
Тільки один код верифікації може існувати для номеру телефону.
Даний може використовуватись тільки з JWT з фіксованим набором
aud
, відповідний кожному типу клієнта.
Специфікація
Перевірити JWT
Перевірити, що хедер авторизації містить валідний JWT
в разі помилки - повернути 401 ('JWT is invalid')
Перевірити, що JWT не закінчив строк дії (
exp
> now())в разі помилки - повернути 401 ('JWT expired')
Перевірити, що JWT з правильним
aud
:cabinet-registration
,pis-registration
,trusted-client
.в разі помилки - повернути 401 ('JWT is not permitted for this action')
Перевірити запит
Перевірити, що поля
factor
таtype
вказані в запиті та не пустів разі помилки - повернути 422 ('can't be blank')
Перевірити, що значення поля
factor
відповідає номеру телефону з врахуванням regexpв разі помилки - повернути 422 ('invalid phone')
Перевірити, що значення поля
type
відповідає SMSв разі помилки - повернути 422 ('is invalid')
Перевірити, що поле
content_hash
присутній в запиті і не є пустимaud
=pis-registration
,trusted-client
в разі помилки - повернути 422 ('content hash is required for pis and trusted_pis clients')
Перевірити, що виклик OTP не перевищує ліміт для номеру телефону (на основі конфігураційного параметру INIT_VERIFICATION_LIMIT)
в разі помилки - повернути 429 ('Too many attemts')
Сервісна логіка
Якщо
aud
=pis-registration
,trusted-client
, отримати значення з конфігураційного параметру PIS_VALIDATE_ALL_PHONES. Якщоaud
=cabinet-registration
, перейти на крок to p.2.якщо встановлено true - перейти на крок to p.2.
якщо встановлено false - перевірити існування номеру телефону в базі даних verification, таблиця verified_phones:
якщо існує номер телефону - пропустити верифікацію номеру телефону, відобразити відповідь у відповідності до специфікації з результатом = 'Verified'.
якщо номер телефону не існує - перейти на крок to p.2.
Згенеруйте код підтвердження за допомогою базової випадкової функції (за замовчуванням) або алгоритму на основі часу:
Формат верифікаційного коду - тільки цифри (regexp:
^[1-9][0-9]*$
)Довжина верифікаційного коду - конфігураційний параметр OTP_CODE_LENGTH (за-замовчуванням = 4)
Строк дії верифікаційного коду - конфігураційний параметр CODE_EXPIRATION_PERIOD_MINUTES (за-замовчуванням = 15 min)
Шукати активні верифікаційні коди для номера телефону в верифікаційній базі даних, верифікаційній таблиці, якщо знайдено - скасувати їх, встановити:
status = ‘canceled’
is_active = false
Направити SMS з OTP на номер телефону з запиту, використовуючи SMS провайдера.
Збережіть згенерований код перевірки в базу даних перевірок, таблицю перевірок, установіть:
id = автогенерований uuid
phone_number =
factor
check_digit = цифра контрольної суми для коду підтвердження
status = ‘new’
code = код верифікації
code_expired_at = строк дії верифікаційного коду
is_active = true
attempt_count = 0
inserted_at = now()
content_hash =
content_hash
Сформувати відповідь відповідно до специфікації з результатом = ‘OTP sent’ та urgent.next_step = ‘REQUEST_OTP'.