Если СМС отправляется дважды при одной попытке входа, сервис переплачивает за сообщения, а пользователь получает путаницу: какой код вводить и почему их два.
Нужно найти, отправляются ли два запроса с frontend или один запрос дважды обрабатывается на backend. Это разные причины и разные исправления.
Коротко: что сделать
- Проверить Network при нажатии кнопки отправки кода
- Проверить логи backend по телефону и времени
- Проверить retry SMS-провайдера
- Проверить блокировку повторного клика
- Проверить идемпотентность создания OTP
Основные причины
У проблемы может быть несколько уровней: интерфейс, backend, права, внешняя интеграция, кэш, очередь задач или настройки сервера. Поэтому лучше не гадать, а пройти цепочку от действия пользователя до записи в логах и базе.
- Кнопка отправки нажимается несколько раз до блокировки
- Frontend вызывает отправку и при submit, и при click
- Backend создает новый OTP при повторе одного запроса
- Очередь задач отправляет одно сообщение дважды
- SMS-провайдер повторяет запрос после таймаута
Пошаговая диагностика
Диагностику удобнее вести на одном воспроизводимом примере: один пользователь, один заказ, один запрос, один файл или одно событие. Так проще отделить реальную причину от случайных совпадений.
- Сравнить request_id двух отправок
- Проверить, одинаковый ли OTP-код пришел в двух СМС
- Проверить debounce/disabled на кнопке
- Посмотреть логи очереди и провайдера
- Проверить сценарий на медленном интернете
Как исправить проблему
Исправление должно закрывать первопричину. Если затронуты платежи, доступы, персональные данные, уведомления или рабочие заказы, сначала проверьте решение на тестовом сценарии и сохраните возможность отката.
- Блокировать кнопку после первого запроса
- Добавить идемпотентный ключ на попытку входа
- Не создавать новый код чаще заданного интервала
- Обрабатывать retry провайдера корректно
- Показывать таймер до повторной отправки
Безопасный план решения
Сначала ограничьте повторную отправку на backend, потому что frontend-защиту можно обойти. Затем улучшайте UX кнопки, таймер и сообщения пользователю.
Чего не стоит делать
- Не полагаться только на disabled-кнопку
- Не отправлять новый код при каждом обновлении страницы
- Не хранить OTP без срока жизни
- Не игнорировать стоимость SMS-дублей
Что подготовить перед исправлением
- Телефон тестового пользователя
- Время двойной отправки
- Логи запросов и провайдера
- Frontend-код формы входа
- Правила срока жизни OTP
FAQ
Почему приходят два разных кода?
Backend создает два OTP вместо повторного использования текущей попытки.
Почему приходят два одинаковых кода?
Чаще всего отправка одного OTP продублировалась на уровне очереди или провайдера.
Где лучше ставить защиту?
На backend: лимит по телефону, request_id, TTL и идемпотентность.
Когда стоит обратиться за помощью
Обратиться стоит, если вход по SMS используется часто и дубли создают расходы или блокируют пользователей.
Итог
Проверьте frontend-дубли, backend-идемпотентность, очередь и провайдера. Если нужно убрать двойную отправку SMS, пишите в Telegram @rabotator_support.