Najważniejsze zagadnienia, które musisz znać
5 godz. 53 min · JavaScript · Full-stack i Programowanie
Adam GospodarczykPrzesyłanie oraz transformacja danych to jeden z najważniejszych elementów działania każdej aplikacji. Dobre zrozumienie tego w jaki sposób odbywa się ten proces, daje równocześnie lepsze zrozumienie całej struktury oraz podejmowania decyzji projektowych. W tym kursie znajdziesz lekcje, które pozwolą Ci uporządkować wiedzę na temat protokołu HTTP oraz formatów wymiany danych.
REST oraz GraphQL to nadal nieodłączone zagadnienia tematu wymiany informacji w kontekście aplikacji webowych. Pomimo tego, że ich koncepcje zwykle są bardzo dobrze opisane w różnych źródłach, tak ich wykorzystanie "na produkcji" potrafi sprawić problemy. W szczególności gdy weźmiemy pod uwagę, wyjątki oraz fakt, że nie każda aplikacja będzie wymagać implementacji REST czy GraphQL w 100%. W tym kursie znajdziesz wiele praktycznych wskazówek związanych z pracą z REST API oraz wprowadzenie do pracy z GraphQL.
Niektóre błędy w aplikacji są bardzo pożądane, w szczególności gdy jasno informują użytkownika o tym, co się wydarzyło oraz o tym, co może z tym zrobić. Pomimo tego, że w wielu przypadkach opracowanie komunikatów leży w rękach osoby odpowiedzialnej za copywriting (i/lub ux writing), tak sama implementacja tych komunikatów odbywa się po stronie kodu. Nie rzadko okazuje się, że poprawna i skuteczna walidacja danych oraz obsługa błędów nie jest oczywista w "produkcyjnych" sytuacjach. W tym kursie znajdziesz najczęściej spotykane problemy oraz sposoby ich rozwiązania.
Bazy danych są praktycznie nieodłączną częścią każdej aplikacji. W roli full-stacka prędzej czy później przyjdzie Ci z nimi pracować a nie rzadko nawet projektować oraz rozbudowywać ich struktury. W tym kursie znajdziesz informacje o bazach danych, które pozwolą Ci je zrozumieć oraz od razu poznać użyteczne techniki, które pomogą Ci w pracy z nimi, zarówno na produkcji jak i w środowisku lokalnym czy testowym.
Nie wszystkie informacje w aplikacji są publiczne. Niektóre wprost nie mogą takie być. Z tego powodu niezbędne są sposoby na to aby poznać a potem weryfikować tożsamość użytkownika, by na jej podstawie przydzielać mu dostęp wyłącznie do zasobów, do których odczytywania posiada uprawnienia. Istnieje wiele technik, które umożliwiają zarządzanie dostępem do danych i w tym kursie poznasz najważniejsze z nich. Dowiesz się nie tylko w jaki sposób zabezpieczać dane ale poznasz też najpopularniejsze sposoby na to aby te zabezpieczenia łamać i obchodzić. Mając świadomość takiej możliwości, będziesz w stanie lepiej podejmować decyzje o tym jak projektować dostęp do informacji.
Istnieją problemy charakterystyczne dla niemal każdej aplikacji. W związku z ich powszechnością, istnieje też szereg rozwiązań lub sposobów na to, aby możliwie zredukować ich następstwa. Na przestrzeni lekcji tego kursu zobaczysz wiele przykładów, które pomogą Ci w codziennej pracy a niekiedy nawet, pozwolą uniknąć błędów, których konsekwencje nie zawsze występują natychmiast.
Kurs powstał z myślą o osobach, które chcą rozwijać się w roli full-stack web developera / developerki, przeprowadzając przez najważniejsze zagadnienia z obszaru wymiany, transformacji oraz przechowywania informacji w aplikacji oraz pomiędzy aplikacjami. Jeżeli potrzebujesz zobaczyć szeroką perspektywę tego, w jaki sposób dane przepływają pomiędzy różnymi częściami aplikacji, lub ugruntować swoją wiedzę na ten temat, to ten kurs jest miejscem, którego szukasz.
W tej lekcji wyjaśnię Ci na czym polega różnica pomiędzy autoryzacją oraz
uwierzytelnienie użytkownika oraz zasadniczo jak przebiegają te procesy.
Zacznijmy od tego, że użytkownik w momencie gdy loguje się do naszej
aplikacji musi podać jakiś identyfikator, który jest unikatowy dla jego konta.
Przykładem takiej informacji jest np.
jego login, adres e-mail bądź np.
numer telefonu.
Następnie razem z taką informacją musi zostać dołączone hasło, bądź jakaś inna
forma kodu, która umożliwi autoryzację tego użytkownika.
Czyli nic innego jak po prostu sprawdzenie
czy dany użytkownik istnieje w naszej bazie i czy podane przez niego hasło jest
poprawne i też czy możemy go zalogować w naszym systemie.
Proponuję, abyśmy przeszli sobie przez to
raz jeszcze, aby wszystko było tutaj jasne.
Zacznijmy od tego, że przede wszystkim nasz użytkownik musi znajdować się w
naszej bazie danych, a to oznacza, że wcześniej musiał zostać zarejestrowany.
Pomijamy ten proces ze względu na to, że jest on całkiem podobny, z tą różnicą, że
w przeciwieństwie do logowania tworzone jest konto użytkownika.
W każdym razie w momencie, gdy użytkownik
przechodzi na stronę logowania, przesyła swój login oraz hasło, a na etapie
backendu te informacje wykorzystywane są w celu odnalezienia tego konkretnego
użytkownika oraz dodatkowo zweryfikowania, czy podane przez niego hasło pasuje do
tego, które przechowywane jest w bazie danych.
Jeżeli tak jest, to w przypadku gdy nasz
backend wykorzystuje system w sesji, zostaje na serwerze utworzona właśnie
sesja użytkownika, a następnie razem z odpowiedzią tzw.
Session kuki, czyli nic innego jak ciasteczko, które trwa tak długo jak
ustawiona jest sesja i umożliwia użytkownikowi wykonywanie kolejnych
działań, przy czym te są już powiązane bezpośrednio z nim.
Ponieważ to ciasteczko powiązane jest z
sesją i co najwyżej backend musi się upewnić, czy ta sesja jest nadal aktywna.
Jeżeli tak, to daje użytkownikowi dostęp do informacji, o które prosi.
I teraz, jeżeli zastanawiasz się, na czym
polega różnica pomiędzy autoryzacją a uwierzytelnienie, to autoryzacja jest to
proces, do którego dochodzi w momencie logowania użytkownika.
Czyli chodzi o upewnienie się, czy dane użytkownika, które podaje istnieją w
naszym systemie i też czy możemy utworzyć dla niego w tym przypadku sesję.
Jeżeli tak, połączenie jest autoryzowane i
użytkownik zyskuje prawo dostępu do dalszych informacji w momencie, gdy
wykonuje kolejne zapytania i w tym przypadku przesyłane jest ciasteczko, ta
informacja zostaje wykorzystana w procesie uwierzytelnienia.
Mianowicie może okazać się, że użytkownik
poprawnie zaloguje się do naszego systemu, ale np.
poprosi o informacje, do których dostępu mieć nie powinien.
W takiej sytuacji proces uwierzytelnienia się nie powiedzie i użytkownik otrzyma
informację o błędzie zawierającą powiadomienie, że oczywiście jego
zapytanie zostało poprawnie zinterpretowane.
Natomiast z różnych powodów nie może uzyskać dostępu do wskazanego zasobu.
Idąc teraz dalej sytuacja nieco się
zmienia w momencie, gdy mamy do czynienia z tokenem.
Zwróć uwagę, że tutaj w przeciwieństwie do sesji, które były przechowywane po stronie
serwera, tokeny przechowywane są po stronie klienta.
Oznacza to, że w momencie logowania użytkownika, gdy faktycznie zostaje
zweryfikowane, że istnieje także hasło jest poprawne.
Zostaje wygenerowany dla niego tzw. token, np.
Jamesa Web token, który zostaje przekazany w odpowiedzi.
W takiej sytuacji po stronie klienta ten token musi zostać zapisany i być dołączany
do każdego kolejnego zapytania w celu uzyskania dostępu.
Tak długo jak ten token jest aktywny, użytkownik ma dostęp do naszej bazy.
W momencie jednak ten token przestaje być
aktywny, użytkownik ponownie musi się zalogować.
W tym momencie być może zastanawiasz się,
na czym polega różnica pomiędzy tokenem i sesjami.
Otóż ta zasadnicza różnica, że sesje przechowywane są po stronie serwera, a
tokeny po stronie klienta jest tutaj najbardziej kluczowa.
Po prostu w momencie, gdy mamy do czynienia np.
z wielo platform owymi aplikacjami, które wykorzystują API do tego, aby komunikować
się często z wieloma serwerami, okazuje się, że znacznie lepszym pomysłem jest
wykorzystanie tokenów, które po prostu przechowywane są po stronie klienta i
zawierają niezbędne informacje do tego, aby określić, kto wykonuje dane zapytanie.
Oznacza to mniej więcej tyle, że nawet jeżeli mielibyśmy tutaj dwa serwery, to
niezależnie od tego, do którego trafi zapytanie, będą one w stanie precyzyjnie
rozróżnić użytkownika i określić, czy ma dostęp do danego zasobu, czy też nie.
W sytuacji jednak, gdy mamy do czynienia z
sesjami, sesje te przechowywane są na serwerze.
Oznacza to, że jeżeli tutaj mielibyśmy drugi serwer, to niestety on nie będzie
posiadał informacji na temat sesji, która została utworzona na drugim serwerze.
Naturalnie moglibyśmy utworzyć tutaj specjalną usługę służącą tylko do tego,
aby przechowywać sesje i wtedy każdy z serwerów musi się z nią komunikować.
Natomiast bez wątpienia jest to
zdecydowanie trudniejsze rozwiązanie niż chociażby wykorzystanie tokena.
Jednocześnie ta trudność pojawia się tylko
w momencie, gdy mamy do czynienia z rozproszonymi.
W momencie, gdy pracujemy z typowym front endem i back end.
Całkiem dobrym pomysłem jest sięgnięcie po
sesję ze względu na to, że jest to zdecydowanie prostsze niż np.
wykorzystywanie tokenów.
Oznacza to mniej więcej tyle, że w
momencie, gdy tworzysz prostą aplikację, która zawiera wyłącznie frontend oraz
backend, to zdecydowanie lepszym pomysłem jest wykorzystanie sesji.
Jednak w momencie, gdy tworzysz usługę, która posiada API, które może być np.
skalowane horyzontalnie na wiele różnych serwerów lub też masz jakiś inny konkretny
powód mówiący o tym, że tokeny sprawdzą Ci się lepiej.
Przykładem może być tutaj chociażby aplikacja mobilna.
Od siebie dodam, że w większości
przypadków spotykam się właśnie z systemami, które wykorzystują tokeny
zamiast sesji i szczerze mówiąc sam coraz częściej z nich korzystam.
Jednocześnie w momencie, gdy zagłębiałem
się w tematy dotyczące kwestii bezpieczeństwa, no to okazuje się, że pod
wieloma względami sesje są tutaj zdecydowanie lepszym wyborem.
Szczególnie w momencie, gdy mamy do czynienia ze stosunkowo prostą aplikacją,
w przypadku której nie do końca jest uzasadnione budowanie całego systemu
obsługującego chociażby tokeny, które mogą zostać anulowane przez administratora.
A to oznacza przygotowanie odpowiedniego mechanizmu, które pozwala na odrzucenie
nawet poprawnego tokena w sytuacji, gdy ten znajduje się na takiej liście.
Na koniec dnia jednak, gdy spojrzysz na to
wszystko z boku, to jasno tutaj widać pewne podobieństwa.
W jednym i drugim przypadku mamy formularz logowania.
W jednym i drugim przypadku użytkownik jest weryfikowany pod kątem tego, czy
znajduje się w bazie danych oraz tego, czy hasło, które podał jest poprawne.
W momencie, gdy to się wydarzy, w jednym przypadku tworzona jest sesja na serwerze.
W drugim przypadku generowany token, który musi zostać zapisany po stronie klienta.
Następnie, niezależnie od mechanizmu, który został tutaj wybrany, informacja o
danej sesji bądź też tokenu przesyłana jest z każdym kolejnym zapytaniem.
To jak długo trwa dana sesja określona jest oczywiście w ustawieniach sesji, a to
jak długo ważny jest token, skonfigurowany jest na etapie jego tworzenia.
Oznacza to wszystko, że mamy tutaj po prostu do czynienia z dwoma różnymi
strategiami do tego, aby osiągnąć zasadniczo to samo.
Ale oczywiście, który sposób wybierzemy
powinno być uzależnione od tego, jaki rodzaj aplikacji tworzymy oraz też który
ze sposobów będzie dla nas bardziej użyteczny.
I teraz na koniec proponuję, abyśmy
jeszcze szybko przeszli sobie przez mechanizm przypominania hasła, ponieważ
bardzo często występuje on właśnie na etapie, gdy użytkownik się loguje.
Mianowicie formularz resetowania hasła zwykle wymaga od nas podania adresu email.
Taki adres zostaje przekazany do backendu, gdzie oczywiście zostaje weryfikowane to,
czy w ogóle taki użytkownik istnieje i jeżeli tak, zostaje wygenerowany dla niego
specjalny token umożliwiający zresetowanie tego hasła.
Token ten przesyłany jest zwykle za pomocą wiadomości email, gdzie zawarty jest link
resetowania hasła, w ramach którego zawarty jest właśnie ten token.
W momencie, gdy użytkownik wejdzie na ten adres, z parametru query string pobierany
jest ten token, a następnie gdy użytkownik przejdzie na ten adres w momencie
wysyłania zapytania, backend odczytuje ten parametr z query string, a następnie
pobiera jego zawartość porównując go z zawartością przechowywaną w bazie danych.
W momencie gdy token jest poprawny,
wszystko się zgadza i hasło może zostać zresetowane.
W przeciwnym razie prośba zostaje odrzucone.
Oczywiście należy jeszcze zadbać o to, aby te tokeny były weryfikowane pod kątem nie
tylko poprawności, ale również tego, czy są ważne.
Mam tutaj na myśli chociażby flagę active, czyli po prostu oznaczenie czy token jest
aktywny czy też nie lub też określanie tego na podstawie daty utworzenia np.
po 10 minutach token może przestać być aktywny.
No i w ten oto sposób wiesz już w jaki sposób działa autoryzacja oraz
uwierzytelnienie użytkownika oraz nawet proces resetowania hasła.
Te wszystkie informacje będą nam potrzebne
na dalszym etapie i będziemy sobie do nich niejednokrotnie wracać.
No może z wyjątkiem sesji, którą już nie będziemy się zajmować, ale w zamian
mnóstwo naszej uwagi będzie poświęcona właśnie mechanizmowi Jameson Web Token.
Zatem na ten moment dziękuję Ci za uwagę i do usłyszenia w kolejnym filmie.