Вошёл в аккаунт — и меня снова попросили войти. Только на телефонах
Пользователей страхового сайта снова и снова просили подтвердить личность через распознавание лица, хотя они уже сделали это буквально несколько секунд назад. Вход каждый раз работал. Приложение просто продолжало спрашивать. Мне понадобилось три раунда отладки, чтобы понять причину.

На gross.uz вход выполняется через распознавание лица — без пароля. Система работала месяцами. А затем начали приходить сообщения: человек входил в аккаунт, попадал в личный кабинет, возвращался на главную страницу, нажимал на свой профиль… и его снова просили просканировать лицо. Только на телефонах. На ноутбуке такого никогда не происходило.
Очевидным предположением было, что вход не срабатывает. Но это было не так — и именно это неправильное предположение стоило мне двух раундов исправлений.
Логи показывали совершенно другое
Прежде чем что-либо менять, я посмотрел серверные логи одной проблемной сессии. Они показали странную картину: шесть успешных входов за десять минут, а между ними запросы к приватным данным пользователя проходили совершенно нормально.
Это полностью перевернуло проблему. Пользователь всё это время оставался авторизованным. Система не отклоняла его. Приложение просто продолжало показывать кнопку «Войти» — и каждый раз, когда пользователь её нажимал, он снова успешно проходил авторизацию, после чего приложение просило сделать то же самое ещё раз.
Получается, проблема вообще не была связана с входом. Приложение просто не замечало собственного пользователя.
Две причины, которые скрывали друг друга
Первая находилась в нижней панели навигации на телефонах — той самой, где находятся «Главная», «Поиск», «Меню» и «Профиль». На ноутбуке этой панели нет, поэтому проблема и проявлялась только на телефонах. Кнопка «Профиль» всегда открывала окно входа. Она никогда не проверяла, авторизован ли пользователь, потому что такая проверка просто никогда не была написана.
Вторая проблема была ещё серьёзнее и объясняла другую жалобу: после обновления страницы личного кабинета пользователя выбрасывало на главную. На странице входа было правило — «если пользователь открывает эту страницу уже авторизованным, выйти из аккаунта». Поэтому любой случайный переход на неё, даже на долю секунды, намеренно уничтожал совершенно рабочую сессию.
Одна проблема задавала вопрос, который вообще не нужно было задавать. Другая наказывала пользователя за то, что он на него ответил.
Исправление в основном заключалось в удалении
Я не стал добавлять сложную логику. Я убрал несогласованность:
- Все места, где система определяет, авторизован ли пользователь, теперь обращаются к одному общему источнику, вместо того чтобы каждое имело собственное мнение. Таких мест было четыре, и со временем их логика незаметно разошлась.
- Кнопка «Профиль» на телефонах теперь делает именно то, что всегда было написано в её комментарии: авторизован → открыть личный кабинет; не авторизован → предложить войти.
- Страница входа больше никого не разлогинивает. Переход на страницу — это не просьба завершить сессию, для этого есть кнопка «Выйти».
Что я на самом деле вынес из этой проблемы
Я дважды пропустил эту ошибку, и причины оказались достаточно неприятными, чтобы их записать.
Я искал в коде места, которые проверяют, авторизован ли пользователь. Но настоящая проблема была в месте, которое не проверяло вообще ничего, — а отсутствующий код невозможно найти, разыскивая тот самый код, которого нет.
И ещё один момент. Хотя фраза «только на телефонах» стояла в самом первом предложении сообщения о проблеме, я два раунда подряд искал специфическое для телефона поведение — и ни разу не открыл сайт на мобильной ширине, где виноватая кнопка видна сразу.
Теперь, если баг проявляется только на определённом типе устройства, мой первый шаг — не строить теорию. Я открываю приложение именно на этом устройстве. Это сэкономило бы мне два дня.