Autentizace uživatele je proces ověření identity uživatele, který se pokouší získat přístup k vaší aplikaci. Zahrnuje autorizaci a přenos přihlašovacích údajů k potvrzení pravosti uživatele.
V několika krocích můžete implementovat jednoduchý model ověřování uživatele v Node.js pomocí Express, Bcrypt a MongoDB.
Krok 1: Nastavení vývojového prostředí
Nejprve vytvořte složku projektu a CD do toho spuštěním:
autentizace uživatele mkdir
CD Ověření uživatele
Dále inicializujte npm v adresáři projektu spuštěním:
npm init -y
The -y flag inicializuje npm a vytvoří váš package.json soubor se všemi jeho výchozími hodnotami.
Tento model ověřování uživatele vyžaduje několik závislostí.
Obsahují:
- Vyjádřit: Express je framework Node.js který poskytuje robustní sadu funkcí pro webové a mobilní aplikace. Usnadňuje vytváření backendových aplikací pomocí Node.js.
- Bcrypt: bcrypt je balíček npm, který implementuje funkci hašování hesel bcrypt. Umožňuje vám vytvářet hashe z jednoduchých řetězců hesel.
- Mongoose: Mongoose je knihovna pro modelování objektových dat MongoDB. Zjednodušuje interakci mezi vaší aplikací a databází MongoDB.
- dotenv: dotenv je balíček s nulovou závislostí, který načítá proměnné prostředí z a .env zařadit do proces.env.
- Validator: validator je balíček, který obsahuje různé funkce pro ověřování řetězců.
- Body-parser: Balíček body-parser analyzuje těla požadavků v middlewaru před vašimi handlery.
Nainstalujte balíčky spuštěním:
npm Nainstalujte expresní bcrypt mangoose dotenv validátor tělo-analyzátor
Dále vytvořte app.js soubor v kořenovém adresáři vašeho projektu a přidejte blok kódu níže, abyste vytvořili základní expresní server:
// app.js
konst vyjádřit = vyžadovat('vyjádřit');
konst app = express();
konst bodyParser = vyžadovat("analyzátor těl");konst přístav = 3000;
aplikace.použití(bodyParser.json());
aplikace.použití(bodyParser.urlencoded({ prodloužený: skutečný }));
app.listen (port, ()=>{
řídicí panel.log(`Aplikace naslouchá na portu ${port}`);
});
Tento kód vytvoří expresní instanci aplikace voláním expresní funkce. Poté používá analyzátor těl middleware pro analýzu těl příchozích požadavků. Poté začne naslouchat provozu na portu 3000 voláním metody naslouchání expresní instance a předáním proměnné portu jako argumentu.
Krok 2: Připojení vaší aplikace k databázi
V kořenovém adresáři projektu vytvořte a .env soubor a uložte do něj své přihlašovací údaje MongoDB. Vyhnete se tak odhalení přihlašovacích údajů vaší databáze v kódu, který může poskytnout uživatelům se zlými úmysly přístup k vaší databázi.
Dále přejděte do svého app.js soubor a import mangoose:
konst mangusta = vyžadovat("mangusta");
Poté zavolejte import dotenv a zavolejte na config metoda na to:
vyžadovat("dotenv").config();
Volání na config metoda zapnuta dotenv načte proměnné prostředí do proces.env.
Nakonec zavolejte metodu connect on mangusta a předejte svůj MongoDB URI jako argument:
mongoose.connect (process.env. MONGODB_URI).pak(() => {
console.log('Úspěšně připojeno k databázi')
})
Krok 3: Vytvoření uživatelského modelu
V kořenovém adresáři projektu vytvořte „modely” složka; zde budete ukládat svůj model mongoose:
modely mkdir
Dále vytvořte „uživatelský model” a přidejte následující importy:
konst mangusta = vyžadovat('mangusta')
konst { isEmail } = vyžadovat('validátor')
isEmail je ověřovací funkce, která vrací skutečný pokud je daný řetězec e-mail. Budete jej potřebovat k použití ověření mongoose na váš uživatelský model.
Dále přidejte následující kód do svého uživatelský model soubor:
// models/userModel
konst userSchema = mangusta. Schéma({
e-mailem: {
typ: Tětiva,
požadované: [pravda, 'E-mail je povinný'],
ověřit: {
validátor: isEmail,
zpráva: rekvizity => `${props.value} není platný e-mail
}
},Heslo: {
typ: Tětiva,
požadované: [pravda, 'Je vyžadováno heslo'],
ověřit: {
validátor: funkce (hodnota) {
vrátit se hodnota.délka >= 6
},
zpráva: () =>'Heslo musí mít alespoň šest znaků'
}
}
})
modul.exportů = mongoose.model('User', userSchema)
Výše uvedený kód vytvoří a userSchema proměnná, která ukládá hodnotu mangusta. Schéma metoda. Mangusta. Metoda Schema mapuje vlastnosti do kolekce MongoDB a definuje tvar dokumentů v ní. Schéma mongoose má dvě vlastnosti – an e-mailem a a Heslo– jaké budou vaše požadavky na ověření.
Vlastnost email je typ řetězce a má Požadované nastaveno na true. Doprovodná chybová zpráva „Je vyžadován e-mail“ se zobrazí, pokud tělo požadavku neobsahuje e-mailem vlastnictví. Nakonec pomocí vlastního ověření mongoose, validátor nemovitost referuje isEmail funkce. Tato funkce vrací true nebo false na základě platnosti řetězce jako e-mailu. Potom vlastnost message převezme hodnotu email (rekvizity) a vytvoří smysluplnou chybovou zprávu.
Vlastnost hesla je požadovaný typ řetězce s chybovou zprávou, která zní „Je vyžadováno heslo“. The validátor Funkce je anonymní, která vrací hodnotu true, pokud je heslo dlouhé alespoň šest znaků.
Poslední řádek vytvoří a exportuje model mongoose voláním Modelka metoda zapnuta mangusta. Předejte název modelu (Uživatel) jako první argument a schéma (userSchema) jako druhý argument.
Krok 4: Implementace tras pro přihlášení a registraci
V kořenovém adresáři projektu vytvořte a trasy složka:
trasy mkdir
Ve složce tras vytvořte a userRoutes.js soubor a přidejte následující importy:
// routes/userRoutes.js
konst vyjádřit = vyžadovat("vyjádřit");
konst Uživatel = vyžadovat("../models/userModel");
konst bcrypt = vyžadovat("bcrypt");
Vytvořte instanci expresního směrovače voláním Směrovač metoda zapnuta vyjádřit:
konst router = expres. Router();
Dále vytvořte svou registrační trasu přidáním bloku kódu níže do svého userRoute.js soubor:
router.post("/sign-up", async (req, res) => {
Snaž se {
// Extrahujte e-mail a heslo z objektu req.body
konst { email, heslo } = req.body;// Šek-li e-mail je již vpoužití
nechat userExists = čekat User.findOne({ email });if (userExists) {
res.status(401.json({ message: "E-mail je již uložen použití." });
vrátit se;
}// Definice salt rounds
konst sůlRounds = 10;// Hash heslo
bcrypt.hash (heslo, saltRounds, (chyba, hash) => {
-li (chybovat) házetNovýChyba(„Interní server Chyba");// Vytvořit A Novýuživatel
nechat uživatel = Nový Uživatel({
e-mailem,
Heslo: hash,
});
// Uložení uživatele do databáze
user.save().then(() => {
res.json({ zpráva: "Uživatel byl úspěšně vytvořen", uživatel });
});
});
} úlovek (chyba) {
vrátit seres.postavení(401).poslat(chybovat.zpráva);
}
});
Ve výše uvedeném bloku kódu jste nejprve destrukturovali e-mail a heslo z req.body objekt. Poté zkontrolujte, zda uživatel již e-mail používá, protože by měl být pro každého uživatele jedinečný. Pokud byl e-mail již použit, vrátíte se a zastavíte provádění kódu se stavovým kódem 401.
Ukládání jednoduchých hesel v databázi je obrovskou bezpečnostní hrozbou, protože do databáze mohou získat přístup zlomyslní hackeři. Před uložením do databáze byste měli hesla hashovat, takže i když je hacker objeví, uživatelům by nemělo hrozit žádné riziko. Hašování je proces převodu daného „klíče“ na jinou hodnotu. Hašování je jednosměrná funkce, což znamená, že na rozdíl od šifrování nemůžete z hashované hodnoty získat původní hodnotu.
Pomocí bcrypt jste zahašovali své uživatelské heslo voláním metody hash na bcrypt. Metoda hash má tři parametry: řetězec, který má být hašován, zaokrouhlení soli a funkci zpětného volání. Předáte uživatelské heslo, proměnnou saltRounds, kterou jste vytvořili dříve, a zpětné volání.
Salt rounds odkazují na čas potřebný k výpočtu jednoho bcrypt hashe. Čím vyšší zaokrouhlení soli, tím více kol hašování.
Pokud metoda hash vyvolá chybu, vyvoláte „interní chybu serveru“. V opačném případě nastavíte vlastnost password na úspěšný hash a uložíte jej do databáze voláním metody save na Uživatel instance.
Dále vytvořte svou přihlašovací trasu přidáním bloku kódu níže do svého userRoute.js soubor:
router.post("/sign-in", async (req, res) => {
Snaž se {
// Extrahujte e-mail a heslo z objektu req.body
konst { email, heslo } = req.body;// Šek-liuživatelexistujevdatabáze
nechat uživatel = čekat User.findOne({ email });if (!user) {
return res.status (401).json({ zpráva: "Neplatné přihlašovací údaje" });
}// Porovnejte hesla
bcrypt.compare (heslo, heslo uživatele, (chyba, výsledek) => {
if (výsledek) {
return res.status (200).json({ zpráva: "Uživatel byl úspěšně přihlášen" });
}řídicí panel.log (chyba);
return res.status (401).json({ zpráva: "Neplatné přihlašovací údaje" });
});
} úlovek (chyba) {
res.postavení(401).poslat(chybovat.zpráva);
}
});
modul.exportů = router;
Ve výše uvedeném bloku kódu nejprve destruujete e-mail a heslo z req.body objekt. Poté zkontrolujete, zda uživatel ve vaší databázi existuje. Pokud uživatel ve vaší databázi neexistuje, vrátíte se se stavovým kódem 401.
Dále pomocí metody porovnání bcrypt předejte heslo poskytnuté uživatelem a hashované heslo, které jste získali z databáze. Porovnejte oba a potvrďte, zda se shodují. Pokud se hesla shodují, vrátíte stavový kód 200 a zprávu o úspěchu. Jinak vrátíte stavový kód 401 a chybovou zprávu.
Nakonec import router do vašeho app.js a použít jej jako middleware na úrovni aplikace.
Tím je váš model ověřování uživatele dokončen; nyní se uživatelé mohou bezpečně zaregistrovat a přihlásit do vaší aplikace.
Význam autentizace uživatele
Autentizace uživatele zajišťuje, že k vaší aplikaci mohou získat přístup pouze legitimní uživatelé. Pokud jsou vaše data jakýmkoliv způsobem osobní nebo soukromá, měli byste podniknout kroky k zabránění přístupu neověřeným uživatelům.