Kao programer, vaša je odgovornost zaštititi podatke svojih korisnika putem provjere autentičnosti. Možete koristiti Passport.js za autentifikaciju korisnika u aplikaciji Node i Postgres.
Započnite stvaranjem Node poslužitelja s krajnjim točkama za registraciju, prijavu i odjavu korisnika. Možete dopustiti da Passport upravlja autentifikacijom kako bi ograničio neovlašteni pristup vašoj aplikaciji.
Stvaranje tablice korisnika
Za autentifikaciju korisnika koristit ćete e-poštu i lozinku. To znači da tablica korisnika mora sadržavati polje za e-poštu i lozinku. U naredbenom retku psql stvorite novu bazu podataka pod nazivom nodeapp:
STVORITIBAZA PODATAKA nodeapp;
Zatim izradite tablicu za pohranu korisnika:
STVORITISTOLkorisnika (
id INT GENERIRAN UVIJEK KAO PRIMARNI KLJUČ IDENTITETA,
e-pošta CHAR(128),
lozinka CHAR(60)
);
Ovaj kôd će stvoriti novu tablicu koja sadrži e-poštu, lozinku i automatski generirano ID polje.
Stvaranje poslužitelja čvora
Node.js je JavaScript runtime okruženje na strani poslužitelja koje nam omogućuje brzu izradu HTTP poslužitelja. Da biste pojednostavili postupak stvaranja poslužitelja i različitih HTTP ruta, možete koristiti
Express, Node.js web okvir.Pokrenite ovu naredbu za stvaranje nove mape pod nazivom postgres-auth:
mkdir postgres-auth
Zatim inicijalizirajte npm:
npm init -y
Na kraju instalirajte Express:
npm instalirajte ekspresno
Sada možete kreirajte web poslužitelj Node.
U novoj datoteci tzv index.js, dodajte sljedeće:
konst izraziti = zahtijevati("izraziti");
konst app = express();
app.use (express.json());
app.use (express.urlencoded({ proširena: pravi }));
app.listen(3000, () => konzola.log("Slušanje na portu 3000"));
Pokretanje ovog koda pokrenut će poslužitelj i zabilježiti sljedeće u konzolu:
Slušanje na portu 3000
Spajanje na PostgreSQL
Do spojite se na PostgreSQL koristiti čvor-postgres. node-postgres je upravljački program za povezivanje koji pruža sučelje između Nodea i Postgresa.
Izvršite sljedeće da instalirate node-postrges putem npm-a:
npm instaliraj str
Nakon što instalirate tu biblioteku, stvorite novu datoteku pod nazivom db.js i spojite ga na bazu podataka:
konst {Klijent} = zahtijevati("str");
konst { korisnik, host, baza podataka, lozinka, port } = zahtijevati("./dbConfig");konst klijent = novi Klijent({
korisnik,
domaćin,
baza podataka,
zaporka,
luka,
});
klijent.poveži();
modul.exports = klijent;
Metoda klijenta iz node-postgres-a uzima detalje baze podataka na koju se povezujete. Ovaj program uvozi svoje podatke o vezi iz datoteke pod nazivom dbConfig. Stoga izradite tu datoteku i dodajte joj sljedeći kod:
modul.izvoz = {
korisnik: "postgres",
host: "localhost",
baza podataka: "nodeapp",
lozinka: "vaša lozinka",
luka: 5432,
};
Stvorite pomoćne funkcije baze podataka
Uvijek je dobra praksa koristiti pojedinačne funkcije za interakciju s bazom podataka. Olakšavaju pisanje jediničnih testova i poboljšavaju ponovnu upotrebu. Za krajnju točku prijave trebate izraditi dvije funkcije:
- Za provjeru je li email već registriran.
- Za stvaranje korisnika.
Cilj je registrirati samo korisnika ako ne postoji u bazi podataka.
Napravite novu datoteku pod nazivom pomagač.js i uvezite klijent baze podataka iz db.js:
konst klijent = zahtijevati("./db.js")
Zatim dodajte novu funkciju pod nazivom emailExists():
konst emailPostoji = asinkroni (e-pošta) => {
konst podaci = čekati client.query("SELECT * FROM korisnici WHERE email=$1", [
email,
]);
ako (data.rowCount == 0) povrataklažno;
povratak data.rows[0];
};
Ova funkcija uzima e-poštu i provjerava je li već u upotrebi. To čini pomoću klauzule SELECT koja vraća redak koji ima polje e-pošte koje odgovara vrijednosti koju je dao korisnik koji se registrirao. Ako email ne postoji, vraća se false.
Da biste stvorili funkciju koja stvara korisnika, dodajte funkciju pod nazivom createUser() u helper.js:
konst createUser = asinkroni (e-mail, lozinka) => {
konst sol = čekati bcrypt.genSalt(10);
konst hash = čekati bcrypt.hash (lozinka, sol);konst podaci = čekati klijent.upit(
"INSERT INTO korisnici (e-mail, lozinka) VRIJEDNOSTI ($1, $2) VRAĆANJE ID-a, e-pošte, lozinke",
[e-mail, hash]
);
ako (data.rowCount == 0) povrataklažno;
povratak data.rows[0];
};
Ova funkcija uzima vrijednosti e-pošte i lozinke. Koristi klauzulu INSERT za stvaranje novog retka s ovim detaljima i ako je uspješan vraća novostvorenog korisnika. Imajte na umu da biste prije pohranjivanja lozinke trebali hashirajte ga koristeći bcrypt. Nikada nije dobra ideja pohranjivati lozinke kao običan tekst. Kad bi hakeri dobili pristup vašoj korisničkoj bazi podataka, mogli bi lako pristupiti osjetljivim informacijama.
Instalirajte bcryptj da biste ga počeli koristiti:
npm instalirajte bcryptjs
U helper.js uvezite bcryptjs:
konst bcrypt = zahtijevati("bcryptjs")
Korištenjem Bcryptjs-a baza podataka pohranjuje samo šifriranu lozinku. Stoga ćete tijekom prijave morati usporediti običan tekst lozinke koju je dao korisnik i hashirane lozinke u bazi podataka. Za to možete koristiti metodu usporedbe koju nudi Bcryptjs.
Napravite funkciju pod nazivom matchPassword():
konst matchPassword = asinkroni (lozinka, hashPassword) => {
konst utakmica = čekati bcrypt.compare (lozinka, hashPassword);
povratak odgovarati
};
Prima običnu zaporku i hash, a zatim koristi Bcrypt.compare() da utvrdi je li navedena lozinka točna. Ako jest, vraća true, inače vraća false.
Ovo su sve funkcije koje ćemo koristiti za interakciju s bazom podataka. Pazite da ih sve izvezete na kraju:
modul.exports = { emailPostoji, createUser, matchPassword};
Konfigurirajte putovnicu
Passport je središnji softver za provjeru autentičnosti čvora koji pruža više od 500 strategija za provjeru autentičnosti kao što su prijava putem društvenih mreža, JSON web tokeni (JWT) i provjera autentičnosti e-pošte. Koristit ćemo potonje što pruža lokalna strategija putovnice.
Upotrijebite sljedeću naredbu da instalirate passport i passport-local:
npm instalirati putovnicu
npm instalirajte pasoš-lokal
Zatim konfigurirajte Passport za prijavu postojećih korisnika i registraciju novih korisnika.
Započnite stvaranjem nove datoteke passportConfig.js. Zatim uvezite lokalnu strategiju Passport i pomoćne funkcije baze podataka koje ste upravo stvorili:
konst Lokalna strategija = zahtijevati("putovnica-lokalna");
konst { emailPostoji, createUser, matchPassword} = zahtijevati("./pomagač");
U istoj datoteci dodajte sljedeće za postavljanje prijave korisnika:
modul.exports = (putovnica) => {
putovnica.use(
"lokalna prijava",
novi LocalStrategy(
{
korisničko imePolje: "e-pošta",
passwordField: "lozinka",
},
asinkroni (e-pošta, lozinka, gotovo) => {
probati {
konst korisnikPostoji = čekati emailPostoji (e-mail)ako (korisnikPostoji) {
povratak gotovo(ništavan, lažno);
}
konst korisnik = čekati createUser (e-mail, lozinka);
povratak gotovo(ništavan, korisnik);
} ulov (pogreška) {
učinjeno (greška);
}
}
)
);
}
Budući da pasport-local očekuje korisničko ime i lozinku, a vi koristite e-poštu, postavite polje za korisničko ime na e-poštu. Korisnik, odnosno frontend dio ove aplikacije će poslati e-poštu i lozinku u tijelu zahtjeva. Međutim, ne morate sami izdvajati vrijednosti jer će Passport to riješiti u pozadini.
Ovaj program prvo provjerava je li email već zauzet pomoću funkcije emailExists() iz helper.js. Ako e-pošta ne postoji u bazi podataka, kreira se novi korisnik pomoću funkcije createUser(). Konačno, vraća korisnički objekt.
Za prijavu korisnika dodajte sljedeće u passportConfig.js:
modul.exports = (putovnica) => {
putovnica.use(
"lokalna prijava",
novi LocalStrategy(
// prijavite se
)
);
putovnica.use(
"lokalna-prijava",
novi LocalStrategy(
{
korisničko imePolje: "e-pošta",
passwordField: "lozinka",
},
asinkroni (e-pošta, lozinka, gotovo) => {
probati {
konst korisnik = čekati emailPostoji (e-mail);
ako (!korisnik) povratak gotovo(ništavan, lažno);
konst isMatch = čekati matchPassword (lozinka, korisnička.lozinka);
ako (!isMatch) povratak gotovo(ništavan, lažno);
povratak gotovo(ništavan, {iskaznica: user.id, elektronička pošta: user.email});
} ulov (pogreška) {
povratak gotovo (greška, lažno);
}
}
)
);
};
Ovdje program prvo provjerava je li email registriran. Ako nije, vraća false. Ako pronađe email, uspoređuje svoju lozinku s onom iz zahtjeva. Ako se lozinke podudaraju, prijavljuje se korisnik i vraća korisnički objekt.
Posljednji je korak stvaranje krajnjih točaka API-ja:
- POST /auth/signup
- POST /auth/login
Obje ove krajnje točke primit će e-poštu i lozinku u tijelu zahtjeva. Također će uključivati funkcije srednjeg softvera za provjeru autentičnosti putovnice koje smo upravo konfigurirali.
Uvezite i postavite Passport u novoj datoteci pod nazivom server.js:
konst putovnica = zahtijevati("putovnica");
zahtijevati("./passportConfig")(putovnica);
Zatim dodajte sljedeće rute:
app.post(
"/auth/prijava",
passport.authenticate("local-signup", { sjednica: lažno }),
(req, res, next) => {
res.json({
korisnik: req.user,
});
}
);
app.post(
"/auth/prijaviti se",
passport.authenticate("local-login", { sjednica: lažno }),
(req, res, next) => {
res.json({ korisnik: req.user });
}
);
Obje ove rute vraćaju JSON objekt koji sadrži korisnika ako su uspješne.
Provjerite svoj API pomoću testova jedinica
Putovnicu možete koristiti za provjeru autentičnosti Node aplikacije pomoću PostgreSQL aplikacije. Stvorili ste API krajnje točke za registraciju i prijavu korisnika.
Iako možete koristiti REST klijente poput Postmana da testirate koliko dobro API radi, pisanje jediničnih testova puno je jednostavnije. Jedinični testovi omogućuju vam testiranje pojedinačnih dijelova vaše aplikacije. Na ovaj način, čak i ako krajnja točka zakaže, možete odrediti točnu točku kvara. Jedan od alata koji možete koristiti za testiranje Node aplikacija je Jest.