Ostatnio jeden z użytkowników Mikrusa nie mógł zalogować się do panelu przez funkcję "zaloguj przez Google". System twierdził, że taki adres mailowy nie istnieje w bazie 🤔
Spoiler: istniał. Problem był gdzie indziej. 🧵 ↓
Użytkownik kupił serwer VPS, podając adres w stylu jankowalski@gmail.com.
Następnego dnia chciał się zalogować przez OAuth Google i dostał błąd "nie znaleziono konta".
Dlaczego? Bo Google zwracało adres jan.kowalski@gmail.com (z kropkami).
System potraktował jan.kowalski@gmail.com i jankowalski@gmail.com jako dwa różne adresy mailowe, a w rzeczywistości to dokładnie ten sam adres.
Gmail po prostu ignoruje kropki w loginie i co ważne, nie tylko kropki.
Kropki, to pierwszy problem. Drugi jest jeszcze bardziej podstępny.
Gmail ma drugą domenę: googlemail.com
jankowalski@gmail.com = jankowalski@googlemail.com
To ten sam adres, ale większość systemów traktuje to jako dwa różne konta, bo w końcu domena jest inna.
Trzeci problem to aliasy dynamiczne.
Możesz dopisać po loginie plus i dowolne słowo:
jankowalski+mikrus@gmail.com
jankowalski+test@gmail.com
jankowalski+spam@gmail.com
Wszystkie trafiają do tej samej skrzynki, ale w systemach to są oddzielne konta.
Dlaczego to w ogóle problem?
Na Mikrusie użytkownicy zaczęli kupować serwery przez własne linki polecające. System antyfraudowy nie łapał duplikatów, bo jankowalski@gmail.com i jan.kowalski@gmail.com to dla niego dwie różne osoby.
Spamerzy lubią to ;)
Jeśli limitujesz liczbę kont/zakupów na użytkownika (np. jeden trial na osobę), to bez normalizacji maili z Gmaila masz dziurę w zabezpieczeniach.
Jeden adres Gmail może utworzyć teoretycznie nieskończoną liczbę "różnych" kont w Twoim systemie.
Rozwiązanie?
Przed sprawdzeniem, czy użytkownik istnieje w bazie, normalizuję adres:
1. Usuwam wszystkie kropki z loginu
2. Usuwam wszystko po znaku plusa
3. Zamieniam googlemail.com na gmail.com
Dopiero wtedy szukam duplikatów.
Ważne: w bazie zapisuję adres dokładnie tak, jak podał go użytkownik.
Jeśli ktoś chce otrzymywać maile na jan.kowalski+mikrus@gmail.com, to tak właśnie będzie je dostawał.
Normalizacja jest jedynie do celów weryfikacji czy konto już istnieje.
Jeśli tworzysz jakiś SaaS i nie masz tego ogarniętego, to sprawdź swoją bazę.
Pewnie masz tam duplikaty, które liczysz jako unikalnych użytkowników, a to ten sam gość, który po prostu użył kropki w innym miejscu... albo wielu kropek (jan.ko.wa.lsk.i@gmail.com).
Możę to być także spamer, który obchodzi Twoje limity.