Autentificarea utilizatorului este procesul de verificare a identității unui utilizator care încearcă să obțină acces la aplicația dvs. Aceasta implică autorizarea și transferul de acreditări pentru a confirma autenticitatea unui utilizator.
Puteți implementa un model simplu de autentificare a utilizatorului în Node.js folosind Express, Bcrypt și MongoDB, în doar câțiva pași.
Pasul 1: Configurarea mediului de dezvoltare
Mai întâi, creați un folder de proiect și CD în el rulând:
autentificarea utilizatorului mkdir
CD autentificarea utilizatorului
Apoi, inițializați npm în directorul de proiect rulând:
npm init -y
The -y flag inițializează npm și creează dvs pachet.json fișier cu toate valorile implicite.
Acest model de autentificare a utilizatorului necesită câteva dependențe.
Ei includ:
- Expres: Express este un cadru Node.js care oferă un set robust de caracteristici pentru aplicații web și mobile. Face mai ușor să construiți aplicații backend cu Node.js.
- Bcrypt: bcrypt este un pachet npm care implementează funcția de hashing a parolei bcrypt. Vă permite să creați hash-uri din șiruri de parole simple.
- Mongoose: Mongoose este o bibliotecă de modelare a datelor obiect MongoDB. Simplifică interacțiunile dintre aplicația dvs. și o bază de date MongoDB.
- dotenv: dotenv este un pachet cu dependență zero care încarcă variabile de mediu din a .env dosar în proces.env.
- Validator: validator este un pachet care conține diverse funcții de validare a șirurilor.
- Body-parser: Pachetul body-parser analizează corpurile cererii într-un middleware înaintea gestionarilor dumneavoastră.
Instalați pachetele rulând:
npm instalare Express bcrypt mongoose dotenv validator corp-analizator
Apoi, creați un app.js fișier în directorul rădăcină al proiectului și adăugați blocul de cod de mai jos pentru a crea un server Express de bază:
// app.js
const expres = cere('expres');
const aplicație = expres();
const bodyParser = cere(„body-parser”);const port = 3000;
aplicația.utilizare(bodyParser.json());
aplicația.utilizare(bodyParser.urlencoded({ extins: Adevărat }));
app.listen (port, ()=>{
consolă.Buturuga(`Aplicația ascultă pe port ${port}`);
});
Acest cod creează o instanță de aplicație expres prin apelarea funcției expres. Apoi folosește analizor-corp middleware pentru a analiza corpurile de solicitare primite. Apoi începe să asculte traficul pe portul 3000 apelând metoda listen a instanței expres și trecând variabila port ca argument.
Pasul 2: Conectarea aplicației la o bază de date
În directorul rădăcină al proiectului, creați un .env fișier și stocați-vă acreditările MongoDB în el. Acest lucru evită expunerea acreditărilor bazei de date în cod, care poate oferi utilizatorilor rău intenționați acces la baza de date.
Apoi, navigați la dvs app.js fișier și import mangusta:
const mangusta = cere("mangustă");
Apoi, apelați la import dotenv și sună la config metoda pe el:
cere("dotenv").config();
Apelând la config metoda pe dotenv încarcă variabilele de mediu în proces.env.
În cele din urmă, apelați metoda de conectare mangustă și transmiteți URI-ul dvs. MongoDB ca argument:
mangoose.connect (process.env. MONGODB_URI).then(() => {
console.log('Conectat cu succes la baza de date')
})
Pasul 3: Crearea modelului de utilizator
În directorul rădăcină al proiectului, creați un „modele” folder; aici îți vei depozita modelul de mangustă:
modele mkdir
Apoi, creați un „userModel” și adăugați următoarele importuri:
const mangusta = cere('mangustă')
const { isEmail } = cere('validator')
isEmail este o funcție de validare care revine Adevărat dacă un șir dat este un e-mail. Veți avea nevoie de el pentru a aplica validarea mangusta modelului dvs. de utilizator.
Apoi, adăugați următorul cod la dvs userModel fişier:
// modele/userModel
const userSchema = mangusta. Schemă({
e-mail: {
tip: Şir,
necesar: [adevărat, 'E-mailul este obligatoriu'],
valida: {
validator: isEmail,
mesaj: props => `${props.value} nu este un e-mail valid`
}
},parola: {
tip: Şir,
necesar: [adevărat, 'Parola este necesara'],
valida: {
validator: funcţie (valoare) {
întoarcere valoare.lungime >= 6
},
mesaj: () =>'Parola trebuie să aibă cel puțin șase caractere'
}
}
})
modul.exporturi = mongoose.model('Utilizator', userSchema)
Codul de mai sus creează un userSchema variabilă care stochează valoarea lui mangustă. Schemă metodă. Mangusta. Metoda Schema mapează proprietățile unei colecții MongoDB și definește forma documentelor din ea. Schema de mangustă are două proprietăți—un e-mail si a parola— care vor fi cerințele dvs. de autentificare.
Proprietatea e-mail este de tip șir și are necesar setat la adevărat. Mesajul de eroare însoțitor, „E-mail este obligatoriu”, se va afișa dacă corpul unei cereri nu conține un e-mail proprietate. În cele din urmă, folosind validarea personalizată de mangustă, validator proprietate referens the isEmail funcţie. Această funcție returnează adevărat sau fals pe baza validității șirului ca e-mail. Apoi proprietatea mesajului ia valoarea de e-mail (recuzită) și construiește un mesaj de eroare semnificativ.
Proprietatea parolei este un tip de șir obligatoriu cu un mesaj de eroare care spune „Parola este necesară”. The validator funcția este una anonimă care returnează adevărat dacă parola are cel puțin șase caractere.
Linia finală creează și exportă un model de mangustă apelând la model metoda pe mangustă. Transmite numele modelului (Utilizator) ca prim argument și o schemă (userSchema) ca al doilea argument.
Pasul 4: Implementarea rutelor de conectare și înscriere
În directorul rădăcină al proiectului, creați un trasee pliant:
rute mkdir
În folderul rute, creați un userRoutes.js fișier și adăugați următoarele importuri:
// routes/userRoutes.js
const expres = cere("expres");
const Utilizator = cere(""../modele/model utilizator");
const bcrypt = cere("bcrypt");
Creați o instanță Express Router apelând la Router metoda pe expres:
const router = expres. Router();
Apoi, creați-vă ruta de înscriere adăugând blocul de cod de mai jos la dvs userRoute.js fişier:
router.post("/sign-up", asincron (req, res) => {
încerca {
// Extrageți e-mailul și parola din obiectul req.body
const { email, parola } = req.body;// Verificadacă mail-ul este deja înutilizare
lăsa userExists = asteapta User.findOne({ email });if (userExists) {
starea res.(401).json({ mesaj: „E-mailul este deja în utilizare." });
întoarcere;
}// Definiți rondele de sare
const sareRounds = 10;// Hash parola
bcrypt.hash (parolă, saltRounds, (err, hash) => {
dacă (eroare) aruncanouEroare("Server intern Eroare");// Crea A nouutilizator
lăsa utilizator = nou Utilizator({
e-mail,
parola: hash,
});
// Salvați utilizatorul în baza de date
user.save().then(() => {
res.json({ mesaj: "Utilizator creat cu succes", utilizator });
});
});
} captură (eroare) {
întoarcereres.stare(401).trimite(a greșit.mesaj);
}
});
În blocul de cod de mai sus, mai întâi, ați destructurat e-mailul și parola din corp solicitat obiect. Apoi, verificați dacă un utilizator folosește deja e-mailul, deoarece ar trebui să fie unic pentru fiecare utilizator. Dacă e-mailul a fost deja folosit, returnați și opriți executarea codului cu un cod de stare 401.
Stocarea parolelor simple într-o bază de date este o amenințare uriașă de securitate, deoarece hackerii rău intenționați ar putea obține acces la baza de date. Ar trebui să trimiți parolele înainte de a le introduce în baza de date, așa că, chiar dacă un hacker le descoperă, nu ar trebui să existe un risc pentru utilizatori. Hashing este procesul de conversie a unei „chei” date într-o altă valoare. Hashing este o funcție unidirecțională, ceea ce înseamnă că nu puteți prelua valoarea inițială din cea hased, spre deosebire de criptare.
Folosind bcrypt, ai indexat parola dvs. de utilizator apelând metoda hash pe bcrypt. Metoda hash ia trei parametri: șirul care urmează să fie hash, runde de sare și o funcție de apel invers. Transmiteți parola de utilizator, variabila saltRounds pe care ați creat-o mai devreme și un apel invers.
Rundele de sare se referă la timpul necesar pentru a calcula un singur hash bcrypt. Cu cât sunt mai mari runde de sare, cu atât mai multe runde de hashing.
Dacă metoda hash aruncă o eroare, aruncați o „eroare internă de server”. În caz contrar, setați proprietatea parolei la hash-ul de succes și o salvați în baza de date apelând metoda de salvare pe Utilizator instanță.
Apoi, creați-vă ruta de conectare adăugând blocul de cod de mai jos la dvs userRoute.js fişier:
router.post("/sign-in", asincron (req, res) => {
încerca {
// Extrageți e-mailul și parola din obiectul req.body
const { email, parola } = req.body;// VerificadacăutilizatorexistăînBază de date
lăsa utilizator = asteapta User.findOne({ email });dacă (!utilizator) {
return res.status (401).json({ mesaj: "Acreditări nevalide" });
}// Comparați parolele
bcrypt.compare (parolă, utilizator.parolă, (eroare, rezultat) => {
dacă (rezultat) {
returnează res.status (200).json({ mesaj: "Utilizator autentificat cu succes" });
}consolă.log (err);
return res.status (401).json({ mesaj: "Acreditări nevalide" });
});
} captură (eroare) {
res.stare(401).trimite(a greșit.mesaj);
}
});
modul.exporturi = router;
În blocul de cod de mai sus, mai întâi, destructurați e-mailul și parola din corp solicitat obiect. Apoi, verificați dacă există un utilizator în baza de date. Dacă utilizatorul nu există în baza ta de date, revii cu un cod de stare 401.
Apoi, folosind metoda de comparare a bcrypt, introduceți parola furnizată de utilizator și parola hashing pe care ați preluat-o din baza de date. Comparați cele două pentru a confirma dacă se potrivesc. Dacă parolele se potrivesc, returnați un cod de stare 200 și un mesaj de succes. În caz contrar, returnați un cod de stare 401 și un mesaj de eroare.
În sfârșit, import router în tine app.js fișier și utilizați-l ca middleware la nivel de aplicație.
Acest lucru completează modelul dvs. de autentificare a utilizatorului; acum, utilizatorii se pot înscrie în siguranță și se pot conecta la aplicația dvs.
Importanța autentificării utilizatorilor
Autentificarea utilizatorilor asigură că numai utilizatorii legitimi pot obține acces la aplicația dvs. Dacă datele dumneavoastră sunt în vreun fel personale sau private, ar trebui să luați măsuri pentru a preveni accesul utilizatorilor neautentificați.