Autentifikacija korisnika je proces provjere identiteta korisnika koji pokušava dobiti pristup vašoj aplikaciji. Uključuje autorizaciju i prijenos vjerodajnica za potvrdu autentičnosti korisnika.

Možete implementirati jednostavan model autentifikacije korisnika u Node.js koristeći Express, Bcrypt i MongoDB, u samo nekoliko koraka.

Korak 1: Postavljanje razvojnog okruženja

Prvo stvorite mapu projekta i CD u njega tako što ćete pokrenuti:

mkdir provjera autentičnosti korisnika
CD provjera autentičnosti korisnika

Zatim inicijalizirajte npm u direktoriju vašeg projekta pokretanjem:

npm init -y

The -y zastavica inicijalizira npm i stvara vaš paket.json datoteka sa svim zadanim postavkama.

Ovaj model provjere autentičnosti korisnika zahtijeva nekoliko ovisnosti.

Oni uključuju:

  • Izraziti: Express je okvir Node.js koji pruža robustan skup značajki za web i mobilne aplikacije. Olakšava izradu pozadinskih aplikacija s Node.js.
  • Bcrypt: bcrypt je npm paket koji implementira bcrypt funkciju raspršivanja zaporke. Omogućuje vam stvaranje hashova iz običnih nizova zaporki.
  • Mongoose: Mongoose je biblioteka za modeliranje podataka objekata MongoDB. Pojednostavljuje interakciju između vaše aplikacije i MongoDB baze podataka.
  • dotenv: dotenv je paket bez ovisnosti koji učitava varijable okoline iz a .env datoteku u proces.env.
  • Validator: validator je paket koji sadrži različite funkcije provjere valjanosti niza.
  • Body-parser: Paket body-parser analizira tijela zahtjeva u međuprogramu prije vaših rukovatelja.

Instalirajte pakete pokretanjem:

npm instalirati express bcrypt mongoose dotenv validator tijelo-parser

Zatim izradite app.js datoteku u korijenskom direktoriju vašeg projekta i dodajte blok koda u nastavku da biste stvorili osnovni Express poslužitelj:

// app.js
konst izraziti = zahtijevati('izraziti');
konst app = express();
konst bodyParser = zahtijevati("parser tijela");

konst luka = 3000;

aplikacijakoristiti(bodyParser.json());
aplikacija.koristiti(bodyParser.urlencoded({ proširena: istina }));

app.listen (port, ()=>{
konzola.log(`Aplikacija sluša priključak ${port}`);
});

Ovaj kod stvara ekspresnu instancu aplikacije pozivanjem ekspresne funkcije. Zatim koristi tijelo-parser međuprogram za analizu dolaznih tijela zahtjeva. Zatim počinje osluškivati ​​promet na portu 3000 pozivanjem metode slušanja ekspresne instance i prosljeđivanjem varijable porta kao argumenta.

Korak 2: Povezivanje vaše aplikacije s bazom podataka

U korijenskom direktoriju vašeg projekta stvorite a .env datoteku i u nju pohranite svoje MongoDB vjerodajnice. Time se izbjegava izlaganje vjerodajnica vaše baze podataka u kodu što zlonamjernim korisnicima može dati pristup vašoj bazi podataka.

Zatim idite na svoj app.js datoteka i uvoz mungosa:

konst mungos = zahtijevati("mungos");

Zatim pozovite import dotenv i nazovite konfiguracija metoda na njemu:

zahtijevati ("dotenv").config();

Pozivanje konfiguracija metoda na dotenv učitava varijable okoline u proces.env.

Na kraju pozovite metodu povezivanja mungos i proslijedite svoj MongoDB URI kao argument:

mongoose.connect (process.env. MONGODB_URI).then(() => {
console.log('Povezano s bazom podataka uspješno')
})

Korak 3: Stvaranje korisničkog modela

U korijenskom direktoriju vašeg projekta stvorite "modeli” mapa; ovo je mjesto gdje ćete pohraniti svoj model mungosa:

mkdir modeli

Zatim stvorite "korisničkiModel” i dodajte sljedeće uvoze:

