Jūs, kaip kūrėjas, esate atsakingi už naudotojų duomenų apsaugą naudojant autentifikavimą. Galite naudoti Passport.js, kad patvirtintumėte vartotojus „Node“ ir „Postgres“ programoje.
Pradėkite kurdami mazgo serverį su galiniais taškais, skirtus vartotojams registruoti, prisijungti ir atsijungti. Galite leisti Passport atlikti autentifikavimą, kad apribotumėte neteisėtą prieigą prie jūsų programos.
Vartotojų lentelės kūrimas
Vartotojo autentifikavimui naudosite el. pašto adresą ir slaptažodį. Tai reiškia, kad vartotojų lentelėje turi būti el. pašto adresas ir slaptažodžio laukas. Psql komandų eilutėje sukurkite naują duomenų bazę pavadinimu nodeapp:
KURTIDUOMENŲ BAZĖ nodeapp;
Tada sukurkite lentelę, kurioje saugomi vartotojai:
KURTILENTELĖvartotojų (
ID INT VISADA KURIAMAS KAIP PAGRINDINIS TAPATYBĖS RAKTAS,
paštas CHAR(128),
slaptažodis CHAR(60)
);
Šis kodas sukurs naują lentelę su el. pašto adresu, slaptažodžiu ir automatiškai sugeneruotu ID lauku.
Mazgo serverio kūrimas
Node.js yra serverio pusės JavaScript vykdymo aplinka, leidžianti greitai sukurti HTTP serverius. Norėdami supaprastinti serverio ir skirtingų HTTP maršrutų kūrimo procesą, galite naudoti
Express, Node.js žiniatinklio sistema.Vykdykite šią komandą, kad sukurtumėte naują aplanką, pavadintą postgres-auth:
mkdir postgres-auth
Tada inicijuokite npm:
npm init -y
Galiausiai įdiekite Express:
npm install express
Dabar galite sukurti „Node“ žiniatinklio serverį.
Naujame faile pavadinimu index.js, pridėkite:
konst išreikšti = reikalauti(„išreikšti“);
konst programa = express ();
app.use (express.json());
app.use (express.urlencoded({ pratęstas: tiesa }));
app.listen(3000, () => konsolė.log("Klausymas per prievadą 3000"));
Vykdant šį kodą bus paleistas serveris ir konsolėje bus užregistruota ši informacija:
Klausymas per prievadą 3000
Prisijungimas prie PostgreSQL
Į prisijungti prie PostgreSQL naudoti mazgas-postgres. node-postgres yra ryšio tvarkyklė, suteikianti sąsają tarp Node ir Postgres.
Norėdami įdiegti node-postrges per npm, atlikite šiuos veiksmus:
npm įdiegti pg
Įdiegę tą biblioteką sukurkite naują failą pavadinimu db.js ir prijunkite prie duomenų bazės:
konst {Klientas} = reikalauti("pg");
konst { vartotojas, priegloba, duomenų bazė, slaptažodis, prievadas} = reikalauti(./dbConfig");konst klientas = naujas Klientas ({
Vartotojas,
šeimininkas,
duomenų bazė,
Slaptažodis,
uostas,
});
client.connect();
modulis.exports = klientas;
Kliento metodas iš node-postgres paima duomenis apie duomenų bazę, prie kurios jungiatės. Ši programa importuoja savo ryšio duomenis iš failo, vadinamo dbConfig. Todėl sukurkite tą failą ir pridėkite prie jo šį kodą:
modulis.exports = {
vartotojas: "postgres",
šeimininkas: "localhost",
duomenų bazė: "nodeapp",
slaptažodis: „jūsų slaptažodis“,
prievadas: 5432,
};
Sukurkite duomenų bazės pagalbininko funkcijas
Visada gera praktika naudoti atskiras funkcijas sąveikaujant su duomenų baze. Jie palengvina vienetų testų rašymą ir pagerina pakartotinį naudojimą. Registracijos galutiniam taškui turite sukurti dvi funkcijas:
- Norėdami patikrinti, ar el. paštas jau užregistruotas.
- Norėdami sukurti vartotoją.
Tikslas yra registruoti vartotoją tik tuo atveju, jei jo nėra duomenų bazėje.
Sukurkite naują failą pavadinimu pagalbininkas.js ir importuoti duomenų bazės klientą iš db.js:
konst klientas = reikalauti(./db.js")
Tada pridėkite naują funkciją, pavadintą emailExists():
konst emailExists = async (el. paštas) => {
konst duomenys = laukti client.query("SELECT * FROM vartotojų WHERE email=$1", [
paštas,
]);
jeigu (data.rowCount == 0) grąžintiklaidinga;
grąžinti data.rows[0];
};
Ši funkcija paima el. laišką ir patikrina, ar ji jau naudojama. Tai atliekama naudojant SELECT sąlygą, kuri grąžina eilutę, kurioje yra el. pašto laukas, atitinkantis registruojančio vartotojo pateiktą reikšmę. Jei el. pašto adreso nėra, jis grąžina klaidingą informaciją.
Norėdami sukurti funkciją, kuri sukuria vartotoją, į helper.js pridėkite funkciją, vadinamą createUser().
konst CreateUser = async (el. paštas, slaptažodis) => {
konst druska = laukti bcrypt.genSalt(10);
konst maiša = laukti bcrypt.hash (slaptažodis, druska);konst duomenys = laukti client.query(
"INSERT INTO vartotojai (el. paštas, slaptažodis) VERTYBĖS ($1, $2) GRĄŽINANT ID, el. paštą, slaptažodį",
[el. paštas, maiša]
);
jeigu (data.rowCount == 0) grąžintiklaidinga;
grąžinti data.rows[0];
};
Ši funkcija paima el. pašto ir slaptažodžio reikšmes. Jis naudoja sąlygą INSERT, kad sukurtų naują eilutę su šia informacija ir, jei sėkmingai, grąžintų naujai sukurtą vartotoją. Atminkite, kad prieš išsaugodami slaptažodį turėtumėte maišą naudodami bcrypt. Niekada nėra gera idėja saugoti slaptažodžius kaip paprastą tekstą. Jei įsilaužėliai gautų prieigą prie jūsų vartotojų duomenų bazės, jie galėtų lengvai pasiekti neskelbtiną informaciją.
Įdiekite bcryptjs, kad pradėtumėte jį naudoti:
npm įdiegti bcryptjs
Į helper.js importuokite bcryptjs:
konst bcrypt = reikalauti(„bcryptjs“)
Naudojant Bcryptjs, duomenų bazėje saugomas tik užšifruotas slaptažodis. Todėl prisijungimo metu turėsite palyginti vartotojo pateiktą paprasto teksto slaptažodį ir duomenų bazėje sumaišytą slaptažodį. Tam galite naudoti Bcryptjs pateiktą palyginimo metodą.
Sukurkite funkciją, vadinamą matchPassword():
konst matchPassword = async (slaptažodis, hashPassword) => {
konst rungtynės = laukti bcrypt.compare (slaptažodis, hashPassword);
grąžinti rungtynės
};
Jis gauna paprastą slaptažodį ir maišą, o tada naudoja Bcrypt.compare(), kad nustatytų, ar pateiktas slaptažodis yra teisingas. Jei taip, jis grąžina teisingą priešingu atveju, grąžina klaidingą.
Tai visos funkcijos, kurias naudosime bendraudami su duomenų baze. Pabaigoje būtinai eksportuokite juos visus:
modulis.exports = { emailExists, createUser, matchPassword };
Konfigūruoti pasą
Passport yra tarpinė mazgo autentifikavimo programinė įranga, teikianti daugiau nei 500 autentifikavimo strategijų, tokių kaip socialinis prisijungimas, JSON žiniatinklio prieigos raktai (JWT) ir el. pašto autentifikavimas. Mes naudosime pastarąjį, kurį numato paso vietinė strategija.
Norėdami įdiegti pasą ir paso vietinį, naudokite šią komandą:
npm įdiegti pasą
npm įdiegti pasą vietinis
Tada sukonfigūruokite Passport, kad prisijungtumėte prie esamų vartotojų ir registruotumėte naujus vartotojus.
Pradėkite kurdami naują failą passConfig.js. Tada importuokite vietinę Passport strategiją ir ką tik sukurtas duomenų bazės pagalbinės priemonės funkcijas:
konst Vietinė strategija = reikalauti(„pasas-vietinis“);
konst { emailExists, createUser, matchPassword } = reikalauti(./pagalbininkas");
Tame pačiame faile pridėkite šiuos dalykus, kad nustatytumėte vartotojo registraciją:
modulis.exports = (pasas) => {
pass.use(
„vietinė registracija“,
naujas LocalStrategy(
{
vartotojo vardasLaukas: "email",
slaptažodžio laukas: "slaptažodis",
},
async (el. paštas, slaptažodis, padaryta) => {
bandyti {
konst userExists = laukti emailExists (el. paštas)jeigu (vartotojo egzistuoja) {
grąžinti padaryta(nulinis, klaidinga);
}
konst vartotojas = laukti CreateUser (el. paštas, slaptažodis);
grąžinti padaryta(nulinis, Vartotojas);
} sugauti (klaida) {
padaryta (klaida);
}
}
)
);
}
Kadangi vietinis pasas reikalauja vartotojo vardo ir slaptažodžio, o jūs naudojate el. paštą, naudotojo vardo lauke nustatykite el. pašto adresą. Vartotojas arba šios programos priekinė dalis atsiųs el. laišką ir slaptažodį užklausos turinyje. Tačiau jums nereikia patiems išgauti verčių, nes „Passport“ tai tvarkys fone.
Ši programa pirmiausia patikrina, ar el. laiškas jau paimtas naudojant funkciją emailExists() iš helper.js. Jei el. pašto duomenų bazėje nėra, jis sukuria naują vartotoją su funkcija createUser(). Galiausiai jis grąžina vartotojo objektą.
Norėdami prisijungti prie naudotojų, passportConfig.js pridėkite:
modulis.exports = (pasas) => {
pass.use(
„vietinė registracija“,
naujas LocalStrategy(
// Registruotis
)
);
pass.use(
„vietinis prisijungimas“,
naujas LocalStrategy(
{
vartotojo vardasLaukas: "email",
slaptažodžio laukas: "slaptažodis",
},
async (el. paštas, slaptažodis, padaryta) => {
bandyti {
konst vartotojas = laukti emailExists (el. paštas);
jeigu (!Vartotojas) grąžinti padaryta(nulinis, klaidinga);
konst isMatch = laukti matchPassword (password, user.password);
jeigu (!isMatch) grąžinti padaryta(nulinis, klaidinga);
grąžinti padaryta(nulinis, {id: Vartotojo ID, paštu: user.email});
} sugauti (klaida) {
grąžinti padaryta (klaida, klaidinga);
}
}
)
);
};
Čia programa pirmiausia patikrina, ar el. laiškas užregistruotas. Jei ne, grąžinama klaidinga. Jei randa el. laišką, jis lygina savo slaptažodį su užklausoje esančiu slaptažodžiu. Jei slaptažodžiai sutampa, jis prisijungia prie vartotojo ir grąžina vartotojo objektą.
Paskutinis žingsnis yra sukurti API galinius taškus:
- POST /auth/signup
- POST /auth/login
Abu šie galiniai taškai gaus el. laišką ir slaptažodį užklausos turinyje. Jie taip pat apims paso autentifikavimo tarpinės programinės įrangos funkcijas, kurias ką tik sukonfigūravome.
Importuokite ir nustatykite Passport naujame faile pavadinimu server.js:
konst pasas = reikalauti(„pasas“);
reikalauti(./passportConfig")(pasas);
Tada pridėkite šiuos maršrutus:
app.post(
"/auth/Registruotis",
passport.authenticate("local-signup", { sesija: klaidinga }),
(req, res, next) => {
res.json({
vartotojas: req.user,
});
}
);
app.post(
"/auth/Prisijungti",
passport.authenticate("local-login", { sesija: klaidinga }),
(req, res, next) => {
res.json({ Vartotojas: req.user });
}
);
Jei pavyks, abu šie maršrutai grąžina JSON objektą, kuriame yra vartotojas.
Patikrinkite savo API naudodami vienetų testus
Galite naudoti Passport, norėdami autentifikuoti Node programą naudodami PostgreSQL programą. Sukūrėte API galinius taškus, kad galėtumėte prisiregistruoti ir prisijungti naudotojams.
Nors galite naudoti REST klientus, tokius kaip Postman, norėdami patikrinti, kaip gerai veikia API, vienetų testų rašymas yra daug paprastesnis. Vienetiniai testai leidžia išbandyti atskiras programos dalis. Tokiu būdu, net jei galutinis taškas nepavyksta, galite tiksliai nustatyti gedimo vietą. Vienas iš įrankių, kurį galite naudoti norėdami išbandyti „Node“ programas, yra „Jest“.