Как научить вход по лицу спрашивать: «Этот номер всё ещё ваш?»
На нашем страховом сайте пользователи входят через распознавание лица с помощью MyID — национальной системы цифровой идентификации Узбекистана. Лицо подтверждает, кто вы, но не подтверждает, как с вами связаться. Поэтому я переработал авторизацию так, чтобы каждый вход также проверял, действительно ли номер телефона, привязанный к аккаунту, всё ещё принадлежит пользователю.

На gross.uz, страховом сайте, которым пользуются десятки тысяч человек, можно войти с помощью распознавания лица — без пароля и без ручного ввода данных. Вход работает через MyID, национальную систему цифровой идентификации. Звучит идеально. Но за этим скрывалась тихая проблема: система знала, кто вы, но часто не знала, как с вами связаться.
Проблема простыми словами
Когда пользователь входит через распознавание лица, система находит его аккаунт по паспортным данным. Но номер телефона, сохранённый в этом аккаунте, вполне может быть пятилетней давности — от SIM-карты, которую человек давно выбросил.
Почему это важно? Потому что именно на этот номер приходит всё самое важное:
- коды подтверждения и сообщения об оплате,
- уведомления по страховым полисам,
- восстановление аккаунта, если что-то пойдёт не так.
Неверный номер телефона — это бомба замедленного действия. И была ещё одна деталь: один паспорт со временем может оказаться связан с несколькими аккаунтами — а старая система входа просто выбирала один из них, ничего не спрашивая.
Одно правило решило обе проблемы: единственное доказательство — введённый код
MyID действительно передаёт нам номер телефона вместе с паспортными данными. Но это всего лишь снимок без даты — никто не скажет, когда этот номер проверяли в последний раз. Поэтому я ввёл строгое правило: единственное доказательство того, что номер принадлежит вам, — код, который мы отправляем вам по SMS и который вы вводите обратно. Всё остальное — только подсказка.
Новый процесс входа следует этому правилу:
- Пользователь проходит распознавание лица, как раньше.
- Если номер был подтверждён в течение последних 6 месяцев — пользователь сразу попадает в аккаунт. Для него ничего не меняется.
- Если подтверждение старше (аккаунт считается «устаревшим»), появляется небольшое окно: введите текущий номер, получите SMS-код, введите его — готово.
- Если один паспорт связан с несколькими аккаунтами, подтверждённый номер также определяет, в какой аккаунт войдёт пользователь.
Приятный побочный эффект: база пользователей постепенно лечит сама себя. Каждый вход незаметно обновляет те данные, которые устаревают быстрее всего.
Что я сделал
Работа затронула обе части продукта:
- На сервере (PHP): после успешного распознавания лица система теперь принимает решение, а не выполняет вход вслепую. Если проверка нужна, браузеру выдаётся короткоживущий подписанный «билет» — он вообще не содержит персональных данных и умирает через 10 минут, поэтому красть его бессмысленно.
- В браузере (Nuxt/Vue): аккуратное окно подтверждения — поле для номера, кнопка «Получить код» с защитой от частых запросов и текст, который подстраивается: в одном случае он говорит, что вы подтверждаете свой номер, в другом — что номер выбирает между аккаунтами.
- Ничего не теряется: когда пользователь добавляет новый номер, старый не перезаписывается — он переносится в историю изменений, поэтому служба поддержки всегда видит полную историю аккаунта.
Чем я особенно доволен
Сдержанностью. Очевидный путь — построить новую инфраструктуру; вместо этого я переиспользовал систему SMS-кодов, которой сайт доверял уже много лет, и построил всю функцию поверх неё. Никаких новых движущихся частей, никаких новых мест для поломки — только одно новое правило, действующее везде: если мы не получали подтверждения от вашего телефона в течение шести месяцев — мы просим вас снова подтвердить, что он всё ещё ваш.