Wenn Sie vertrauliche Inhalte in Ihrer Node-Anwendung schützen möchten, benötigen Sie eine Möglichkeit, Benutzer zu authentifizieren. Das Erstellen eines eigenen Authentifizierungssystems ist jedoch komplex und zeitaufwändig und kann, wenn es nicht korrekt durchgeführt wird, Sicherheitslücken in Ihrer Anwendung hervorrufen. Tools von Drittanbietern wie Passport erleichtern die Authentifizierung.

In diesem Tutorial erfahren Sie, wie Sie die Authentifizierung in Node mit Passport und MongoDB implementieren.

Was sind Authentifizierung und Autorisierung?

Während Authentifizierung und Autorisierung manchmal synonym verwendet werden, haben diese beiden Sicherheitskonzepte unterschiedliche Bedeutungen. Authentifizierung ist der Prozess, bei dem überprüft wird, ob ein Benutzer derjenige ist, für den er sich ausgibt, während die Autorisierung erfolgt Prozess zur Bestimmung, ob ein authentifizierter Benutzer Zugriff auf bestimmte Teile Ihrer Anwendung hat.

Was ist Passport.js?

Passport.js (oder Passport) ist eine Authentifizierungs-Middleware für NodeJS, die mehr als 500 Strategien zur Authentifizierung von Benutzern bereitstellt, einschließlich

instagram viewer
Pass-lokal die einen Benutzernamen und ein Passwort verwendet.

Dieses Tutorial verwendet Pass-lokal und Pass-jwt Wege zu sichern.

So richten Sie die Benutzerauthentifizierung in NodeJS ein

Nachdem Sie nun ein wenig über Benutzerauthentifizierung und Passport.js Bescheid wissen, können wir uns ansehen, wie die Authentifizierung auf NodeJS eingerichtet wird. Nachfolgend haben wir die Schritte beschrieben, die Sie unternehmen müssen.

Schritt 1: Richten Sie einen Knotenserver ein

Erstellen Sie einen Ordner mit dem Namen user-auth-nodejs und navigieren Sie mit Ihrem Terminal dorthin.

mkdir user-auth-nodejs. 

cd user-auth-nodejs

Als nächstes initialisieren Paket.json.

npm-Init

Da Sie verwenden werden ausdrücken, ein NodeJS-Back-End-Framework, installieren Sie es, indem Sie den folgenden Befehl ausführen.

npm ich ausdrücke

Erstellen Sie nun eine Datei, app.js, und fügen Sie den folgenden Code hinzu, um den Server zu erstellen.

const express = require("express");
const app = ausdrücken ();
const PORT = 3000;
app.listen (PORT, () => {
console.log(`Hört auf Port ${PORT}`);
});

Verwandt: Erfahren Sie, wie Sie Npm und Node.js unter Ubuntu installieren

Schritt 2: Richten Sie die Datenbank ein

Sie benötigen eine Datenbank, um Benutzerdaten zu speichern. Sie verwenden Mongoose, um ein MongoDB-Datenschema zu erstellen, das die Struktur und den Typ der Daten definiert, die Sie in der Datenbank speichern. Da Sie Benutzerdaten speichern, erstellen Sie ein Benutzerschema.

Mungo installieren.

npm ich Mungo

Erstellen Sie eine neue Datei, userModel.js, und fügen Sie Folgendes hinzu.

const Mungo = require('Mungo')
const {Schema} = Mungo
const UserSchema = neues Schema ({
Email: {
Typ: Zeichenkette,
erforderlich: wahr
},
Passwort: {
Typ: Zeichenkette,
erforderlich: wahr
}
})
const UserModel = mongoose.model('user', UserSchema);
module.exports = UserModel;

Verwandt: So erstellen Sie eine Datenbank und Sammlung in MongoDB

Bevor Sie das Passwort speichern, müssen Sie es aus Sicherheitsgründen verschlüsseln. Du wirst benutzen bcryptjs, ein sehr nützliches npm-Paket, das die Arbeit mit verschlüsselten Passwörtern erleichtert.

Installieren bcryptjs.

npm und bcryptjs

Ändern usermodel.js um das Passwort zu verschlüsseln, bevor es in der Datenbank gespeichert wird.

const Mungo = require('Mungo')
const bcrypt = require('bcryptjs');
const {Schema} = Mungo

const UserSchema = neues Schema ({
...
})
UserSchema.pre('save', async function (next) {
Versuchen {
// Registrierungsmethode prüfen
const user = this;
if (!user.isModified('password')) next();
// Salz erzeugen
const salt = warte auf bcrypt.genSalt (10);
// hash das Passwort
const haschedPassword = await bcrypt.hash (this.password, salt);
// Klartext-Passwort durch gehashtes Passwort ersetzen
this.password = gehashtesPasswort;
nächste();
} Fang (Fehler) {
als nächstes zurückkehren (Fehler);
}
});
...
const User = mongoose.model('User', UserSchema);

Hier verwenden Sie eine vorab speichern Haken, um das Passwort zu ändern, bevor es gespeichert wird. Die Idee ist, die Hash-Version des Passworts anstelle des Klartextpassworts zu speichern. Ein Hash ist eine lange komplexe Zeichenfolge, die aus einer einfachen Textzeichenfolge generiert wird.

