Als u gevoelige inhoud in uw Node-toepassing wilt beschermen, hebt u een manier nodig om gebruikers te verifiëren. Het bouwen van uw eigen authenticatiesysteem is echter complex en tijdrovend en als het niet correct wordt uitgevoerd, kan dit beveiligingsproblemen in uw toepassing veroorzaken. Tools van derden, zoals Passport, maken authenticatie eenvoudiger.

In deze zelfstudie leert u hoe u authenticatie in Node implementeert met Passport en MongoDB.

Wat zijn authenticatie en autorisatie?

Hoewel authenticatie en autorisatie soms door elkaar worden gebruikt, hebben deze twee beveiligingsconcepten verschillende betekenissen. Authenticatie is het proces waarbij wordt gecontroleerd of een gebruiker is wie hij beweert te zijn, terwijl autorisatie de proces om te bepalen of een geverifieerde gebruiker toegang heeft tot bepaalde delen van uw applicatie.

Wat is Passport.js?

Passport.js (of Passport) is een authenticatie-middleware voor NodeJS die meer dan 500 strategieën biedt voor het authenticeren van gebruikers, waaronder: paspoort-lokaal die een gebruikersnaam en wachtwoord gebruikt.

instagram viewer

Deze tutorial gebruikt paspoort-lokaal en paspoort-jwt routes te beveiligen.

Gebruikersauthenticatie instellen in NodeJS

Nu je een beetje weet over gebruikersauthenticatie en Passport.js, kunnen we kijken hoe we authenticatie op NodeJS kunnen instellen. Hieronder hebben we de stappen uiteengezet die u moet nemen.

Stap 1: Een knooppuntserver instellen

Maak een map met de naam user-auth-nodejs en navigeer ernaar met uw terminal.

mkdir user-auth-nodejs. 

cd gebruiker-auth-nodejs

Volgende initialiseren pakket.json.

npm init

Aangezien u gaat gebruiken nadrukkelijk, een NodeJS-backend-framework, installeer het door de volgende opdracht uit te voeren.

npm ik express

Maak nu een bestand aan, app.jsen voeg de volgende code toe om de server te maken.

const express = vereisen ("express");
const-app = express();
const POORT = 3000;
app.luister (POORT, () => {
console.log(`Luisteren op poort ${PORT}`);
});

Verwant: Leer hoe u Npm en Node.js op Ubuntu installeert

Stap 2: Stel de database in

U hebt een database nodig om gebruikersgegevens op te slaan. U gebruikt mangoest om een ​​MongoDB-gegevensschema te maken dat de structuur en het type gegevens definieert dat u in de database opslaat. Aangezien u gebruikersgegevens opslaat, moet u een gebruikersschema maken.

Installeer mangoest.

npm ik mangoest

Maak een nieuw bestand, userModel.jsen voeg het volgende toe.

const mangoest = vereisen('mangoest')
const {Schema} = mangoest
const UserSchema = nieuw schema ({
e-mail: {
soort: koord,
vereist: waar
},
wachtwoord: {
soort: koord,
vereist: waar
}
})
const UserModel = mongoose.model('gebruiker', UserSchema);
module.exports = GebruikersModel;

Verwant: Een database en verzameling maken in MongoDB

Voordat u het wachtwoord opslaat, moet u het om veiligheidsredenen versleutelen. je gaat gebruiken bcryptjs, een zeer handig npm-pakket dat het werken met versleutelde wachtwoorden gemakkelijk maakt.

Installeren bcryptjs.

npm ik bcryptjs

Bewerken gebruikersmodel.js om het wachtwoord te coderen voordat u het in de database opslaat.

const mangoest = vereisen('mangoest')
const bcrypt = vereisen('bcryptjs');
const {Schema} = mangoest

const UserSchema = nieuw schema ({
...
})
UserSchema.pre('save', asynchrone functie (volgende) {
poging {
// controleer de registratiemethode
const gebruiker = dit;
if (!gebruiker.isModified('wachtwoord')) volgende();
// genereer zout
const salt = wacht op bcrypt.genSalt (10);
// hash het wachtwoord
const hashedPassword = wacht op bcrypt.hash (this.password, salt);
// vervang wachtwoord in platte tekst door gehasht wachtwoord
dit.wachtwoord = hashedWachtwoord;
De volgende();
} vangst (fout) {
volgende terug (fout);
}
});
...
const Gebruiker = mongoose.model ('Gebruiker', Gebruikersschema);

Hier gebruik je a vooraf opslaan hook om het wachtwoord te wijzigen voordat het wordt opgeslagen. Het idee is om de hash-versie van het wachtwoord op te slaan in plaats van het wachtwoord in platte tekst. Een hash is een lange complexe tekenreeks die wordt gegenereerd op basis van een tekenreeks zonder opmaak.

