Hej, tak jak w tytule - jak powinna wyglądać rejestracja użytkownika i dwuetapowe logowanie na podstawie tych danych? Spróbuję opisać tak jak ja to widzę i byłbym wdzięczny gdyby ktoś wytknął mi błędy, wskazał lepsze rozwiązanie.
- Udostępniam endpoint /api-v1/register:
- który przyjmuje RegistrationRequestDto na który składają się:
private final String username;
private final String email;
private final String password;
private final String phone;
private final boolean is2FaEnabled;
- Już w tym miejscu waliduję poprawność tych danych za pomocą adnotacji z pakietu javax.validation.
- Ewentualne podwójne podawanie jakiś pól (np. String password, String passwordConfirmation) żeby uniknąć wysłanie requesty z błędnym hasłem/ emailem odpuszczam bo zakładam, że jeżeli ktoś rejestruje się przez Api to wie co robi, coś takiego można sprawdzić na froncie gdyby takowy miał istnieć.
- Requestów do tego endpointu nie filtruję, nie robi mi różnicy czy np klient który próbuje się rejestrować ma już token świadczący o tym, że jest użytkownikiem itp.
- Potem requesta wrzucam w jakiś serwis który sprawdza czy taki username/email/phoneNumber nie istnieją już w bazie, zapisuje Usera w bazie z jakąś flagą, że nie jest jeszcze aktywny. Generuje jednorazowy token który także zapisuje do bazy i paruje z encją usera. Asynchronicznie wysyłam SMSa z tym tokenem pod zapisany w bazie numer.
- Jako odpowiedź gdyby się powiodło zwracam informacje o zapisanym userze (email, czas o której został zapisany do bazy itd itd) w body + status, w razie niepowodzenia treść wyjątku w body + status.
- Teraz w kwestii usera jest potwierdzenie rejestracji za pomocą nasępnego endpointu.
- Udostępniam endpoint /api-v1/register?token={token}
- Znowu nie interesuje mnie filtrowanie, bez różnicy kto próbuje wysłać request.
- Pobieram ze ścieżki token, przekazuje do serwisu, wyszukuje go w bazie i sprawdzam czy taki token istnieje - jeżeli tak to zmieniam userowi status na aktywny, status tokena na aktywny.
- Jako odpowiedź zwracam sam status w razie powodzenia lub status + treść wyjątku w body w razie niepowodzenia.
- To tyle jeżeli chodzi o rejestracje użytkownika - mam w bazie użytkownika z potwierdzonym numerem telefonu i informacją czy logowanie ma potwierdzać kodem z SMS, jeżeli chodzi o logowanie to zrobię je dokładnie jak tutaj: https://stackoverflow.com/questions/41814194/how-to-design-a-stateless-rest-login-with-2-factor-authentication-2fa tylko sprawdzę przy próbie logowania user ma is2FaEnabled i sposób logowania 2Fa (to na potrzeby gdyby miały dojść nowe sposoby na drugi etap.
Aha, i pytanie - gdybym miał więcej sposobów na potwierdzenie logowania poza kodem SMS to jak powinien wyglądać mój RegistrationRequestDto?