Jako programista odpowiadasz za ochronę danych użytkowników poprzez uwierzytelnianie. Możesz użyć Passport.js do uwierzytelniania użytkowników w aplikacji Node i Postgres.

Zacznij od utworzenia serwera Node z punktami końcowymi do rejestrowania, logowania i wylogowywania użytkowników. Możesz pozwolić, aby usługa Passport obsługiwała uwierzytelnianie, aby ograniczyć nieautoryzowany dostęp do Twojej aplikacji.

Tworzenie tabeli użytkowników

Do uwierzytelniania użytkownika użyjesz adresu e-mail i hasła. Oznacza to, że tabela użytkowników musi zawierać pole e-mail i hasło. W wierszu polecenia psql utwórz nową bazę danych o nazwie nodeapp:

STWÓRZBAZA DANYCH nodeapp;

Następnie utwórz tabelę do przechowywania użytkowników:

STWÓRZSTÓŁużytkownicy (
id INT GENEROWANY ZAWSZE JAKO KLUCZ PODSTAWOWY TOŻSAMOŚCI,
email CHAR(128),
hasło CHAR(60)
);

Ten kod utworzy nową tabelę zawierającą adres e-mail, hasło i automatycznie wygenerowane pole identyfikatora.

Tworzenie serwera węzłów

Node.js to środowisko uruchomieniowe JavaScript po stronie serwera, które pozwala nam szybko tworzyć serwery HTTP. Aby uprościć proces tworzenia serwera i różnych tras HTTP, możesz użyć

instagram viewer
Express, framework webowy Node.js.

Uruchom to polecenie, aby utworzyć nowy folder o nazwie postgres-auth:

mkdir postgres-auth

Następnie zainicjuj npm:

npm początek -y

Na koniec zainstaluj Express:

npm zainstaluj ekspres

Możesz teraz utwórz serwer sieciowy Node.

W nowym pliku o nazwie index.js, dodaj następujące:

stały ekspres = wymagać("wyrazić");
stały aplikacja = ekspres();
app.use (express.json());
app.use (express.urlencoded({ rozszerzony: PRAWDA }));
aplikacja.słuchaj(3000, () => konsola.log("Nasłuchiwanie na porcie 3000"));

Uruchomienie tego kodu uruchomi serwer i zarejestruje w konsoli:

Nasłuch na porcie 3000

Łączenie z PostgreSQL

Do połącz się z PostgreSQL posługiwać się węzeł-postgres. node-postgres to sterownik połączenia, który zapewnia interfejs między Node i Postgres.

Wykonaj następujące czynności, aby zainstalować node-postrges przez npm:

npm zainstaluj pg

Po zainstalowaniu tej biblioteki utwórz nowy plik o nazwie db.js i podłącz go do bazy danych:

stały { Klient } = wymagać("str");
stały { użytkownik, host, baza danych, hasło, port } = wymagać("./dbKonfiguracja");

stały klient = Nowy Klient({
użytkownik,
gospodarz,
Baza danych,
hasło,
Port,
});

klient.connect();
moduł.eksport = klient;

Metoda klienta z node-postgres pobiera szczegóły bazy danych, z którą się łączysz. Ten program importuje szczegóły połączenia z pliku o nazwie Konfiguracja bazy danych. Dlatego utwórz ten plik i dodaj do niego następujący kod:

moduł.eksport = {
użytkownik: "postgres",
host: "host lokalny",
baza danych: "nodeapp",
hasło: "twojeHasło",
Port: 5432,
};

Utwórz funkcje pomocnicze bazy danych

Dobrą praktyką jest zawsze używanie poszczególnych funkcji do interakcji z bazą danych. Ułatwiają pisanie testów jednostkowych i poprawiają ponowne wykorzystanie. Dla punktu końcowego rejestracji musisz utworzyć dwie funkcje:

  1. Aby sprawdzić, czy e-mail jest już zarejestrowany.
  2. Aby utworzyć użytkownika.

Celem jest zarejestrowanie użytkownika tylko wtedy, gdy nie istnieje w bazie danych.

Utwórz nowy plik o nazwie pomocnik.js i zaimportuj klienta bazy danych z db.js:

stały klient = wymagać("./db.js")

Następnie dodaj nową funkcję o nazwie emailExists():