Gebruiken isGewijzigd om te controleren of het wachtwoord verandert, aangezien u alleen nieuwe wachtwoorden hoeft te hashen. Genereer vervolgens een salt en geef deze met het wachtwoord in platte tekst door aan de hash-methode om het gehashte wachtwoord te genereren. Vervang ten slotte het wachtwoord in platte tekst door het gehashte wachtwoord in de database.

Maak db.js en configureer de database.

const mangoest = vereisen ("mangoest");
mangoest. Belofte = globaal. Belofte;
const dbUrl = "mongodb://localhost/gebruiker";
const connect = asynchroon () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mangoest.verbinding;
db.on("fout", () => {
console.log("kon geen verbinding maken");
});
db.once("open", () => {
console.log("> Succesvol verbonden met database");
});
};
module.exports = {verbinden};

Maak in app.js verbinding met de database.

// verbind met db
const db = vereisen('./db');
db.connect();

Stap 3: Paspoort instellen

Installeren Paspoort en paspoort-lokaal. U gebruikt deze pakketten om gebruikers te registreren en in te loggen.

npm ik paspoort
npm i paspoort-lokaal

Maak een nieuw bestand, paspoortConfig.js, en importeren paspoort-lokaal en de userModel.js.

const LocalStraregy = required("paspoort-local").Strategie;
const Gebruiker = vereisen("./userModel");

Configureer Passport om gebruikersregistratie af te handelen.

const LocalStrategy = required("paspoort-lokaal");
const Gebruiker = vereisen("./userModel");
module.exports = (paspoort) => {
paspoort.gebruik(
"lokale aanmelding",
nieuwe Lokale Strategie(
{
gebruikersnaamVeld: "e-mail",
wachtwoordveld: "wachtwoord",
},
async (e-mail, wachtwoord, klaar) => {
poging {
// controleer of de gebruiker bestaat
const userExists = wacht op User.findOne({ "email": email });
if (gebruiker bestaat) {
retour gedaan (null, false)
}
// Maak een nieuwe gebruiker met de verstrekte gebruikersgegevens
const user = wacht op User.create ({ e-mail, wachtwoord });
retour gedaan (null, gebruiker);
} vangst (fout) {
gedaan (fout);
}
}
)
);
}

In de bovenstaande code controleer je of de e-mail al in gebruik is. Als het e-mailadres niet bestaat, registreert u de gebruiker. Merk op dat u ook het gebruikersnaamveld instelt om een ​​e-mail te accepteren. Standaard, paspoort-lokaal verwacht een gebruikersnaam, dus u moet hem in plaats daarvan in een e-mail vertellen dat u hem doorgeeft.

Gebruiken paspoort-lokaal om ook de gebruikersaanmelding af te handelen.

module.exports = (paspoort) => {
paspoort.gebruik(
"lokale aanmelding",
nieuwe lokale strategie(
...
)
);
paspoort.gebruik(
"lokale login",
nieuwe Lokale Strategie(
{
gebruikersnaamVeld: "e-mail",
wachtwoordveld: "wachtwoord",
},
async (e-mail, wachtwoord, klaar) => {
poging {
const user = wacht op User.findOne({ email: email });
if (!user) return gedaan (null, false);
const isMatch = wacht op user.matchPassword (wachtwoord);
als (!isMatch)
retour gedaan (null, false);
// als wachtwoorden overeenkomen met retourgebruiker
retour gedaan (null, gebruiker);
} vangst (fout) {
console.log (fout)
retour gedaan (fout, onwaar);
}
}
)
);
};

Controleer hier of de gebruiker in de database bestaat, en zo ja, controleer of het opgegeven wachtwoord overeenkomt met dat in de database. Let op u belt ook de matchPassword() methode op het gebruikersmodel dus ga naar userModel.js bestand en voeg het toe.

UserSchema.methods.matchPassword = asynchrone functie (wachtwoord) {
poging {
terug wachten op bcrypt.compare (wachtwoord, dit.wachtwoord);
} vangst (fout) {
nieuwe fout gooien (fout);
}
};

Deze methode vergelijkt het wachtwoord van de gebruiker en dat in de database en retourneert waar als ze overeenkomen.

Stap 4: Stel authenticatieroutes in

U moet nu de eindpunten maken waarnaar gebruikers gegevens zullen verzenden. Als eerste is de aanmeldingsroute die het e-mailadres en wachtwoord van een nieuwe gebruiker accepteert.

In app.js, gebruik de paspoortverificatie-middleware die u zojuist hebt gemaakt om de gebruiker te registreren.

app.post(
 "/auth/aanmelden",
paspoort.authenticate('local-signup', { session: false }),
(req, res, volgende) => {
// aanmelden
res.json({
gebruiker: verzoek.gebruiker,
});
}
);

