Projekt aplikacji SaaS
8 godz. 8 min · Next.js · Full-stack i Programowanie
Daniel NoworytaFull stack DeveloperNaucz się tworzyć bezpieczne systemy uwierzytelniania i autoryzacji, korzystając z Clerk. Pokażę Ci, jak to robić krok po kroku, aby Twoje aplikacje były bezpieczne i profesjonalne.
Zrozumiesz, jak skutecznie i bezboleśnie połączyć swoją aplikację Next.js z bazą danych PostgreSQL na DigitalOcean. Pokażę Ci, jak używać Prismy, aby ułatwić ten proces.
Dowiesz się, jak zarządzać routingiem i nawigacją w swojej aplikacji, aby użytkownicy mogli łatwo i intuicyjnie poruszać się po Twojej stronie.
Pokażę Ci, jak z łatwością wdrożyć swoją aplikację na Vercel, jednym z najpopularniejszych środowisk hostingowych dla aplikacji Next.js.
Nauczysz się zarządzać stanem aplikacji i jak wykorzystać server actions w praktyce, co pozwoli Ci na tworzenie bardziej zaawansowanych i dynamicznych funkcji.
Ten kurs jest dla osób, które już mają pewne doświadczenie z JavaScript i chcą zgłębić swoje zrozumienie Next.js. Zakładamy, że znasz podstawy TypeScript, TailwindCSS, ale nie potrzebujesz doświadczenia z Next.js - wszystko wyjaśnię Ci od podstaw!
Teraz zajmiemy się całą logiką związaną z
tworzeniem konta użytkownika, czyli stworzymy nasz własny sign up page.
I żeby to zrobić generalnie musimy wrócić
się do naszego routingu, który już sobie ustawiliśmy i mamy AP, mamy nasz atut i
tutaj pod tym będziemy potrzebowali nasz sign up page czyli sign up.
Niech to będzie pierwszy folder i pod
folder musimy wykorzystać z informacji w jaki sposób korzysta się z upload.
W next czaję się i potrzebujemy catch spread operator z dwoma nawiasami,
czyli dwa nawiasy, trzy kropeczki i sign up.
W naszym przypadku zrobimy sobie po prostu sign up.
No i w środku potrzebujemy nasz page, czyli Page kropka x.
I tutaj możemy sobie zaimportować to co
mamy z naszej biblioteki i jeszcze zmienią sign up page.
Zapisujemy to sobie już w tym momencie.
Jak wystartujemy sobie naszą aplikację
to powinniśmy móc stworzyć nowych użytkowników.
Natomiast jeszcze zanim to, to wklejamy
sobie odpowiednią konfigurację do naszego pliku n.p.
Tutaj w tym momencie powinniśmy w pliku
Database next Publisher Sekret ki i te cztery zmienne, które mamy tutaj podane.
Zapisujemy sobie ten plik.
Przejdźmy teraz do naszej aplikacji MPM Runde 2.
Startujemy naszą aplikację i teraz
otwórzmy naszą aplikację na localhost 3000.
Mamy naszą aplikację już otwartą.
I teraz przejdźmy sobie na stronę Sign up.
Już dostajemy tutaj nasz formularz do rejestracji użytkowników.
Przejdźmy sobie jeszcze na dashboard.
Zobaczmy czy w ogóle mamy jakikolwiek
użytkowników w tym momencie w naszej aplikacji.
Jeszcze nie mamy żadnych userów, czyli
przejdźmy sobie na naszą localhost aplikację.
Spróbujemy zarejestrować pierwszego użytkownika.
Wszystko jest w porządku.
Mamy od razu walidację przez kler zbudowaną dla nas w tym komponencie Snap.
I dajemy continue.
Dostajemy na email kod do walidacji, a
teraz każdy sobie swój email na którym zakładam to konto email.
Tutaj dostałem email z notyfikacje na kont dev z Pocket Sapa.
Teraz ten kod po prostu przykleję.
Konto zostanie zweryfikowane.
Noi jesteśmy dostaliśmy redirect na tak jak to było.
Generalnie skontaktowaliśmy to w naszym
pliku doc, natomiast redirect URL też możemy sobie tutaj ustawiać.
Tu możemy sobie ustawić redirect URL na obojętnie jaki chcemy.
Po sukcesie po logo, po logowaniu danego użytkownika,
po założeniu poprzedniego konta możemy go od razu zalogowanego przekierować np.
na dashboard aplikacji. Dobrze, to mamy.
Zakładanie użytkowników z głowy.
Mamy jak widać tego nowego użytkownika.
Natomiast jest jeden problem, bo nasza Prisma Studio nie ma nic.
Te dane i dobre sobie usunąłem już
z tego sito, natomiast teraz jest pusta baza danych.
No i generalnie nie mamy tutaj nikogo w naszej bazie danych
użytkownik został założony, ale jest tylko po stronie Clarka.
Jeżeli sobie to odświeżę to użytkownik tutaj powstaje.
Tutaj wchodzę, wchodzi generalnie
koncepcja web poków, które są nam potrzebne do tego, żebyśmy mogli reagować
na pewne akcje na Killer Clark udostępnia nam Web Kuki, które są świetne jeżeli
chodzi o to w jaki sposób działają i na jakie akcje możemy reagować.
Jest to bardzo fajnie wszystko opisane w naszym dokumentacji.
Natomiast nas interesują dwa eventy User created i User updated.
W tym przypadku będziemy potrzebowali
troszeczkę tutaj pokombinować, żeby móc to przetestować na serwerze developerskim.
Pierwsza rzecz, która będzie potrzebna to na pewno będziemy potrzebowali jakiś
endpoint w naszej aplikacji, który pozwoli nam na to, żeby ten web wywołać później.
Czyli stwórzmy sobie teraz endpoint naszej aplikacji.
Jako, że jesteśmy w folderze app możemy sobie stworzyć pod folder API.
Później web UX.
I niech to będzie coś takiego.
I teraz potwierdzę, że API Web User możemy zrobić tutaj.
NUTS standardowo i potrzebujemy stworzyć teraz tutaj jakiś handler, który będzie
pozwalał nam na pracę z tym co przychodzi do naszego serwera z zewnątrz.
Teraz jeżeli chodzi o tym handler, to ja
go przygotowałem na boku i już przejdziemy sobie przez logikę tutaj występującą.
Będziemy potrzebować w.
Sekret w naszych 2 element variable, które
są potrzebne do tego, żeby stworzyć jakiegoś web hooka za pomocą paczki SFX.
Zainstaluj sobie teraz tą paczkę.
Prawdopodobnie u Ciebie będzie błąd, że
tej tej biblioteki ta biblioteka nie istnieje.
Po prostu możesz sobie zrobić npm install
SFX i to co tą funkcję którą tutaj mamy to jest standardowy handler
jaki budujemy sobie tutaj tylko przypisujemy to get post i
put, żeby ten handler po prostu sobie tutaj działał.
Jeżeli ktokolwiek wyśle na ten endpoint
jakieś zapytanie pilot, który
przyjmujemy z tego zapytania, od razu sobie tworzymy z tego obiekt Jameson.
Sprawdzamy sobie head.
To tu jest związane z logiką w jaki sposób
obsługujemy wierzchołki za pomocą biblioteki SFX.
Generalnie polecam Ci poczytać sobie troszeczkę dokumentację.
To jest bijatyka do pracy z łukami
czy to na serwerze lokalnym, czy też na produkcji.
Już tworzymy sobie tutaj wiele funkcji, które możemy wykorzystywać.
I tutaj weryfikujemy sobie ten pilot za pomocą właśnie tej biblioteki SFX.
Używając jej typów.
No i tutaj jeżeli już mamy to wszystko zweryfikowane, nasz web hub jest poprawnie
wywołany, to łapiemy sobie event i sprawdzamy typ eventu.
To jest typ eventu, który pochodzi nam tutaj właśnie z biblioteki Clark DX.
I tutaj w przypadku User created user
updated wyciągamy sobie id email, adres url name i w przypadku kiedy ten
użytkownik nie istnieje robimy normalną akcję Prisma User create.
Natomiast jeżeli istnieje to update danego
jęzora, możemy sobie id też tutaj zostawić.
Tak naprawdę mamy tutaj wszystko.
W momencie, w którym przechwytuje jakiś
Pan Łukasz Klepka wywołujemy normalną akcję.
Zapisujemy tego użytkownika w naszej bazie danych.
ID emaili i name zostaje zapisane.
No i tutaj jest tylko typ, który pozwala
nam mieć silnie typowany pilot, bo nie jest to określone.
Musimy to sami tutaj ten event o typować.
Do tego też mamy to
w taki sposób Clark wysyła email address jako tablica takich obiektów.
Każdy email adres email ma swoje ID i ma swój stream czyli tą wartość.
W naszym przypadku będzie to pierwszy
email adres zawsze na który dany użytkownik będzie zakładał swoje konto.
I teraz to jest tutaj wszystko fajnie.
Natomiast jest jeden problem musimy sobie to jakoś udostępnić do świata globalnego.
Nawet naszą aplikację na localhost 3000
udostępnić ją tak, żeby Clark mógł wywołać ten endpoint
tak, żeby Clark mógł tutaj nam przesłać jakiś pilot, prawda?
I tutaj generalnie z pomocą przychodzi paczka NG rok.
To jest paczka do hostowania swojego lokalnego środowiska na zewnątrz.
Możemy sobie bardzo szybko naszą aplikację hostować na zewnątrz.
Polecam Ci przejść tutaj przez tą dokumentację.
To jest bardzo fajne opisane.
Opisana instalacja na Twoim systemie.
W jaki sposób to zainstalować?
W jaki sposób to skonfigurować?
Nie jest to trudne.
Tak naprawdę mamy takie biblio blue install ng rok i tak naprawdę to tyle.
Nie ma tutaj nic, nie trzeba
nic skonfigurować jeszcze trzeba stworzyć sobie konto i dodać out token
I dzięki temu później możemy sobie skorzystać z czegoś takiego, co
udostępnia nam naszą aplikację z danego portu do świata zewnętrznego.
I to samo teraz robimy u nas.
Generalnie rzecz biorąc
mamy naszą aplikację wychowaną na porcie 3000, dlatego teraz postaramy się
udostępnić tą aplikację do świata zewnętrznego.
Ja tutaj w nowym prawie zrobię wszystko jak changelog HTTP 3000,
czyli chcemy naszą aplikację udostępnić do świata zewnętrznego.
Po co jest nam to potrzebne?
Otóż ten adres, który tutaj uzyskujemy będzie adresem potrzebnym do tego, żeby
w konfiguracji Web na Clark App dodać endpoint.
Tak, potrzebujemy tutaj jakiegoś adresu URL, na który będziemy mogli sobie wysyłać
te lody w zależności od tego, kiedy będziemy tworzyć nowego użytkownika.
I tutaj właśnie ja sobie wpisuję ten adres i leszczu potrzebujemy podać nasz
endpoint, który sobie stworzyliśmy w naszej aplikacji.
Czyli to w naszym przypadku będzie API.
Mamy user czyli user.
Jeszcze sobie to sprawdzę.
API user, czyli to jest endpoint, który
wykorzystuje Clark, a to tutaj to jest adres aplikacji, pod której tak naprawdę
możemy teraz otworzyć naszą aplikację, bo Angular kosztuje ją globalnie.
Także pod portem HTTPS mamy naszą
aplikację wykorzystywaną w tym momencie, jeżeli tylko chodzi na naszym systemie.
Czyli to jest adres, pod który chcemy wysyłać nasz pilot i wysyłamy nasz pilot.
W przypadku stworzenia nowego użytkownika i w
przypadku update użytkownika zróbmy sobie teraz Create.
Powinniśmy dostać tutaj Secret Web Hooka,
który też musimy sobie dodać do konfiguracji naszej aplikacji.
Przejdźmy teraz do naszego pliku dot Elf, w którym dodamy kolejną
tutaj wartość i kolejna wartość to będzie Web Hux Secret.
Tak i tutaj będzie wartość tego sekretu.
Stworzy się jeszcze jeden problem, bo w
momencie kiedy zmieniamy plik DOC musimy zrestartować naszą aplikację, prawda?
Jeżeli jest restartujemy naszą aplikację,
to tutaj ten adres już może nie mieć znaczenia.
Sprawdzimy czy Angular łapie też zmiany.
Jeżeli my restartujemy nasze aplikacje mamy localhost 3000.
Sprawdźmy czy ta aplikacja dalej istnieje pod tym adresem.
No tak, jest, jest ok, także powinno wszystko działać.
Teraz przejdźmy do konfiguracji.
Mamy web, Ten sam secret już
wykorzystaliśmy i w tym momencie powinniśmy móc
za pomocą normalnego sign up page wywoływać te web kropki, dostawać pewne
dane w naszej aplikacji, które później powinny tworzyć użytkownika w backend.
Sprawdźmy sobie teraz poprzez to, że ja sobie usunę tego użytkownika co wiem
delete user sprawdzimy sobie tutaj Prisma Studio.
Generalnie nie mamy żadnego użytkownika na razie w naszym studio.
Przejdźmy teraz do naszej aplikacji.
Co wiemy o Refresh?
I teraz przejdźmy sobie na stronę Sign Up
strona tworzenia nowego użytkownika I teraz username.
To samo co poprzednio i mail.
Adres ten sam, jakiekolwiek hasło.
I teraz w momencie kiedy ja kliknę continue.
Jeżeli wszystko pójdzie dobrze to powinniśmy dostać tutaj
request na NG rok na nasz web hook i jeżeli wszystko pójdzie w porządku to też
powinien stworzyć się użytkownik po stronie naszego backendu.
No bo tak naprawdę w naszym tutaj ruchu mamy całą akcję, która jest
odpowiedzialna za to, żeby stworzyć nam tego użytkownika.
W zależności od tego co tutaj przychodzi jako przylot z Clarka, czyli.
Przejdźmy teraz jeszcze raz do naszej przeglądarki.
Spróbujemy stworzyć użytkownika.
Dostajemy kod na email, który musimy potwierdzić.
Ja dostałem kod na email.
To jest kod, który sobie potwierdzamy.
Zostaliśmy przekierowani na stronę route
ową, tak jak to jest generalnie w naszej aplikacji.
Natomiast co ważniejsze interesuje nas to czy ten web został wywołany.
Sprawdźmy sobie wywołania echo, jest jakieś wywołanie i mamy te empty?
Są dane, które zostały przekazane.
Mamy failed fail.
Sprawdźcie sobie o co tutaj poszło.
Zobaczymy czy użytkownik został stworzony.
Nie, użytkownik nie został stworzony.
Sprawdźmy sobie tutaj logi.
Jest na Auto Rise.
Prawdopodobnie nie udostępniliśmy tego
endpoint tu publicznie, czyli endpoint jest domyślnie wszystkie endpoint.
Jeżeli używamy Clarka są zamknięte, czyli
musimy sobie teraz przejść do middleware i tutaj w tych public root
musimy zaznaczyć, że ten root do rejestracji, czyli API Web Bugs.
User.
Jest ruchem publicznym.
Jeszcze raz spróbujemy wywołać tego Chucka.
Spróbujemy sobie usunąć tego użytkownika,
którego mamy teraz w bazie danych Digit User.
Przejdziemy znowu do naszej aplikacji.
Przejdziemy na stronę Design Map.
Mamy naszą stronę, spróbujemy od nowa stworzyć użytkownika i dajemy Continue.
Zobaczymy. Znowu musimy potwierdzić nasz kod.
Wklejamy kod maila, który dostaliśmy jest użytkownik potwierdzony.
Natomiast teraz ważniejsze to to, co się dzieje tutaj.
Sprawdźmy, czy użytkownik został stworzony, użytkownik został stworzony.
Sprawdźmy teraz web kroki, czy dalej mamy ten sam problem.
Mamy camping.
Zobaczmy naszą bazę danych.
Tak został stworzony nowy użytkownik.
Zobacz, że mamy tutaj nowego użytkownika
właśnie z ID tego usera, którego mamy tutaj.
Czyli to jest to samo ID co jest Clark.
Mamy username, mamy email, czyli wszystko co potrzebujemy w naszej aplikacji.
Połączyliśmy teraz logikę tworzenia
użytkowników z Claire, z logiką tworzenia użytkowników w naszej bazie danych.
Czyli teraz za każdym razem, jeżeli ktoś sobie stworzy użytkownika,
my będziemy mogli sobie tego użytkownika od razu mieć w naszej bazie danych.
Czyli ten minus, który na początku mówiłem, który jest związany z tym, że tak
naprawdę bardzo wielu ludzi mówi, że jeżeli
korzystamy z gotowych rozwiązań, no to jednak poświęcamy to, ż i nasi użytkownicy
lądują gdzieś w zewnętrznych serwerach, serwisach.
Przepraszam.
Nie jest takim minusem, no bo generalnie możemy sobie to ograć za pomocą właśnie
wierzchołków, żeby te dane zapisywać odpowiednio w naszej bazie danych.
Już w tym momencie mamy jednego użytkownika, który tutaj
mam aktywną sesję, także jak przejdę teraz na dashboard to prawdopodobnie
mogę sobie normalnie przejść na dashboard to bo jestem zalogowany.
Jest jakiś Kukiz?
Tutaj jest sesja, która generalnie rzecz biorąc jest sesją aktywną w naszej w
naszej przeglądarce, w naszej aplikacji, dzięki czemu też mogę sobie
tutaj chodzić po tej aplikacji i bez problemu.
Teraz przejdziemy sobie do ekranu logowania i po chwilę zaczniemy sobie
budować całą jakby cały Boży całą nawigację po naszej aplikacji.