Kot razvijalec ste odgovorni za zaščito podatkov svojih uporabnikov s preverjanjem pristnosti. Passport.js lahko uporabite za preverjanje pristnosti uporabnikov v aplikaciji Node in Postgres.

Začnite z ustvarjanjem strežnika Node s končnimi točkami za registracijo, prijavo in odjavo uporabnikov. Dovolite lahko, da Passport obravnava preverjanje pristnosti in tako omeji nepooblaščen dostop do vaše aplikacije.

Ustvarjanje tabele uporabnikov

Za avtentikacijo uporabnika boste uporabili e-pošto in geslo. To pomeni, da mora tabela uporabnikov vsebovati polje za e-pošto in geslo. V ukaznem pozivu psql ustvarite novo zbirko podatkov z imenom nodeapp:

USTVARJANJEBAZA PODATKOV nodeapp;

Nato ustvarite tabelo za shranjevanje uporabnikov:

USTVARJANJETABELAuporabniki (
id INT GENERIRAN VEDNO KOT IDENTITETNI PRIMARNI KLJUČ,
e-pošta CHAR(128),
geslo CHAR(60)
);

Ta koda bo ustvarila novo tabelo, ki bo vsebovala e-pošto, geslo in samodejno ustvarjeno ID polje.

Ustvarjanje strežnika vozlišča

Node.js je strežniško izvajalno okolje JavaScript, ki nam omogoča hitro ustvarjanje strežnikov HTTP. Za poenostavitev postopka ustvarjanja strežnika in različnih poti HTTP lahko uporabite

instagram viewer
Express, spletno ogrodje Node.js.

Zaženite ta ukaz, da ustvarite novo mapo z imenom postgres-auth:

mkdir postgres-avt

Nato inicializirajte npm:

npm init -y

Nazadnje namestite Express:

npm install express

Zdaj lahko ustvarite spletni strežnik Node.

V novi datoteki, imenovani index.js, dodajte naslednje:

konst izraziti = zahtevati("hitro");
konst app = express();
app.use (express.json());
app.use (express.urlencoded({ podaljšan: prav }));
app.listen(3000, () => konzola.log("Poslušanje na vratih 3000"));

Zagon te kode bo zagnal strežnik in v konzolo zabeležil naslednje:

Poslušanje na vratih 3000

Povezovanje s PostgreSQL

Za povežite se s PostgreSQL uporaba vozlišče-postgres. node-postgres je povezovalni gonilnik, ki zagotavlja vmesnik med Node in Postgres.

Za namestitev node-postrges prek npm izvedite naslednje:

npm namestite str

Ko namestite to knjižnico, ustvarite novo datoteko z imenom db.js in ga povežite z bazo podatkov:

konst {Odjemalec} = zahtevati("str");
konst { uporabnik, gostitelj, baza podatkov, geslo, vrata } = zahtevati("./dbConfig");

konst stranka = novo Odjemalec ({
uporabnik,
gostitelj,
baza podatkov,
geslo,
pristanišče,
});

client.connect();
modul.exports = stranka;

Metoda odjemalca iz node-postgres vzame podrobnosti baze podatkov, s katero se povezujete. Ta program uvozi podrobnosti svoje povezave iz datoteke, imenovane dbConfig. Zato ustvarite to datoteko in ji dodajte naslednjo kodo:

modul.exports = {
uporabnik: "postgres",
gostitelj: "localhost",
zbirka podatkov: "nodeapp",
geslo: "vaše geslo",
pristanišče: 5432,
};

Ustvarite pomožne funkcije baze podatkov

Vedno je dobra praksa, da uporabite posamezne funkcije za interakcijo z bazo podatkov. Omogočajo preprosto pisanje testov enot in izboljšajo možnost ponovne uporabe. Za končno točko prijave morate ustvariti dve funkciji:

  1. Če želite preveriti, ali je e-pošta že registrirana.
  2. Če želite ustvariti uporabnika.

Cilj je registrirati samo uporabnika, če ne obstaja v bazi podatkov.

