Задать вопрос
@butingeorgiy
Web-программист

Как хранить данные до первого их использования, а потом их удалить?

Вопрос может быть и тупой, но по крайней мере мне стало интересным найти на него ответ...

Как то раз у меня была задача разработать авторизацию на php с помощью смс. То есть скрипт должен генерировать случайное четырех значное число и отправлять его по смс на номер пользователя. Казалось бы всё элементарно, но вот если пользователь обновит страничку после того, как смс-ка уже отправлена, но код ещё не введен, но скрипт потеряет значение этого кода, так как страничка была перезапущена.

Теперь встал вопрос, где и как лучше хранить этот код. Первое что приходит в голову это куки или сессия. Но это не самый безопасный способ. Также можно создать в БД отдельную табличку, куда помещать id пользователя и код, но это всё банальные способы. Может быть кто-нибудь знает как это реализовать более грамотно? Или же если другого варианта нет, то какой из трёх выше перечисленных вариантов лучше использовать?

PS: также слышал, что это можно реализовать с помощью синглтона, но так и не разобрался как это сделать
  • Вопрос задан
  • 483 просмотра
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@Dolosweb
Во первых код и номер телефона должны быть привязаны друг другу, а во вторых - обновление страницы не должна влиять на статус аутентификации. Поэтому нужно сделать весь процесс по человечески - в базе данных. Желание придумывать свой велосипед заканчивается плохо

вот структура таблицы id - phone - code - status

значение id = unix time, для указание точки отсчета времени

а вот содержание 1594313710 - +79ххххххх - 0784 - подтвержден

это значит что подтверждение на 1 номер можно производить только один раз, и это условие нельзя обойти никакими пользовательскими методами.
Ответ написан
Комментировать
alexfilus
@alexfilus
Senior backend developer
Я делал одноразовые токены на Redis.
Создаётся ключ, командой SET или SETEX (в вашем случае можно склеить номер телефона и код), значение любое, например "1".
Команда DELETE <ключ> вернёт 0, если такого ключа не было, и 1 если он был, и сразу удалит его.
Язык тут особой роли не играет, но синглтон на РНР, не поможет в классическом случае, либо может привести к утечке памяти, в случае демонизации PHP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
11 дек. 2024, в 12:53
100000 руб./за проект
11 дек. 2024, в 12:25
60000 руб./за проект
11 дек. 2024, в 12:21
2000 руб./в час