Poprzedni wpis poświęciłam kwestii wysyłania maili przez aplikację napisaną w Javie.
Kontynuując, teraz chcę upewnić się, że świeżo zarejestrowany użytkownik to człowiek (a nie bot) i że podał poprawny adres email. Poniżej opisuję kroki prowadzącego do tego celu.
Spis treści
Krok 1: nieaktywny użytkownik z wygenerowanym kodem
Po wypełnieniu formularza rejestracyjnego obiekt reprezentujący użytkownika jest zapisywany w bazie danych jako nieaktywny. Razem z nim zapisywany jest losowo wygenerowany kod do aktywacji konta. Na tym etapie użytkownik nie może się logować, nie zna też przypisanego mu kodu.
1 2 3 4 5 6 7 8 |
... @Document public class User { ... private boolean confirmationStatus; private String confirmationId; ... } |
1 2 3 |
private String createConfirmationID() { return java.util.UUID.randomUUID().toString(); } |
Krok 2: email z linkiem aktywacyjnym
Aplikacja wysyła na adres podany przez użytkownika wiadomość zawierającą link aktywacyjny. Kod wygenerowany losowo w poprzednim kroku jest doklejony do adresu jako parametr URL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
... @Controller public class UserController extends WebMvcConfigurerAdapter { ... @RequestMapping(value = "/signup", method = RequestMethod.POST) public String checkPersonInfo(@Valid User user, BindingResult bindingResult, Model model) { ... user.setConfirmationId(createConfirmationID()); emailService.send(user.getEmail(), "Szafbook Account Confirmation Link", "http://szafbook.pl/confirm?id=" + user.getConfirmationId()); userRepository.save(user); model.addAttribute("message", "Please, check your mailbox for the email confirmation link. "); return "message"; } ... } |
Krok 3: obsługa linku aktywacyjnego
Wejście pod adres podany w mailu powoduje uruchomienie servletu weryfikacyjnego. Aplikacja szuka w bazie danych obiektu użytkownika, któremu przypisano kod podany jako parametr. Jeśli taki użytkownik istnieje, jest oznaczany jako aktywny. Od tej chwili może się już logować, ponieważ potwierdzono (czy raczej zwiększono prawdopodobieństwo), że to rzeczywista osoba.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
... @Controller public class ConfirmationController { @Autowired private UserRepository userRepository; @RequestMapping("/confirm") public String greeting(@RequestParam(value="id", required=true) String confirmationId, Model model) { User user = userRepository.getUserByConfirmationId(confirmationId); String message = "Invalid confirmation id. Contact us or try again."; if(user!=null){ if(!user.isConfirmationStatus()){ user.setConfirmationStatus(true); user.setConfirmationId(null); userRepository.save(user); } message = user.getUserName() + ", your account has been verified. You may now log in. "; } model.addAttribute("message", message); return "message"; } } |
Krok 4: usunięcie nieaktywnych kont
Należałoby usunąć zbyt długo przechowywane nieaktywne konta. Ale jeszcze się za to nie zabrałam 🙂
Ciekawostka: wyszukanie użytkownika w bazie
Oto ilość pracy, którą włożyłam w wyszukanie użytkownika w bazie danych MongoDB po wartości confirmationId
:
1 2 3 4 5 6 |
... public interface UserRepository extends CrudRepository<User, BigInteger>{ public User getUserByConfirmationId(String confirmationId); } |
Resztę robi za mnie Spring Data, parsując nazwę metody!
Więcej informacji na ten temat można znaleźć tutaj.
PS.
To ostatni techniczny wpis w ramach konkursu Daj się poznać 2016. Jutro postaram się napisać krótkie podsumowanie. O ile wieczorem na spotkaniu młodych mam nie poleje się za dużo wina.
Jedna myśl nt. „Aktywacja konta poprzez email”