Ustvari novo datoteko z imenom helper.js in uvozite odjemalca baze podatkov iz db.js:

konst stranka = zahtevati("./db.js")

Nato dodajte novo funkcijo, imenovano emailExists():

konst emailExists = asinh (e-pošta) => {
konst podatki = čakati client.query("SELECT * FROM uporabnikov WHERE email=$1", [
E-naslov,
]);

če (data.rowCount == 0) vrnitevlažno;
vrnitev data.rows[0];
};

Ta funkcija sprejme e-pošto in preveri, ali je že v uporabi. To stori z uporabo klavzule SELECT, ki vrne vrstico z e-poštnim poljem, ki se ujema z vrednostjo, ki jo je navedel uporabnik, ki se registrira. Če e-pošta ne obstaja, vrne false.

Če želite ustvariti funkcijo, ki ustvari uporabnika, dodajte funkcijo z imenom createUser() v helper.js:

konst createUser = asinh (e-pošta, geslo) => {
konst sol = čakati bcrypt.genSalt(10);
konst hash = čakati bcrypt.hash (geslo, sol);

konst podatki = čakati client.query(
»VSTAVITE V uporabnike (e-pošta, geslo) VREDNOSTI ($1, $2) VRAČANJE ID-ja, e-pošte, gesla",
[e-pošta, hash]
);

če (data.rowCount == 0) vrnitevlažno;
vrnitev data.rows[0];
};

Ta funkcija sprejme vrednosti e-pošte in gesla. Uporablja klavzulo INSERT za ustvarjanje nove vrstice s temi podrobnostmi in, če je uspešna, vrne novo ustvarjenega uporabnika. Upoštevajte, da morate pred shranjevanjem gesla zgostite z uporabo bcrypt. Nikoli ni dobra ideja shranjevati gesel kot golo besedilo. Če bi hekerji dobili dostop do vaše podatkovne baze uporabnikov, bi zlahka dostopali do občutljivih informacij.

Namestite bcryptj, da ga začnete uporabljati:

npm namestite bcryptjs

V helper.js uvozite bcryptjs:

konst bcrypt = zahtevati("bcryptjs")

Z uporabo Bcryptjs baza podatkov shrani samo šifrirano geslo. Zato boste morali med prijavo primerjati golo besedilno geslo, ki ga je dal uporabnik, in zgoščeno geslo v bazi podatkov. Za to lahko uporabite metodo primerjave, ki jo ponuja Bcryptjs.

Ustvarite funkcijo z imenom matchPassword():

konst matchPassword = asinh (geslo, hashPassword) => {
konst tekma = čakati bcrypt.compare (geslo, hashPassword);
vrnitev tekma
};

Prejme navadno geslo in zgoščeno vrednost ter nato uporabi Bcrypt.compare(), da ugotovi, ali je podano geslo pravilno. Če je, vrne true, sicer pa vrne false.

To so vse funkcije, ki jih bomo uporabili za interakcijo z bazo podatkov. Ne pozabite izvoziti vseh na koncu:

modul.exports = { emailExists, createUser, matchPassword };

Konfigurirajte potni list

Passport je vmesna programska oprema za preverjanje pristnosti vozlišča, ki ponuja več kot 500 strategij preverjanja pristnosti, kot so prijava v socialna omrežja, spletni žetoni JSON (JWT) in preverjanje pristnosti e-pošte. Uporabili bomo slednje, kar zagotavlja lokalna strategija potnega lista.

Za namestitev passport in passport-local uporabite naslednji ukaz:

potni list za namestitev npm
npm namestite passport-local

Nato konfigurirajte Passport za prijavo obstoječih uporabnikov in registracijo novih uporabnikov.

Začnite z ustvarjanjem nove datoteke passportConfig.js. Nato uvozite lokalno strategijo Passport in pomožne funkcije baze podatkov, ki ste jih pravkar ustvarili:

konst Lokalna strategija = zahtevati("potni list-lokalni");
konst { emailExists, createUser, matchPassword } = zahtevati("./pomočnik");

V isto datoteko dodajte naslednje za nastavitev prijave uporabnika:

