Подтверждение email пользователя через API

214
18 октября 2018, 02:00

Разрабатываю API для мобильных клиентов на Laravel. В качестве аутентификации пользователя использую Laravel Passport и выдаю им Personal Access token при логине в систему.

Не могу придумать, как реализовать систему подтверждения email (моб. телефона - не важно) при регистрации пользователя. Необходимо, чтобы подтверждение происходило с помощью четырёхзначного числа - кода.

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

Мне такой подход не очень нравится. Хотелось, чтобы запись о пользователе создавалась только после того, как он подтвердил пароль и зарегистрировался. Как в таком случае устроить логику на сервере и общение с клиентом?

Я примерно надумал следующее:

  1. Пользователь вводит свой email
  2. Мобильный клиент отправляет в API пользовательский email
  3. API создаёт запись в отдельной таблице, где есть соответствие email - код
  4. API отравляет на почту пользователя письмо с кодом
  5. Пользователь вводит код в поле подтверждения email и заполняет прочие поля формы регистрации
  6. Мобильный клиент отправляет все пользовательские данные в API вместе с кодом
  7. API в отдельной таблице (users) создаёт учётку пользователя

Насколько безопасен такой подход и какие есть минусы? Что посоветуете?

Answer 1

Пользователь вводит код в поле подтверждения email и заполняет прочие поля формы регистрации

Так не работает, обычно вы сперва все заполняете, если успешно заполнили, то остается ввести только проверочный код, для активации. Поэтому вносить все-же придется :)

Вполне нормальная практика, создать табличку для неактивированных пользователей, например users_not_activated - там хранить все что пользователь ввел, чтобы перенести из этой таблички в users, ему нужно ввести правильный код.

Когда он вводит код - ищем по таблице users_not_activated по полям email-code, если нашли, то переносим в основную, и сразу-же выполняем еще один запрос на удаление всех записей в users_not_activated с текущим email. И все ;)

Если вы боитесь мусора, то я вас успокою, индексированный поиск и при нескольких миллионах будет работать быстро, поэтому проблем нет, все в пределах погрешности. Тем более что вы можете фиксировать время создания записи в эту временную таблицу, и раз в неделю подчищать старые (неактуальные) записи.

READ ALSO
Что значит часть кода в Laravel?

Что значит часть кода в Laravel?

Мне не понятна часть кода, связанная с роутером в Laravel

164
Мобильное приложение работает на xampp но не работает на linux

Мобильное приложение работает на xampp но не работает на linux

Мобильное приложение использует backend сделанный на фраймворке Slim На xampp работает на linux не работает Мобильное приложение пишет на linux valley...

160
Дополнение при выводе

Дополнение при выводе

выводится такое дерево, как заполнят у каждого пользователя - два реферала, как дополнять недостающие нфпример словом - "пусто", например у valii78...

168
Другие вариации решения задачи?

Другие вариации решения задачи?

Имеется следующий массив, как правильно Нужно подсчитать сумму элементов count, я делаю это циклом:

162