stały emailIstnieje = asynchroniczny (e-mail) => {
stały dane = czekać na client.query("SELECT * FROM users WHERE email=$1", [
e-mail,
]);

jeśli (data.rowCount == 0) zwrócićfałszywy;
zwrócić dane.wiersze[0];
};

Ta funkcja pobiera wiadomość e-mail i sprawdza, czy jest już używana. Odbywa się to za pomocą klauzuli SELECT, która zwraca wiersz zawierający pole adresu e-mail zgodne z wartością podaną przez rejestrującego się użytkownika. Jeśli e-mail nie istnieje, zwraca false.

Aby utworzyć funkcję, która tworzy użytkownika, dodaj funkcję o nazwie createUser() do helper.js:

stały utwórzUżytkownika = asynchroniczny (e-mail, hasło) => {
stały sól = czekać na bcrypt.genSalt(10);
stały hasz = czekać na bcrypt.hash (hasło, sól);

stały dane = czekać na klient.zapytanie(
"WSTAW UŻYTKOWNIKÓW (e-mail, hasło) WARTOŚCI ($1, $2) ZWROT identyfikator, e-mail, hasło",
[e-mail, hash]
);

jeśli (data.rowCount == 0) zwrócićfałszywy;
zwrócić dane.wiersze[0];
};

Ta funkcja pobiera wartości adresu e-mail i hasła. Używa klauzuli INSERT, aby utworzyć nowy wiersz z tymi szczegółami, a jeśli się powiedzie, zwraca nowo utworzonego użytkownika. Pamiętaj, że przed zapisaniem hasła powinieneś: zahaszuj to za pomocą bcrypt. Przechowywanie haseł w postaci zwykłego tekstu nigdy nie jest dobrym pomysłem. Jeśli hakerzy uzyskają dostęp do Twojej bazy danych użytkowników, mogą łatwo uzyskać dostęp do poufnych informacji.

Zainstaluj bcryptjs, aby zacząć z niego korzystać:

npm zainstaluj bcryptjs

W helper.js zaimportuj bcryptjs:

stały bcrypt = wymagać("bcryptjs")

Korzystając z Bcryptjs, baza danych przechowuje tylko zaszyfrowane hasło. Dlatego podczas logowania będziesz musiał porównać hasło w postaci zwykłego tekstu podane przez użytkownika z haszowanym hasłem w bazie danych. W tym celu możesz użyć metody porównania dostarczonej przez Bcryptjs.

Utwórz funkcję o nazwie matchPassword():

stały Dopasuj hasło = asynchroniczny (hasło, hashPassword) => {
stały dopasowanie = czekać na bcrypt.compare (hasło, hashPassword);
zwrócić mecz
};

Otrzymuje zwykłe hasło i skrót, a następnie używa Bcrypt.compare() w celu określenia, czy podane hasło jest poprawne. Jeśli tak, zwraca prawdę, w przeciwnym razie zwraca fałsz.

Są to wszystkie funkcje, których użyjemy do interakcji z bazą danych. Koniecznie wyeksportuj je wszystkie:

moduł.exports = { emailExists, createUser, matchPassword };

Konfiguruj Paszport

Passport to oprogramowanie pośredniczące do uwierzytelniania węzłów, które zapewnia ponad 500 strategii uwierzytelniania, takich jak logowanie społecznościowe, tokeny internetowe JSON (JWT) i uwierzytelnianie poczty e-mail. Będziemy korzystać z tych ostatnich, które zapewnia strategia paszportowo-lokalna.

Użyj następującego polecenia, aby zainstalować paszport i paszport-lokalny:

paszport instalacji npm
npm zainstaluj paszport-lokalny

Następnie skonfiguruj Paszport, aby logować istniejących użytkowników i rejestrować nowych użytkowników.

Zacznij od utworzenia nowego pliku paszportConfig.js. Następnie zaimportuj lokalną strategię Passport i utworzone przed chwilą funkcje pomocnicze bazy danych:

stały Strategia lokalna = wymagać(„paszport-lokalny”);
stały { emailExists, createUser, matchPassword } = wymagać("./pomocnik");

W tym samym pliku dodaj następujące elementy, aby skonfigurować rejestrację użytkownika:

moduł.export = (paszport) => {
paszport.użyj(
"rejestracja lokalna",
Nowy Strategia lokalna(
{
usernameField: "e-mail",
passwordField: "hasło",
},
asynchroniczny (e-mail, hasło, gotowe) => {
próbować {
stały użytkownikIstnieje = czekać na emailExists (e-mail)

jeśli (użytkownik istnieje) {
zwrócić Gotowe(zero, fałszywy);
}

stały użytkownik = czekać na createUser (e-mail, hasło);
zwrócić Gotowe(zero, użytkownik);
} złapać (błąd) {
zrobione (błąd);
}
}
)
);
}

Ponieważ paszport-local oczekuje nazwy użytkownika i hasła, a Ty używasz e-maila, ustaw pole nazwy użytkownika na e-mail. Użytkownik, a raczej frontendowa część tej aplikacji, wyśle ​​e-mail i hasło w treści żądania. Nie musisz jednak samodzielnie wyodrębniać wartości, ponieważ Passport obsłuży to w tle.

Ten program najpierw sprawdza, czy wiadomość e-mail jest już zajęta za pomocą funkcji emailExists() z helper.js. Jeśli e-mail nie istnieje w bazie danych, tworzy nowego użytkownika za pomocą funkcji createUser(). Na koniec zwraca obiekt użytkownika.

Aby zalogować się użytkowników, dodaj następujące elementy do pliku passportConfig.js:

moduł.export = (paszport) => {
paszport.użyj(
"rejestracja lokalna",
Nowy Strategia lokalna(
// Zapisz się
)
);
paszport.użyj(
"Logowanie lokalne",
Nowy Strategia lokalna(
{
usernameField: "e-mail",
passwordField: "hasło",
},
asynchroniczny (e-mail, hasło, gotowe) => {
próbować {
stały użytkownik = czekać na emailExists (e-mail);
jeśli (!użytkownik) zwrócić Gotowe(zero, fałszywy);
stały isMatch = czekać na matchPassword (hasło, użytkownik.hasło);
jeśli (!isMatch) zwrócić Gotowe(zero, fałszywy);
zwrócić Gotowe(zero, {ID: identyfikator użytkownika, e-mail: użytkownik.email});
} złapać (błąd) {
zwrócić zrobione (błąd, fałszywy);
}
}
)
);
};

Tutaj program najpierw sprawdza, czy e-mail jest zarejestrowany. Jeśli nie, zwraca false. Jeśli znajdzie wiadomość e-mail, porównuje swoje hasło z hasłem z żądania. Jeśli hasła są zgodne, loguje użytkownika i zwraca obiekt użytkownika.

Ostatnim krokiem jest utworzenie punktów końcowych API:

  • POST /auth/rejestracja
  • POST /auth/login

Oba te punkty końcowe otrzymają wiadomość e-mail i hasło w treści żądania. Będą one również zawierać funkcje oprogramowania pośredniczącego do uwierzytelniania paszportów, które właśnie skonfigurowaliśmy.

Zaimportuj i skonfiguruj Paszport w nowym pliku o nazwie serwer.js:

stały paszport = wymagać("paszport");
wymagać("./passportConfig")(paszport);

Następnie dodaj następujące trasy:

aplikacja.post(
"/auth/Zapisz się",
paszport.authenticate("lokalna rejestracja", { sesja: fałszywy }),
(req, res, next) => {
res.json({
użytkownik: wymagany użytkownik,
});
}
);
aplikacja.post(
"/auth/Zaloguj sie",
paszport.authenticate("lokalny-login", { sesja: fałszywy }),
(req, res, next) => {
res.json({ użytkownik: wymagan.użytkownik });
}
);

Obie te trasy zwracają obiekt JSON zawierający użytkownika, jeśli się powiedzie.

Sprawdź swój interfejs API za pomocą testów jednostkowych

Możesz użyć Passport do uwierzytelnienia aplikacji Node za pomocą aplikacji PostgreSQL. Utworzyłeś punkty końcowe API, aby rejestrować się i logować użytkowników.

Chociaż można używać klientów REST, takich jak Postman, do testowania działania interfejsu API, pisanie testów jednostkowych jest znacznie prostsze. Testy jednostkowe umożliwiają testowanie poszczególnych części aplikacji. W ten sposób, nawet jeśli punkt końcowy ulegnie awarii, możesz wskazać dokładny punkt awarii. Jednym z narzędzi, których możesz użyć do testowania aplikacji Node, jest Jest.