Autentifikácia používateľa je proces overenia identity používateľa, ktorý sa pokúša získať prístup k vašej aplikácii. Zahŕňa autorizáciu a prenos poverení na potvrdenie pravosti používateľa.

V niekoľkých krokoch môžete implementovať jednoduchý model autentifikácie používateľa v Node.js pomocou Express, Bcrypt a MongoDB.

Krok 1: Nastavenie vývojového prostredia

Najprv vytvorte priečinok projektu a cd do toho spustením:

overenie používateľa mkdir
cd overenie užívateľa

Ďalej inicializujte npm v adresári projektu spustením:

npm init -y

The -y flag inicializuje npm a vytvorí váš package.json súbor so všetkými jeho predvolenými hodnotami.

Tento model autentifikácie používateľa vyžaduje niekoľko závislostí.

Zahŕňajú:

  • Expresné: Express je rámec Node.js ktorý poskytuje robustnú sadu funkcií pre webové a mobilné aplikácie. Uľahčuje vytváranie backendových aplikácií pomocou Node.js.
  • Bcrypt: bcrypt je balík npm, ktorý implementuje funkciu hašovania hesiel bcrypt. Umožňuje vám vytvárať hash z jednoduchých reťazcov hesiel.
  • instagram viewer
  • Mongoose: Mongoose je knižnica modelovania údajov objektov MongoDB. Zjednodušuje interakcie medzi vašou aplikáciou a databázou MongoDB.
  • dotenv: dotenv je balík s nulovou závislosťou, ktorý načítava premenné prostredia z a .env súbor do process.env.
  • Validator: validator je balík, ktorý obsahuje rôzne funkcie na overenie reťazca.
  • Body-parser: Balík body-parser analyzuje telá požiadaviek v middleware pred vašimi obslužnými programami.

Nainštalujte balíky spustením:

npm Inštalácia expresný bcrypt mangoose dotenv validátor telo-analyzátor

Ďalej vytvorte app.js súbor v koreňovom adresári vášho projektu a pridajte blok kódu nižšie, aby ste vytvorili základný expresný server:

// app.js
konšt vyjadriť = vyžadovať('expresné');
konšt app = express();
konšt bodyParser = vyžadovať("analyzátor tela");

konšt prístav = 3000;

aplikácie.použitie(bodyParser.json());
aplikácie.používať(bodyParser.urlencoded({ predĺžený: pravda }));

app.listen (port, ()=>{
konzoly.log(`Aplikácia počúva na porte ${port}`);
});

Tento kód vytvorí expresnú inštanciu aplikácie volaním expresnej funkcie. Potom použije body-parser middleware na analýzu tiel prichádzajúcich požiadaviek. Potom začne načúvať návštevnosti na porte 3000 zavolaním metódy počúvania expresnej inštancie a odovzdaním premennej portu ako argumentu.

Krok 2: Pripojenie vašej aplikácie k databáze

V koreňovom adresári projektu vytvorte a .env súbor a uložte doň svoje poverenia MongoDB. Vyhnete sa tak odhaleniu vašich databázových poverení v kóde, ktorý môže poskytnúť používateľom so zlými úmyslami prístup k vašej databáze.

Ďalej prejdite na svoje app.js súbor a import mongoose:

konšt mangusta = vyžadovať("mangusta");

Potom zavolajte import dotenv a zavolajte na config metóda na to:

vyžadovať ("dotenv").config();

Volanie na config metóda zapnutá dotenv zaťažuje premenné prostredia do process.env.

Nakoniec zavolajte metódu pripojenia on mangusta a odovzdajte svoje MongoDB URI ako argument:

mongoose.connect (process.env. MONGODB_URI).potom(() => {
console.log('Úspešne pripojené k databáze')
})

Krok 3: Vytvorenie modelu používateľa

V koreňovom adresári projektu vytvorte „modelov” priečinok; toto je miesto, kde uložíte svoj model mongoose:

modely mkdir

Ďalej vytvorte „userModel” a pridajte nasledujúce importy:

konšt mangusta = vyžadovať('mangusta')
konšt { isEmail } = vyžadovať('validátor')

isEmail je overovacia funkcia, ktorá vracia pravda ak je daný reťazec e-mail. Budete ho potrebovať na použitie overenia mongoose na váš používateľský model.

Ďalej pridajte nasledujúci kód do svojho userModel súbor:

// models/userModel
konšt userSchema = mongoose. Schéma({
email: {
typ: Reťazec,
požadované: [pravda, 'Vyžaduje sa e-mail'],
potvrdiť: {
validátor: isEmail,
správa: rekvizity => `${props.value} nie je platný e-mail
}
},

heslo: {
typ: Reťazec,
požadované: [pravda, 'Vyžaduje sa heslo'],
potvrdiť: {
validátor: funkciu (hodnotu) {
vrátiť hodnota.dĺžka >= 6
},
správa: () =>'Heslo musí mať aspoň šesť znakov'
}
}
})

modul.exportov = mongoose.model('User', userSchema)

Vyššie uvedený kód vytvára a userSchema premenná, ktorá uchováva hodnotu mangusta. Schéma metóda. Mangusta. Metóda Schema mapuje vlastnosti kolekcie MongoDB a definuje tvar dokumentov v nej. Schéma mongoose má dve vlastnosti — an email a a heslo— aké budú vaše požiadavky na overenie.

Vlastnosť email je typu reťazca a má požadovaný nastaviť na true. Sprievodné chybové hlásenie „Vyžaduje sa e-mail“ sa zobrazí, ak telo požiadavky neobsahuje email nehnuteľnosť. Nakoniec pomocou vlastnej validácie mongoose validátor majetok referuje isEmail funkciu. Táto funkcia vráti hodnotu true alebo false na základe platnosti reťazca ako e-mailu. Potom vlastnosť správy nadobudne hodnotu e-mailu (rekvizity) a vytvorí zmysluplné chybové hlásenie.

Vlastnosť hesla je požadovaný typ reťazca s chybovým hlásením „Vyžaduje sa heslo“. The validátor funkcia je anonymná, ktorá vráti hodnotu true, ak má heslo aspoň šesť znakov.

Posledný riadok vytvorí a exportuje model mongoose volaním Model metóda zapnutá mangusta. Zadajte názov modelu (Používateľ) ako prvý argument a schému (userSchema) ako druhý argument.

Krok 4: Implementácia prihlasovacích a registračných trás

V koreňovom adresári projektu vytvorte a trasy priečinok:

trasy mkdir

V priečinku s trasami vytvorte a userRoutes.js súbor a pridajte nasledujúce importy:

// routes/userRoutes.js
konšt vyjadriť = vyžadovať("expresné");
konšt Používateľ = vyžadovať("../models/userModel");
konšt bcrypt = vyžadovať("bcrypt");

Vytvorte inštanciu expresného smerovača zavolaním na Router metóda zapnutá expresné:

konšt router = expres. Router();

Potom vytvorte cestu registrácie pridaním bloku kódu nižšie do svojho userRoute.js súbor:

router.post("/sign-up", async (req, res) => {
skúste {
// Extrahujte e-mail a heslo z objektu req.body
konšt { email, heslo } = req.body;

// Skontrolujteak e-mail jevpoužitie
nech userExists = čakať User.findOne({ email });

if (userExists) {
res.status(401.json({ message: "E-mail je už zadaný použitie." });
vrátiť;
}

// Definujte soľné okruhy
konšt saltRounds = 10;

// Hash heslo
bcrypt.hash (heslo, saltRounds, (chyba, hash) => {
ak (chyba) hodiťNovýChyba(„Interný server Chyba");

// Vytvorte a Novýužívateľ
nech užívateľ = Nový Používateľ ({
email,
heslo: hash,
});

// Uloženie používateľa do databázy
user.save().potom(() => {
res.json({ správa: "Používateľ bol úspešne vytvorený", používateľ });
});
});
} chytiť (chyba) {
vrátiťres.postavenie(401).odoslať(chybovať.správa);
}
});

Vo vyššie uvedenom bloku kódu ste najskôr deštruktúrovali e-mail a heslo z adresy req.body objekt. Potom skontrolujte, či používateľ už e-mail používa, pretože by mal byť jedinečný pre každého používateľa. Ak už bol e-mail použitý, vrátite sa a zastavíte vykonávanie kódu so stavovým kódom 401.

Ukladanie obyčajných hesiel do databázy je obrovskou bezpečnostnou hrozbou, pretože do databázy môžu získať prístup zlomyseľní hackeri. Heslá by ste mali zahašovať skôr, ako ich zaradíte do databázy, takže aj keď ich hacker objaví, používateľom by nemalo hroziť žiadne riziko. Hašovanie je proces premeny daného „kľúča“ na inú hodnotu. Hašovanie je jednosmerná funkcia, čo znamená, že na rozdiel od šifrovania nemôžete získať pôvodnú hodnotu z hashovanej.

Pomocou bcrypt ste hašovali svoje používateľské heslo volaním metódy hash na bcrypt. Hašovacia metóda má tri parametre: reťazec, ktorý sa má hašovať, zaokrúhlenia soli a funkciu spätného volania. Odovzdáte heslo používateľa, premennú saltRounds, ktorú ste vytvorili predtým, a spätné volanie.

Salt rounds sa vzťahuje na čas potrebný na výpočet jedného bcrypt hashu. Čím vyššie sú zaokrúhlenia soli, tým viac je hashovacích kôl.

Ak hašovacia metóda vyvolá chybu, vyvoláte „internú chybu servera“. V opačnom prípade nastavíte vlastnosť hesla na úspešný hash a uložíte ho do databázy volaním metódy uloženia na serveri Používateľ príklad.

Potom vytvorte svoju prihlasovaciu trasu pridaním bloku kódu nižšie do svojho userRoute.js súbor:

router.post("/sign-in", async (req, res) => {
skúste {
// Extrahujte e-mail a heslo z objektu req.body
konšt { email, heslo } = req.body;

// Skontrolujteakužívateľexistujevdatabázy
nech užívateľ = čakať User.findOne({ email });

if (!user) {
return res.status (401).json({ správa: "Neplatné poverenia" });
}

// Porovnanie hesiel
bcrypt.compare (heslo, heslo používateľa, (chyba, výsledok) => {
if (výsledok) {
return res.status (200).json({ správa: "Používateľ sa úspešne prihlásil" });
}

konzoly.log (chyba);
return res.status (401).json({ správa: "Neplatné poverenia" });
});
} chytiť (chyba) {
res.postavenie(401).odoslať(chybovať.správa);
}
});

modul.exportov = router;

Vo vyššie uvedenom bloku kódu najprv deštruktúrujete e-mail a heslo z req.body objekt. Potom skontrolujete, či vo vašej databáze existuje používateľ. Ak používateľ vo vašej databáze neexistuje, vrátite sa so stavovým kódom 401.

Potom pomocou porovnávacej metódy bcrypt zadajte heslo poskytnuté používateľom a hashované heslo, ktoré ste získali z databázy. Porovnajte tieto dva a potvrďte, či sa zhodujú. Ak sa heslá zhodujú, vrátite stavový kód 200 a správu o úspechu. V opačnom prípade vrátite stavový kód 401 a chybové hlásenie.

Nakoniec import router do vášho app.js súbor a použite ho ako middleware na úrovni aplikácie.

Týmto je váš model autentifikácie používateľa dokončený; teraz sa používatelia môžu bezpečne zaregistrovať a prihlásiť do vašej aplikácie.

Dôležitosť autentifikácie používateľa

Autentifikácia používateľa zaisťuje, že k vašej aplikácii môžu získať prístup iba legitímni používatelia. Ak sú vaše údaje akýmkoľvek spôsobom osobné alebo súkromné, mali by ste podniknúť kroky, aby ste zabránili prístupu neoverených používateľov.