Mam aplikację w której rejestracja użytkowników wygląda mniej wiecej w uproszczeniu tak:
- Użytkownik zakłada konto.
- Konto jest rejestrowane w bazie danych a flaga weryfikacji konta jest ustawiana na false (wiem wtedy że użytkownik nie może się zalogować na konto).
- Podczas rejestracji generowany jest także token (UUID) który zapisywany jest w bazie razem z ID użytkownika + data wygaśnięcia tokenu.
- Token w URL jest wysyłany mailem do użytkownika. Po kliknięciu przez usera sprawdzam czy token nie wygasł i jeśli nie to aktywuje konto.
- Token zostaje usunięty z DB.
Generalnie to działa ale mam z tym kilka problemów:
- Jeśli użytkownik się zarejestruje i nigdy nie aktywuje konta to tak naprawdę można takie konto z db usunąć bo np. ktoś się pomylił podając zły email. Mogę to teraz zrobić ale muszę przeszukiwać całą tabelę z userami żeby znaleźć takie konta.
- Użytkownik który nie aktywował konta ma flagę aktywności na false. Jeśli będę chciał kolejne funkcjonalnosci wprowadzić typu ważność hasła wygasła itp to musiałbym kolejne flagi wprowadzić. Kiedyś słuchałem jakiegoś talku Jakuba Nabrdalika który mówił że zamiast robić takie flagi lepiej jest dodać dodatkową tabelę tymczasową (o czym napiszę niżej).
- Jeśli konto jest nieaktywne bo nie zostało jeszcze zweryfikowane to nie chcę go wyświetlać innym użytkownikom w liście użytkowników przez co moja logika w aplikacji czasami jest zawila bo muszę sprawdzać dodatkowe przypadki żeby wiedzieć czy konto jest w pełni aktywne.
Poza tym mam kilka mniejszych problemów i dlatego pomyślałem sobie żeby to przebudować ale chciałbym najpierw zapytać osoby bardziej doświadczone o radę. Po modyfikacji proces rejestracji wyglądałby tak:
- Użytkownik się rejestruje.
- Informacje o jego koncie trafiają do tabeli pomocniczej, np. Draft_User w której trzymam jeszcze niezweryfikowanych użytkowników.
- Tworzę token i wysylam go mailem.
- Jeśli kliknie w link i token nadal nie wygasł to konto jest w pełni rejestrowane, tzn informacje o koncie z np. Draft_User są przenoszone do tabeli w pełni funkcjonujących użytkowników.
Plusy:
- Logika w mojej aplikacji znacznie bardziej się uprości w niektórych miejscach (no jedynie przy rejestracji będę musiał sprawdzić unikatowość mejla w dwóch tabelach + po aktywności przenieść dane z jednej tabeli do drugiej).
- Nie potrzebuję flagi żeby wiedzieć czy konto zostało zweryfikowane.
- Jeśli będę chciał usuwać niezweryfikowane konta np. po tygodniu to będę miał znacznie mniejszą pulę rekordów do przejrzenia.
Co myślicie? Jak realizujecie w swoich projektach proces o którym piszę?