modul.exports = (potni list) => {
passport.use(
"lokalna-prijava",
novo LocalStrategy(
{
uporabniško imePolje: "e-pošta",
passwordField: "geslo",
},
asinh (e-pošta, geslo, končano) => {
poskusi {
konst uporabnikObstaja = čakati emailExists (e-mail)

če (uporabnikObstaja) {
vrnitev Končano(nič, lažno);
}

konst uporabnik = čakati createUser (e-pošta, geslo);
vrnitev Končano(nič, uporabnik);
} ulov (napaka) {
narejeno (napaka);
}
}
)
);
}

Ker passport-local pričakuje uporabniško ime in geslo, vi pa uporabljate e-pošto, nastavite polje uporabniškega imena na e-pošto. Uporabnik oziroma čelni del te aplikacije bo poslal e-pošto in geslo v telesu zahteve. Vendar vam vrednosti ni treba ekstrahirati sami, saj bo Passport to obravnaval v ozadju.

Ta program najprej preveri, ali je e-poštno sporočilo že zasedeno s funkcijo emailExists() iz helper.js. Če e-poštno sporočilo ne obstaja v bazi podatkov, ustvari novega uporabnika s funkcijo createUser(). Na koncu vrne uporabniški objekt.

Za prijavo uporabnikov v passportConfig.js dodajte naslednje:

modul.exports = (potni list) => {
passport.use(
"lokalna-prijava",
novo LocalStrategy(
// prijavite se
)
);
passport.use(
"lokalna prijava",
novo LocalStrategy(
{
uporabniško imePolje: "e-pošta",
passwordField: "geslo",
},
asinh (e-pošta, geslo, končano) => {
poskusi {
konst uporabnik = čakati emailExists (e-pošta);
če (!uporabnik) vrnitev Končano(nič, lažno);
konst isMatch = čakati matchPassword (geslo, uporabnik.geslo);
če (!isMatch) vrnitev Končano(nič, lažno);
vrnitev Končano(nič, {id: Uporabniško ime, E-naslov: user.email});
} ulov (napaka) {
vrnitev narejeno (napaka, lažno);
}
}
)
);
};

Tukaj program najprej preveri, ali je email registriran. Če ne, vrne false. Če najde e-pošto, primerja svoje geslo s tistim iz zahteve. Če se gesli ujemata, prijavi uporabnika in vrne uporabniški objekt.

Zadnji korak je ustvarjanje končnih točk API-ja:

  • POST /auth/signup
  • POST /auth/login

Obe končni točki bosta prejeli e-pošto in geslo v telesu zahteve. Vključevale bodo tudi funkcije vmesne programske opreme za preverjanje pristnosti potnih listov, ki smo jih pravkar konfigurirali.

Uvozite in nastavite Passport v novi datoteki z imenom server.js:

konst potni list = zahtevati("potni list");
zahtevati("./passportConfig")(potni list);

Nato dodajte naslednje poti:

app.post(
"/auth/prijava",
passport.authenticate("local-signup", { sejo: lažno }),
(req, res, next) => {
res.json({
uporabnik: req.user,
});
}
);
app.post(
"/auth/Vpiši se",
passport.authenticate("lokalna-prijava", { sejo: lažno }),
(req, res, next) => {
res.json({ uporabnik: req.user });
}
);

Obe poti, če sta uspešni, vrneta objekt JSON, ki vsebuje uporabnika.

Preverite svoj API z uporabo testov enot

Passport lahko uporabite za preverjanje pristnosti aplikacije Node z uporabo aplikacije PostgreSQL. Ustvarili ste končne točke API za prijavo in prijavo uporabnikov.

Medtem ko lahko uporabite odjemalce REST, kot je Postman, da preizkusite, kako dobro deluje API, je pisanje testov enot veliko preprostejše. Preskusi enote vam omogočajo, da preizkusite posamezne dele vaše aplikacije. Na ta način, tudi če končna točka odpove, lahko natančno določite točko odpovedi. Eno od orodij, ki jih lahko uporabite za testiranje aplikacij Node, je Jest.