konst mungos = zahtijevati('mungos')
konst { isEmail } = zahtijevati('validator')

jeE-pošta je funkcija provjere valjanosti koja vraća pravi ako je dati niz e-mail. Trebat će vam da primijenite mongoose provjeru valjanosti na svoj korisnički model.

Zatim dodajte sljedeći kod u svoj korisničkiModel datoteka:

// modeli/userModel
konst userSchema = mungos. Shema({
email: {
tip: Niz,
potrebno: [istina, 'Email je obavezan'],
potvrdi: {
validator: isEmail,
poruka: rekviziti => `${props.value} nije važeća e-pošta`
}
},

zaporka: {
tip: Niz,
potrebno: [istina, 'potrebna je lozinka'],
potvrdi: {
validator: funkcija (vrijednost) {
povratak vrijednost.duljina >= 6
},
poruka: () =>'Lozinka mora imati najmanje šest znakova'
}
}
})

modul.izvozi = mongoose.model('Korisnik', korisnička shema)

Gornji kod stvara a korisnička shema varijabla koja pohranjuje vrijednost mungos. Shema metoda. Mungos. Metoda sheme preslikava svojstva u MongoDB kolekciju i definira oblik dokumenata unutar nje. Mungosova shema ima dva svojstva—an elektronička pošta i a zaporka— što će biti vaši zahtjevi za provjeru autentičnosti.

Svojstvo e-pošte je vrste niza i ima potreban postaviti na istinito. Popratna poruka o pogrešci "Potrebna je e-pošta" prikazat će se ako tijelo zahtjeva ne sadrži elektronička pošta vlasništvo. Konačno, korištenjem mongoose prilagođene provjere valjanosti, validator vlasništvo referenes the jeE-pošta funkcija. Ta funkcija vraća true ili false na temelju valjanosti niza kao e-pošte. Tada svojstvo poruke preuzima vrijednost e-pošte (rekviziti) i stvara smislenu poruku o pogrešci.

Svojstvo lozinke obavezna je vrsta niza s porukom o pogrešci koja glasi "Potrebna je lozinka". The validator funkcija je anonimna koja vraća true ako lozinka ima najmanje šest znakova.

Posljednji redak stvara i izvozi mungosov model pozivanjem model metoda na mungos. Proslijedite naziv modela (Korisnik) kao prvi argument i shema (korisnička shema) kao drugi argument.

Korak 4: Implementacija ruta za prijavu i prijavu

U korijenskom direktoriju vašeg projekta stvorite a rute mapa:

mkdir rute

U mapi ruta stvorite a userRoutes.js datoteku i dodajte sljedeće uvoze:

// rute/userRoutes.js
konst izraziti = zahtijevati("izraziti");
konst Korisnik = zahtijevati("../modeli/userModel");
konst bcrypt = zahtijevati("bcrypt");

Stvorite instancu Express Routera pozivom Usmjerivač metoda na izraziti:

konst ruter = express. Usmjerivač();

Zatim stvorite svoj put prijave dodavanjem bloka koda u nastavku u svoj userRoute.js datoteka:

usmjerivač.post("/sign-up", asinkroni (req, res) => {
probati {
// Ekstrakt e-pošte i lozinke iz objekta req.body
konst { email, password } = req.body;

// Čekako e-pošta je već ukoristiti
neka korisnikPostoji = čekati User.findOne({ email });

ako (korisnikPostoji) {
res.status(401).json({ poruka: "E-pošta je već primljena koristiti." });
povratak;
}

// Definirajte solne krugove
konst soli krugovi = 10;

// Hash lozinka
bcrypt.hash (lozinka, saltRounds, (pogreška, hash) => {
ako (greška) bacanjenoviGreška("Interni poslužitelj Greška");

// Stvoriti a novikorisnik
neka korisnik = novi Korisnik({
email,
zaporka: hash,
});

// Spremi korisnika u bazu podataka
korisnik.save().then(() => {
res.json({ poruka: "Korisnik je uspješno kreiran", korisnik });
});
});
} ulov (pogreška) {
povratakres.status(401).poslati(pogriješiti.poruka);
}
});

U gornjem bloku koda prvo ste destrukturirali e-poštu i lozinku iz zahtijevano tijelo objekt. Zatim provjerite koristi li korisnik već e-poštu jer bi ona trebala biti jedinstvena za svakog korisnika. Ako je e-pošta već korištena, vraćate se i zaustavljate izvršavanje koda sa statusnim kodom 401.

Pohranjivanje običnih lozinki u bazu podataka velika je sigurnosna prijetnja jer zlonamjerni hakeri mogu dobiti pristup bazi podataka. Lozinke biste trebali raspršiti prije nego što ih razvrstate u svoju bazu podataka, pa čak i ako ih haker otkrije, ne bi trebalo biti rizika za korisnike. Raspršivanje je proces pretvaranja danog "ključa" u drugu vrijednost. Raspršivanje je jednosmjerna funkcija, što znači da ne možete dohvatiti izvornu vrijednost iz one hased, za razliku od enkripcije.

Koristeći bcrypt, hashirali ste svoju korisničku lozinku pozivanjem hash metode na bcryptu. Metoda raspršivanja uzima tri parametra: niz koji treba raspršiti, solne krugove i funkciju povratnog poziva. Prosljeđujete korisničku lozinku, varijablu saltRounds koju ste ranije stvorili i povratni poziv.

Salt runde se odnose na vrijeme potrebno za izračunavanje jednog bcrypt hasha. Što su veći krugovi soli, to je više krugova miješanja.

Ako hash metoda izbaci pogrešku, izbacit ćete "internu pogrešku poslužitelja". Inače, svojstvo lozinke postavite na uspješan hash i spremite ga u svoju bazu podataka pozivanjem metode spremanja na Korisnik primjer.

Zatim stvorite svoj put prijave dodavanjem bloka koda u nastavku u svoj userRoute.js datoteka:

usmjerivač.post("/sign-in", asinkroni (req, res) => {
probati {
// Ekstrakt e-pošte i lozinke iz objekta req.body
konst { email, password } = req.body;

// Čekakokorisnikpostojiubaza podataka
neka korisnik = čekati User.findOne({ email });

if (!korisnik) {
vrati res.status (401).json({ poruka: "Nevažeće vjerodajnice" });
}

// Usporedi lozinke
bcrypt.compare (lozinka, korisnička.lozinka, (pogreška, rezultat) => {
if (rezultat) {
vrati res.status (200).json({ poruka: "Korisnik se uspješno prijavio" });
}

konzola.log (pogreška);
vrati res.status (401).json({ poruka: "Nevažeće vjerodajnice" });
});
} ulov (pogreška) {
res.status(401).poslati(pogriješiti.poruka);
}
});

modul.izvozi = ruter;

U gornjem bloku koda prvo destrukturirate e-poštu i lozinku iz zahtijevano tijelo objekt. Zatim provjerite postoji li korisnik u vašoj bazi podataka. Ako korisnik ne postoji u vašoj bazi podataka, vraćate se sa statusnim kodom 401.

Zatim, pomoću bcrypt-ove metode usporedbe, proslijedite lozinku koju je dao korisnik i hashiranu lozinku koju ste dohvatili iz vaše baze podataka. Usporedite to dvoje kako biste potvrdili podudaraju li se. Ako se lozinke podudaraju, vraćate statusni kod 200 i poruku o uspješnosti. Inače vraćate statusni kod 401 i poruku o pogrešci.

Na kraju, uvoz ruter u tvoju app.js datoteku i koristite je kao međuprogram na razini aplikacije.

Ovo dovršava vaš model autentifikacije korisnika; sada se korisnici mogu sigurno prijaviti i prijaviti na vašu aplikaciju.

Važnost autentifikacije korisnika

Autentifikacija korisnika osigurava da samo legitimni korisnici mogu dobiti pristup vašoj aplikaciji. Ako su vaši podaci na bilo koji način osobni ili privatni, trebali biste poduzeti korake kako biste spriječili neautorizirane korisnike da dobiju pristup.