Verwenden istGeändert um zu überprüfen, ob sich das Passwort ändert, da Sie nur neue Passwörter hashen müssen. Generieren Sie als Nächstes ein Salt und übergeben Sie es mit dem Klartext-Passwort an die Hash-Methode, um das gehashte Passwort zu generieren. Ersetzen Sie schließlich das Klartext-Passwort durch das gehashte Passwort in der Datenbank.

Erstellen Sie db.js und konfigurieren Sie die Datenbank.

const Mungo = require("Mungo");
Mungo. Versprechen = global. Versprechen;
const dbUrl = "mongodb://localhost/user";
const connect = async () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;
db.on("Fehler", () => {
console.log("Konnte keine Verbindung herstellen");
});
db.once("öffnen", () => {
console.log("> Erfolgreich mit Datenbank verbunden");
});
};
module.exports = { verbinden };

Stellen Sie in app.js eine Verbindung zur Datenbank her.

// mit db verbinden
const db = require('./db');
db.connect();

Schritt 3: Passport einrichten

Installieren Reisepass und Pass-lokal. Sie werden diese Pakete verwenden, um Benutzer zu registrieren und sich anzumelden.

npm i pass
npm i pass-lokal

Erstellen Sie eine neue Datei, PassportConfig.js, und importieren Pass-lokal und das userModel.js.

const LocalStraregy = require("passport-local").Strategy;
const User = require(./userModel");

Konfigurieren Sie Passport, um die Benutzerregistrierung zu verarbeiten.

const LocalStrategy = require("passport-local");
const User = require(./userModel");
module.exports = (Pass) => {
Pass.use(
"lokale Anmeldung",
neue LokaleStrategie(
{
BenutzernameFeld: "E-Mail",
Passwortfeld: "Passwort",
},
async (E-Mail, Passwort, fertig) => {
Versuchen {
// prüfen, ob der Benutzer existiert
const userExists = await User.findOne({ "email": email });
if (userExistiert) {
Rückgabe erledigt (null, falsch)
}
// Erstellen Sie einen neuen Benutzer mit den bereitgestellten Benutzerdaten
const user = await User.create ({ E-Mail, Passwort });
return done (null, user);
} Fang (Fehler) {
erledigt (Fehler);
}
}
)
);
}

Im obigen Code prüfen Sie, ob die E-Mail bereits verwendet wird. Wenn die E-Mail nicht existiert, registrieren Sie den Benutzer. Beachten Sie, dass Sie auch das Benutzernamenfeld so einstellen, dass es eine E-Mail akzeptiert. Standardmäßig, Pass-lokal erwartet einen Benutzernamen, also müssen Sie ihm mitteilen, dass Sie stattdessen eine E-Mail weitergeben.

Verwenden Pass-lokal um auch die Benutzeranmeldung zu handhaben.

module.exports = (Pass) => {
Pass.use(
"lokale Anmeldung",
neue lokale Strategie (
...
)
);
Pass.use(
"Lokales Login",
neue LokaleStrategie(
{
BenutzernameFeld: "E-Mail",
Passwortfeld: "Passwort",
},
async (E-Mail, Passwort, fertig) => {
Versuchen {
const user = warte auf User.findOne({ email: email });
if (!user) return done (null, false);
const isMatch = await user.matchPassword (Passwort);
if (!isMatch)
return done (null, falsch);
// Wenn die Passwörter übereinstimmen, geben Sie den Benutzer zurück
return done (null, user);
} Fang (Fehler) {
console.log (Fehler)
return done (Fehler, falsch);
}
}
)
);
};

Überprüfen Sie hier, ob der Benutzer in der Datenbank existiert, und wenn ja, überprüfen Sie, ob das angegebene Passwort mit dem in der Datenbank übereinstimmt. Beachten Sie, dass Sie auch die anrufen matchPassword() Methode auf dem Benutzermodell, also gehen Sie zu userModel.js Datei und füge sie hinzu.

UserSchema.methods.matchPassword = asynchrone Funktion (Passwort) {
Versuchen {
return await bcrypt.compare (Passwort, this.password);
} Fang (Fehler) {
neuen Fehler werfen (Fehler);
}
};

Diese Methode vergleicht das Passwort des Benutzers mit dem in der Datenbank und gibt bei Übereinstimmung „true“ zurück.

Schritt 4: Richten Sie Authentifizierungsrouten ein

Sie müssen nun die Endpunkte erstellen, an die Benutzer Daten senden. An erster Stelle steht die Anmelderoute, die die E-Mail-Adresse und das Passwort eines neuen Benutzers akzeptiert.

Im app.jsverwenden Sie die Passport-Authentifizierungs-Middleware, die Sie gerade erstellt haben, um den Benutzer zu registrieren.

app.post(
 "/auth/anmeldung",
Passport.Authenticate ('lokale Anmeldung', {Sitzung: falsch}),
(req, res, next) => {
// Anmeldung
res.json({
Benutzer: req.Benutzer,
});
}
);

Verwandt: Authentifizierung vs. Autorisierung: Was ist der Unterschied?

Bei Erfolg sollte die Anmelderoute den erstellten Benutzer zurückgeben.

Erstellen Sie als Nächstes die Anmelderoute.

app.post(
"/auth/login",
Passport.Authenticate ('lokale Anmeldung', { Sitzung: falsch }),
(req, res, next) => {
// Anmeldung
res.json({
Benutzer: req.Benutzer,
});
}
);

Schritt 5: Geschützte Routen hinzufügen

Bisher haben Sie verwendet Reisepass eine Middleware zu erstellen, die einen Benutzer in der Datenbank registriert, und eine andere, die es einem registrierten Benutzer ermöglicht, sich anzumelden. Als Nächstes erstellen Sie eine Autorisierungs-Middleware, um vertrauliche Routen mit einem JSON-Webtoken (JWT) zu schützen. Um die JWT-Autorisierung zu implementieren, müssen Sie:

  • JWT-Token generieren.
  • Übergeben Sie das Token an den Benutzer. Der Benutzer sendet es in Autorisierungsanfragen zurück.
  • Überprüfen Sie das vom Benutzer zurückgesendete Token.

Sie werden die verwenden jsonwebtoken Paket zur Handhabung von JWTs.

Führen Sie den folgenden Befehl aus, um es zu installieren.

npm und jsonwebtoken

Generieren Sie als Nächstes ein Token für jeden Benutzer, der sich erfolgreich anmeldet.

Im app.js, importieren jsonwebtoken und ändern Sie die Anmelderoute wie unten.

app.post(
"/auth/login",
Passport.Authenticate ('lokale Anmeldung', { Sitzung: falsch }),
(req, res, next) => {
// Anmeldung
jwt.sign({user: req.user}, 'secretKey', {expiresIn: '1h'}, (err, token) => {
wenn (fehler) {
Rückgabe res.json({
Meldung: „Anmeldung fehlgeschlagen“,
Token: null,
});
}
res.json({
Zeichen
});
})
}
);

In einer realen Anwendung würden Sie einen komplizierteren geheimen Schlüssel verwenden und ihn in einer Konfigurationsdatei speichern.

Die Anmelderoute gibt bei Erfolg ein Token zurück.

Verwenden Pass-jwt Zugang zu geschützten Routen.

npm i pass-jwt

Im PassportConfig.js, konfigurieren Sie die Pass-jwt.

const JwtStrategy = require("passport-jwt").Strategie;
const { ExtractJwt } = require("passport-jwt")
module.exports = (Pass) => {
Pass.use(
"Lokales Login",
neue LokaleStrategie(
...
);
Pass.use(
neue JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromHeader("Autorisierung"),
secretOrKey: "secretKey",
},
async (jwtPayload, fertig) => {
Versuchen {
// Benutzer extrahieren
const user = jwtPayload.user;
erledigt (null, Benutzer);
} Fang (Fehler) {
fertig (Fehler, falsch);
}
}
)
);
};

Beachten Sie, dass Sie das JWT aus dem Autorisierungsheader statt aus dem Anforderungstext extrahieren. Dadurch wird verhindert, dass Hacker eine Anfrage abfangen und sich den Token schnappen.

Zu sehen, wie Pass-jwt Wachrouten, erstellen Sie eine geschützte Route in app.js.

app.get(
"/benutzer/geschützt",
Passport.Authenticate("jwt", { Sitzung: falsch }),
(req, res, next) => {
res.json({Benutzer: req.Benutzer});
}
);

Nur eine Anfrage mit einem gültigen JWT gibt die Benutzerdaten zurück.

Jetzt sind Sie bereit, Ihre Benutzerauthentifizierung auf die nächste Stufe zu bringen

In diesem Lernprogramm haben Sie gelernt, wie Sie mithilfe von Passport Benutzer mithilfe einer E-Mail und eines Kennworts authentifizieren können. Es mag auf den ersten Blick entmutigend erscheinen, aber der Prozess ist relativ einfach. Sie können sogar noch weiter gehen und von Passport unterstützte Identitätsanbieter von Drittanbietern wie Twitter, Facebook und Google verwenden.

Was ist Benutzerauthentifizierung und wie funktioniert sie?

Es ist wichtig, die Grundlagen der Benutzerauthentifizierung zu verstehen, um ein Höchstmaß an Sicherheit für Ihre Online-Konten zu gewährleisten. Tauchen wir also ein.

Lesen Sie weiter

TeilenTwitternEmail
Verwandte Themen
  • Programmierung
  • Programmierung
  • Programmiersprachen
  • Programmierwerkzeuge
Über den Autor
Maria Gathoni (8 veröffentlichte Artikel)

Mary Gathoni ist eine Softwareentwicklerin mit einer Leidenschaft für die Erstellung technischer Inhalte, die nicht nur informativ, sondern auch ansprechend sind. Wenn sie nicht gerade programmiert oder schreibt, trifft sie sich gerne mit Freunden und ist draußen.

Mehr von Mary Gathoni

Abonniere unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um sich anzumelden