Verwant: Authenticatie versus Autorisatie: wat is het verschil?

Als dit lukt, moet de aanmeldingsroute de gemaakte gebruiker retourneren.

Maak vervolgens de inlogroute.

app.post(
"/auth/login",
paspoort.authenticate('local-login', { session: false }),
(req, res, volgende) => {
// Log in
res.json({
gebruiker: verzoek.gebruiker,
});
}
);

Stap 5: Beveiligde routes toevoegen

Tot nu toe heb je gebruikt Paspoort om een ​​middleware te maken die een gebruiker in de database registreert en een andere waarmee een geregistreerde gebruiker zich kan aanmelden. Vervolgens maakt u een autorisatie-middleware om gevoelige routes te beschermen met behulp van een JSON-webtoken (JWT). Om JWT-autorisatie te implementeren, moet u:

  • Genereer JWT-token.
  • Geef het token door aan de gebruiker. De gebruiker stuurt het terug in autorisatieverzoeken.
  • Controleer het token dat door de gebruiker is teruggestuurd.

Je gebruikt de jsonwebtoken pakket om JWT's af te handelen.

Voer de volgende opdracht uit om het te installeren.

npm ik jsonwebtoken

Genereer vervolgens een token voor elke gebruiker die met succes inlogt.

In app.js, import jsonwebtoken en wijzig de inlogroute zoals hieronder.

app.post(
"/auth/login",
paspoort.authenticate('local-login', { session: false }),
(req, res, volgende) => {
// Log in
jwt.sign({gebruiker: req.user}, 'secretKey', {expiresIn: '1h'}, (err, token) => {
als (fout) {
retourneer res.json({
bericht: "Kan niet inloggen",
teken: nul,
});
}
res.json({
token
});
})
}
);

In een echte toepassing zou u een meer gecompliceerde geheime sleutel gebruiken en deze opslaan in een configuratiebestand.

De inlogroute retourneert een token als dit is gelukt.

Gebruiken paspoort-jwt om toegang te krijgen tot beschermde routes.

npm ik paspoort-jwt

In paspoortConfig.js, configureer de paspoort-jwt.

const JwtStrategy = required("paspoort-jwt").Strategie;
const { ExtractJwt } = vereisen ("paspoort-jwt")
module.exports = (paspoort) => {
paspoort.gebruik(
"lokale login",
nieuwe Lokale Strategie(
...
);
paspoort.gebruik(
nieuwe JwtStrategie(
{
jwtFromRequest: ExtractJwt.fromHeader ("autorisatie"),
secretOrKey: "secretKey",
},
async (jwtPayload, klaar) => {
poging {
// Gebruiker extraheren
const gebruiker = jwtPayload.user;
klaar (null, gebruiker);
} vangst (fout) {
gedaan (fout, onwaar);
}
}
)
);
};

U ziet dat u de JWT extraheert uit de autorisatieheader in plaats van uit de hoofdtekst van de aanvraag. Dit voorkomt dat hackers een verzoek onderscheppen en de token pakken.

Om te zien hoe paspoort-jwt bewaakt routes, maak een beschermde route in app.js.

app.get(
"/gebruiker/beveiligd",
paspoort.authenticate("jwt", { session: false }),
(req, res, volgende) => {
res.json({gebruiker: req.gebruiker});
}
);

Alleen een aanvraag met een geldige JWT retourneert de gebruikersgegevens.

Nu bent u klaar om uw gebruikersauthenticatie naar een hoger niveau te tillen

In deze tutorial heb je geleerd hoe je gebruikers kunt authenticeren met een e-mail en een wachtwoord met behulp van Passport. Het lijkt in eerste instantie misschien ontmoedigend, maar het proces is relatief eenvoudig. U kunt nog verder gaan en externe identiteitsproviders gebruiken die door Passport worden ondersteund, zoals Twitter, Facebook en Google.

Wat is gebruikersauthenticatie en hoe werkt het?

Het is belangrijk om de basisprincipes van gebruikersauthenticatie te begrijpen om het maximale beveiligingsniveau voor uw online accounts te garanderen. Dus laten we erin duiken.

Lees volgende

DelenTweetenE-mail
Gerelateerde onderwerpen
  • Programmeren
  • Programmeren
  • Programmeertalen
  • Programmeerhulpmiddelen
Over de auteur
Mary Gathoni (8 artikelen gepubliceerd)

Mary Gathoni is een softwareontwikkelaar met een passie voor het maken van technische inhoud die niet alleen informatief maar ook boeiend is. Als ze niet aan het coderen of schrijven is, gaat ze graag met vrienden om en is ze graag buiten.

Meer van Mary Gathoni

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren