Logowanie, rejestracja i zabezpieczanie aplikacji

Niestety zawaliłem coś po raz kolejny, w piątek nie było wpisu na tematy związane z IT. Mam nadzieję, że za to nie wylecę z konkursu Szeroki uśmiech. Ten zaległy wpis zostanie nadrobiony w późniejszym czasie. Dziś jest poniedziałek, a więc będzie o tym, co zmieniło się w projekcie przez ostatni tydzień. Jeśli ktoś nie pamięta o czym jest mój projekt (a jest taka możliwość, ponieważ projektów w konkursie jest masa Uśmiech) to zapraszam do zerknięcia na pierwszy wpis w którym wszystko dokładnie wyjaśniam. Koniec wstępu, przejdźmy do części właściwej:

 

Strona logowania i rejestracji

Strona przedstawia się następująco:

screen

Jak widać, nie jest to dzieło artystyczne, ale wszystkie bajery są (no może poza przypominaniem hasła Szeroki uśmiech). Na chwilę obecną jest to jedyny widok w aplikacji. Zaimplementowane są jedynie alerty informujące o powodzeniu/niepowodzeniu akcji, i nie ma żadnych przekierować na inne strony.

Kod obsługujący akcje w Angular2 jest następujący:

screen2

Jak widać, to również nie jest dzieło artystyczne… a jest tak dlatego, że Angular2 jest w tym momencie nową technologią której jeszcze nie znam, i najpierw chciałem napisać coś co po prostu działa. Warto to teraz zrefaktoryzować poprzez np. podzielenie tego na dwa moduły, jeden do rejestracji, a drugi o logowania, i  nie trzeba będzie już tak kombinować z nazwami zmiennych aby się nie pokrywały.

 

Co jeszcze jest do zrobienia?

Koniecznie trzeba zrobić sensowną implementację tokenów uwierzytelniających. W tym momencie włączone jest domyślne uwierzytelnienie http basic oferowane przez framework Spring Security. Opiera się to na przesyłaniu zakodowanego w Base64 stringa składającego się z nazwy użytkownika i hasła w każdym requeście. Jest to bardzo niebezpieczne, ponieważ wystarczy podsłuchać jakikolwiek request, aby zdobyć dane logowania. Dodatkowo transmisja nie jest w tym momencie w żaden sposób szyfrowana, a więc ta aplikacja nie ma póki co nic wspólnego z bezpieczeństwem.

Co więc zrobić?

Aby maksymalnie utrudnić takie sztuczki, należy zrobić kilka rzeczy. Po pierwsze: należy szyfrować transmisję między klientem a serwerem jesli tylko jest taka możliwość. Po drugie: należy zaimplementować sensowny mechanizm generowania i weryfikacji tokenów. Taki token należy wygenerować w oparciu o informacje które są znane nam, ale nie są znane osobie, która ma złe zamiary. Można użyć np. dokładnej daty ostatniego logowania (łącznie z godziną i minutą, a nawet sekundą), daty rejestracji (o ile nie wyświetlamy jej gdzieś w aplikacji itp.). Muszą być to informacje możliwe do zweryfikowania. Np. gdy w tokenie znajduje się data ostatniego logowania, to musimy ją gdzieś zapisać np. w bazie danych. Jeśli nie będziemy zapisywać tej informacji, to nie będzie można zweryfikować, czy token jest prawidłowy. Wszystkie informacje w nim zawarte, muszą być dostępne w czasie weryfikacji. Po trzecie: warto zaimplementować mechanizm wygadania tokenów. Trzeba ustalić czas w którym można się uwierzytelnić tokenem od momentu jego wygenerowania. Może to być np. 15 minut. Po tym czasie, nie można już użyć tego tokenu, i potrzebujemy wygenerować nowy.

Warto zauważyć, że w takim wypadku, przechwycenie sesji nadal jest możliwe, bo używamy tokenów. Musimy je mieć, aby wiedzieć kto wysyła dany request do serwera. Jednakże, jeśli zadbamy o bezpieczeństwo to:

1. Ciężko będzie o zdobycie tokena, jeśli połączenie będzie szyfrowane.

2. W przypadku, gdy to się jednak uda, atakujący nie posiada danych logowania. A więc może działać tylko w ramach jednej sesji

3. Atakujący ma dostęp tylko przez krótki czas. Gdy minie ważność przechwyconego tokena, dostępu już nie ma, a bez danych logowania nie można zdobyć nowego

 

Jak odpalić aplikację?

W projecie używany jest Maven, a więc uruchomienie nie jest trudne. Wymagana jest tylko zainstalowana Java, zainstalowany Maven oraz baza danych Postgresql (konfiguracja bazy danych odbywa się w pliku application.properties w folderze resources). Po pobraniu kodu z repozytorium wydajemy komendę: “mvn spring-boot:run”. Ta komenda zapoczątkuje całą serię czynności. Najpierw pobrany zostanie nodeJS, oraz npm (Node Package Manager), po czym npm pobierze i zainstaluje wszystkie biblioteki wymagane kompilacji frontendu aplikacji. Następnie frontend zostanie skompilowany (polega to m.in na translacji plików TypeScript na pliki JavaScript, bo tylko takie obsłuży przeglądarka), oraz łączeniu plików html i css. Następnie Maven pobierze biblioteki konieczne do skompilowania części serwerowej napisanie w Javie. Potem nastąpi kompilacja kodu źródłowego w Javie, a w końcu uruchomienie części serwerowej aplikacji. Za pierwszym razem wszystko może potrwać kilka minut. Po załadowaniu aplikacji, będzie ona dostępna na porcie 8080.

Tak, wiem że to wszystko muszę napisać jeszcze raz, po angielsku, mniej szczegółowo, i umieścić w pliku readme.md na githubie, naprawię to rażące zaniedbanie Uśmiech

A tym czasem pora już kończyć kolejny wpis na blogu. Dziękuję tym, którzy poświęcili czas na jego przeczytanie.

Reklamy

2 thoughts on “Logowanie, rejestracja i zabezpieczanie aplikacji

  1. Hej, chciałam właśnie się dowiedzieć, jak skompilować JS z Javą, więc super, ze napisałeś, że to Maven kompiluje i wygląda na to, ze to nie powinno być trudne. Mam jeszcze pytanie – jakiego programu używasz? Miałam styczność jedynie z IntelliJ IDEA, ale wtedy pisałam jedynie sam serwer (restowe api), frontendu nie pisałam.

    Lubię to

  2. Tak, używam Intellij IDEA do wszystkiego, pisanie frontendu też wspomaga. Do Mavena jest plugin który potrafi odpalić kompilację projektu frontendowego, a nawet pobrać NodeJS i npm. Możesz sobie zobaczyć plik pom.xml aby zobaczyć jak to jest poustawiane, oraz odpalić projekt aby zobaczyć jak to się w praktyce odbywa 🙂

    Lubię to

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s