Gebruikersauthenticatie is het proces van het verifiëren van de identiteit van een gebruiker die probeert toegang te krijgen tot uw toepassing. Het gaat om het autoriseren en overdragen van inloggegevens om de authenticiteit van een gebruiker te bevestigen.
U kunt een eenvoudig gebruikersauthenticatiemodel in Node.js implementeren met behulp van Express, Bcrypt en MongoDB, in slechts een paar stappen.
Stap 1: Ontwikkelomgeving opzetten
Maak eerst een projectmap en CD erin door te rennen:
mkdir gebruikersauthenticatie
CD gebruikersverificatie
Initialiseer vervolgens npm in uw projectdirectory door het volgende uit te voeren:
npm init -y
De -y vlag initialiseert npm en maakt uw pakket.json bestand met al zijn standaardinstellingen.
Dit gebruikersauthenticatiemodel vereist enkele afhankelijkheden.
Ze bevatten:
- Nadrukkelijk: Express is een Node.js-framework dat een robuuste set functies biedt voor web- en mobiele applicaties. Het maakt het gemakkelijker om backend-applicaties te bouwen met Node.js.
- Bcrypt: bcrypt is een npm-pakket dat de bcrypt-wachtwoordhashfunctie implementeert. Hiermee kunt u hashes maken van gewone wachtwoordreeksen.
- Mongoose: Mongoose is een MongoDB-bibliotheek voor objectgegevensmodellering. Het vereenvoudigt de interactie tussen uw app en een MongoDB-database.
- dotenv: dotenv is een zero-dependency pakket dat omgevingsvariabelen laadt van a .env bestand in proces.env.
- Validator: validator is een pakket dat verschillende tekenreeksvalidatiefuncties bevat.
- Body-parser: het body-parser-pakket parseert aanvraaginstanties in een middleware voor uw handlers.
Installeer de pakketten door het volgende uit te voeren:
npm installeren express bcrypt mangoest dotenv validator lichaam-parser
Maak vervolgens een app.js bestand in de hoofdmap van uw project en voeg het onderstaande codeblok toe om een standaard Express-server te maken:
// app.js
const express = vereisen('uitdrukken');
const app = express();
const bodyParser = vereisen("body-parser");const poort = 3000;
app.gebruiken(bodyParser.json());
app.gebruiken(bodyParser.urlencoded({ verlengd: WAAR }));
app.listen (poort, ()=>{
troosten.log('App luistert op poort' ${poort}`);
});
Deze code maakt een exprestoepassingsinstantie door de express-functie aan te roepen. Het gebruikt dan de body-parser middleware om binnenkomende aanvraaginstanties te ontleden. Vervolgens begint het te luisteren naar verkeer op poort 3000 door de luistermethode van de uitdrukkelijke instantie aan te roepen en de poortvariabele als argument door te geven.
Stap 2: Uw toepassing verbinden met een database
Maak in de hoofdmap van uw project a .env bestand en bewaar uw MongoDB-inloggegevens erin. Dit voorkomt dat uw databasereferenties worden weergegeven in code die kwaadwillende gebruikers toegang tot uw database kan geven.
Navigeer vervolgens naar uw app.js bestand en importeer mangoest:
const mangoest = vereisen("mangoest");
Bel dan import dotenv en bel de configuratie methode erop:
vereisen("dotenv").config();
Bellen naar de configuratie methode aan dotenv laadt omgevingsvariabelen in de proces.env.
Roep ten slotte de verbindingsmethode aan mangoest en geef uw MongoDB URI door als argument:
mangoest.connect (proces.env. MONGODB_URI).then(() => {
console.log('Succesvol verbonden met database')
})
Stap 3: Gebruikersmodel maken
Maak in de hoofdmap van uw project een "modellen” map; hier bewaar je je mangoestmodel:
mkdir-modellen
Maak vervolgens een "gebruikerModel” bestand en voeg de volgende imports toe:
const mangoest = vereisen('mangoest')
const { isE-mail } = vereisen('validateur')
isE-mail is een validatiefunctie die terugkeert WAAR als een gegeven string een e-mail is. U hebt het nodig om mangoestvalidatie toe te passen op uw gebruikersmodel.
Voeg vervolgens de volgende code toe aan uw gebruikerModel het dossier:
// modellen/gebruikerModel
const userSchema = mangoest. Schema({
e-mail: {
type: Snaar,
vereist: [waar, 'E-mail is vereist'],
valideren: {
validator: isE-mail,
bericht: rekwisieten => `${props.value} is geen geldig e-mailadres`
}
},wachtwoord: {
type: Snaar,
vereist: [waar, 'Een wachtwoord is verplicht'],
valideren: {
validator: functie (waarde) {
opbrengst waarde.lengte >= 6
},
bericht: () =>'Wachtwoord moet minimaal zes tekens lang zijn'
}
}
})
module.exporteert = mangoest.model('Gebruiker', gebruikersschema)
De bovenstaande code creëert een gebruikersschema variabele die de waarde van de opslaat mangoest. Schema methode. De mangoest. De schemamethode wijst eigenschappen toe aan een MongoDB-verzameling en definieert de vorm van de documenten erin. Het mangoestschema heeft twee eigenschappen: een e-mail en een wachtwoord-wat uw authenticatievereisten zijn.
De eigenschap e-mail is een tekenreekstype en heeft verplicht ingesteld op waar. Het bijbehorende foutbericht, "E-mail is vereist", wordt weergegeven als de hoofdtekst van een verzoek geen e-mail eigendom. Tot slot, met behulp van mangoest aangepaste validatie, de validator eigendom verwijst naar de isE-mail functie. Die functie retourneert waar of onwaar op basis van de geldigheid van de tekenreeks als een e-mail. Vervolgens neemt de berichteigenschap de e-mailwaarde (rekwisieten) en construeert een zinvolle foutmelding.
De wachtwoordeigenschap is een vereist tekenreekstype met een foutmelding met de tekst "Wachtwoord is vereist". De validator functie is een anonieme die true retourneert als het wachtwoord ten minste zes tekens lang is.
De laatste regel maakt en exporteert een mangoestmodel door de. aan te roepen model- methode aan mangoest. Geef de modelnaam door (Gebruiker) als het eerste argument en een schema (gebruikersschema) als tweede argument.
Stap 4: Aanmeldings- en aanmeldingsroutes implementeren
Maak in de hoofdmap van uw project a routes map:
mkdir-routes
Maak in je routesmap een userRoutes.js bestand en voeg de volgende imports toe:
// routes/userRoutes.js
const express = vereisen("uitdrukken");
const Gebruiker = vereisen("../modellen/gebruikersModel");
const bcrypt = vereisen("bcrypt");
Maak een Express Router-instantie door de. aan te roepen Router methode aan uitdrukken:
const router = express. Router();
Maak vervolgens uw aanmeldingsroute door het onderstaande codeblok toe te voegen aan uw userRoute.js het dossier:
router.post("/sign-up", asynchrone (req, res) => {
proberen {
// Extraheer e-mail en wachtwoord uit het req.body-object
const { e-mail, wachtwoord } = req.body;// Controlerenals de e-mail is al ingebruiken
laten gebruikerBestaat = wachten Gebruiker.findOne({ e-mail });if (gebruiker bestaat) {
res.status(401).json({ bericht: "E-mail is al binnen" gebruiken.&aanhalingsteken; });
opbrengst;
}// Definieer zoutrondes
const zoutRonden = 10;// Hash-wachtwoord
bcrypt.hash (wachtwoord, saltRounds, (err, hash) => {
als (fout) gooiennieuweFout("Interne server Fout");// Creëren a nieuwegebruiker
laten gebruiker = nieuwe Gebruiker({
e-mail,
wachtwoord: hasj,
});
// Bewaar gebruiker in database
gebruiker.save().then(() => {
res.json({ bericht: "Gebruiker succesvol aangemaakt", gebruiker });
});
});
} vangst (fout) {
opbrengstres.toestand(401).versturen(foutje.bericht);
}
});
In het bovenstaande codeblok heb je eerst het e-mailadres en wachtwoord van de req.body object. Controleer vervolgens of een gebruiker de e-mail al gebruikt, want deze moet voor elke gebruiker uniek zijn. Als de e-mail al is gebruikt, keert u terug en stopt u de uitvoering van de code met een 401-statuscode.
Het opslaan van gewone wachtwoorden in een database is een enorme bedreiging voor de veiligheid, omdat kwaadwillende hackers toegang kunnen krijgen tot de database. U moet wachtwoorden hashen voordat u ze in uw database plaatst, dus zelfs als een hacker ze ontdekt, zou er geen risico voor gebruikers moeten zijn. Hashing is het proces waarbij een bepaalde "sleutel" wordt omgezet in een andere waarde. Hashing is een eenrichtingsfunctie, wat betekent dat u de oorspronkelijke waarde niet uit de hash kunt halen, in tegenstelling tot encryptie.
Met behulp van bcrypt heb je gehasht uw gebruikerswachtwoord door de hash-methode op bcrypt aan te roepen. De hash-methode heeft drie parameters: de te hashen string, salt-rondes en een callback-functie. U geeft het gebruikerswachtwoord door, de saltRounds-variabele die u eerder hebt gemaakt en een callback.
Zoutrondes verwijzen naar de tijd die nodig is om een enkele bcrypt-hash te berekenen. Hoe hoger de zoutrondes, hoe meer hash-rondes.
Als de hash-methode een fout genereert, genereert u een "interne serverfout". Anders stelt u de wachtwoordeigenschap in op de succesvolle hash en slaat u deze op in uw database door de opslagmethode aan te roepen op de Gebruiker voorbeeld.
Maak vervolgens uw inlogroute door het onderstaande codeblok toe te voegen aan uw userRoute.js het dossier:
router.post("/sign-in", asynchrone (req, res) => {
proberen {
// Extraheer e-mail en wachtwoord uit het req.body-object
const { e-mail, wachtwoord } = req.body;// Controlerenalsgebruikerbestaatindatabase
laten gebruiker = wachten Gebruiker.findOne({ e-mail });als (!gebruiker) {
return res.status (401).json({ bericht: "Ongeldige inloggegevens" });
}// Vergelijk wachtwoorden
bcrypt.compare (wachtwoord, gebruiker.wachtwoord, (fout, resultaat) => {
als (resultaat) {
return res.status (200).json({ bericht: "Gebruiker succesvol ingelogd" });
}troosten.log (fout);
return res.status (401).json({ bericht: "Ongeldige inloggegevens" });
});
} vangst (fout) {
res.toestand(401).versturen(foutje.bericht);
}
});
module.exporteert = router;
In het bovenstaande codeblok de-structureert u eerst de e-mail en het wachtwoord van de req.body object. Vervolgens controleert u of er een gebruiker in uw database bestaat. Als de gebruiker niet in uw database bestaat, keert u terug met een 401-statuscode.
Gebruik vervolgens de vergelijkingsmethode van bcrypt en voer het wachtwoord in dat de gebruiker heeft opgegeven en het gehashte wachtwoord dat u uit uw database hebt opgehaald. Vergelijk de twee om te bevestigen of ze overeenkomen. Als de wachtwoorden overeenkomen, retourneert u een 200-statuscode en een succesbericht. Anders retourneert u een 401-statuscode en een foutmelding.
Eindelijk, import router in je app.js bestand en gebruik het als middleware op toepassingsniveau.
Hiermee is uw gebruikersauthenticatiemodel voltooid; nu kunnen gebruikers zich veilig aanmelden en inloggen bij uw toepassing.
Het belang van gebruikersauthenticatie
Gebruikersauthenticatie zorgt ervoor dat alleen legitieme gebruikers toegang krijgen tot uw applicatie. Als uw gegevens op een of andere manier persoonlijk of privé zijn, moet u stappen ondernemen om te voorkomen dat niet-geverifieerde gebruikers toegang krijgen.