Als Entwickler liegt es in Ihrer Verantwortung, die Daten Ihrer Benutzer durch Authentifizierung zu schützen. Sie können Passport.js verwenden, um Benutzer in einer Node- und Postgres-Anwendung zu authentifizieren.
Erstellen Sie zunächst einen Knotenserver mit Endpunkten zum Registrieren, Anmelden und Abmelden von Benutzern. Sie können Passport die Authentifizierung überlassen, um den unbefugten Zugriff auf Ihre Anwendung einzuschränken.
Erstellen einer Benutzertabelle
Für die Benutzerauthentifizierung verwenden Sie eine E-Mail und ein Passwort. Das bedeutet, dass die Benutzertabelle ein E-Mail- und ein Passwortfeld enthalten muss. Erstellen Sie in der psql-Eingabeaufforderung eine neue Datenbank namens nodeapp:
SCHAFFENDATENBANK Knotenapp;
Erstellen Sie als Nächstes eine Tabelle zum Speichern der Benutzer:
SCHAFFENTISCHBenutzer (
id INT IMMER ALS IDENTITÄT PRIMÄRSCHLÜSSEL ERZEUGT,
E-Mail CHAR(128),
Passwort ZEICHEN(60)
);
Dieser Code erstellt eine neue Tabelle mit E-Mail, Passwort und einem automatisch generierten ID-Feld.
Erstellen eines Knotenservers
Node.js ist eine serverseitige JavaScript-Laufzeitumgebung, mit der wir schnell HTTP-Server erstellen können. Um das Erstellen des Servers und verschiedener HTTP-Routen zu vereinfachen, können Sie verwenden Express, ein Node.js-Webframework.
Führen Sie diesen Befehl aus, um einen neuen Ordner namens postgres-auth zu erstellen:
mkdir postgres-auth
Als nächstes initialisieren Sie npm:
npm init -y
Schließlich installieren Sie Express:
npm install express
Du kannst jetzt Erstellen Sie den Node-Webserver.
In einer neuen Datei namens index.js, fügen Sie Folgendes hinzu:
konst ausdrücken = benötigen("ausdrücken");
konst app = ausdrücken ();
app.use (express.json());
app.use (express.urlencoded({ erweitert: Stimmt }));
app.listen(3000, () => Konsole.log("Hört auf Port 3000"));
Das Ausführen dieses Codes startet den Server und protokolliert Folgendes in der Konsole:
Hören auf Port 3000
Verbindung zu PostgreSQL herstellen
Zu mit PostgreSQL verbinden verwenden node-postgres. node-postgres ist ein Verbindungstreiber, der eine Schnittstelle zwischen Node und Postgres bereitstellt.
Führen Sie Folgendes aus, um node-postrges über npm zu installieren:
npm installieren pg
Nachdem Sie diese Bibliothek installiert haben, erstellen Sie eine neue Datei mit dem Namen db.js und verbinden Sie es mit der Datenbank:
konst { Kunde } = benötigen("pg");
konst { Benutzer, Host, Datenbank, Passwort, Port } = benötigen("./dbConfig");konst Kunde = Neu Klient({
Benutzer,
Gastgeber,
Datenbank,
Passwort,
Hafen,
});
client.connect ();
Modul.exports = Kunde;
Die Client-Methode von node-postgres übernimmt die Details der Datenbank, mit der Sie sich verbinden. Dieses Programm importiert seine Verbindungsdetails aus einer Datei namens dbConfig. Erstellen Sie daher diese Datei und fügen Sie den folgenden Code hinzu:
Modul.exporte = {
Benutzer: "postgres",
host: "localhost",
Datenbank: "nodeapp",
Passwort: "IhrPasswort",
Hafen: 5432,
};
Erstellen Sie Datenbank-Hilfsfunktionen
Es ist immer eine gute Praxis, einzelne Funktionen zu verwenden, um mit der Datenbank zu interagieren. Sie erleichtern das Schreiben von Unit-Tests und verbessern die Wiederverwendbarkeit. Für den Anmeldeendpunkt müssen Sie zwei Funktionen erstellen:
- Um zu prüfen, ob die E-Mail bereits registriert ist.
- Um den Benutzer zu erstellen.
Ziel ist es, einen Benutzer nur dann zu registrieren, wenn er nicht in der Datenbank vorhanden ist.
Erstellen Sie eine neue Datei mit dem Namen helper.js und importieren Sie den Datenbankclient aus db.js:
konst Kunde = benötigen("./db.js")
Als nächstes fügen Sie eine neue Funktion namens emailExists() hinzu:
konst emailExistiert = asynchron (E-Mail) => {
konst Daten = erwarten client.query("SELECT * FROM user WHERE email=$1", [
Email,
]);
wenn (data.rowCount == 0) RückkehrFALSCH;
Rückkehr Daten.Zeilen[0];
};
Diese Funktion nimmt eine E-Mail und prüft, ob sie bereits verwendet wird. Dazu wird die SELECT-Klausel verwendet, die eine Zeile mit einem E-Mail-Feld zurückgibt, das mit dem vom registrierenden Benutzer bereitgestellten Wert übereinstimmt. Wenn die E-Mail nicht existiert, wird false zurückgegeben.
Um eine Funktion zu erstellen, die den Benutzer erstellt, fügen Sie helper.js eine Funktion namens createUser() hinzu:
konst createUser = asynchron (E-Mail, Passwort) => {
konst Salz = erwarten bcrypt.genSalt(10);
konst hash = erwarten bcrypt.hash (Passwort, Salz);konst Daten = erwarten client.query(
"EINFÜGEN IN Benutzer (E-Mail, Passwort) WERTE ($1, $2) RETURNING ID, E-Mail, Passwort",
[E-Mail, Hash]
);
wenn (data.rowCount == 0) RückkehrFALSCH;
Rückkehr Daten.Zeilen[0];
};
Diese Funktion übernimmt die E-Mail- und Passwortwerte. Es verwendet die INSERT-Klausel, um eine neue Zeile mit diesen Details zu erstellen, und gibt bei Erfolg den neu erstellten Benutzer zurück. Beachten Sie, dass Sie vor dem Speichern des Passworts Folgendes tun sollten hash es mit bcrypt. Es ist nie eine gute Idee, Passwörter als Klartext zu speichern. Wenn Hacker Zugriff auf Ihre Benutzerdatenbank erhalten, können sie leicht auf vertrauliche Informationen zugreifen.
Installieren Sie bcryptjs, um es zu verwenden:
npm bcryptjs installieren
Importieren Sie in helper.js bcryptjs:
konst bcrypt = benötigen("bcryptjs")
Durch die Verwendung von Bcryptjs speichert die Datenbank nur das verschlüsselte Passwort. Daher müssen Sie während der Anmeldung das vom Benutzer angegebene Klartext-Passwort und das gehashte Passwort in der Datenbank vergleichen. Dazu können Sie die von Bcryptjs bereitgestellte Vergleichsmethode verwenden.
Erstellen Sie eine Funktion namens matchPassword():
konst übereinstimmenPasswort = asynchron (Passwort, HashPasswort) => {
konst übereinstimmen = erwarten bcrypt.compare (Passwort, HashPasswort);
Rückkehr passen
};
Es empfängt das einfache Passwort und den Hash und verwendet dann Bcrypt.compare(), um festzustellen, ob das angegebene Passwort korrekt ist. Wenn dies der Fall ist, wird true zurückgegeben, andernfalls wird false zurückgegeben.
Dies sind alle Funktionen, die wir verwenden werden, um mit der Datenbank zu interagieren. Stellen Sie sicher, dass Sie alle am Ende exportieren:
Modul.exports = { emailExists, createUser, matchPassword };
Pass konfigurieren
Passport ist eine Node-Authentifizierungs-Middleware, die über 500 Authentifizierungsstrategien wie Social Login, JSON Web Tokens (JWT) und E-Mail-Authentifizierung bereitstellt. Wir werden letzteres verwenden, das die Passport-Local-Strategie bietet.
Verwenden Sie den folgenden Befehl, um Passport und Passport-Local zu installieren:
npm Passport installieren
npm installiert Passport-Local
Als nächstes konfigurieren Sie Passport, um bestehende Benutzer anzumelden und neue Benutzer zu registrieren.
Beginnen Sie mit dem Erstellen einer neuen Datei PassportConfig.js. Importieren Sie dann die lokale Passport-Strategie und die Datenbank-Hilfsfunktionen, die Sie gerade erstellt haben:
konst LocalStrategy = benötigen("Pass-lokal");
konst { emailExists, createUser, matchPassword } = benötigen("./Helfer");
Fügen Sie in derselben Datei Folgendes hinzu, um die Benutzeranmeldung einzurichten:
Modul.exports = (Reisepass) => {
Pass.use(
"lokale Anmeldung",
Neu LokaleStrategie(
{
BenutzernameFeld: "E-Mail",
Passwortfeld: "Passwort",
},
asynchron (E-Mail, Passwort, fertig) => {
Versuchen {
konst userExists = erwarten emailExistiert (E-Mail)wenn (BenutzerExistiert) {
Rückkehr erledigt(Null, FALSCH);
}
konst Benutzer = erwarten createUser (E-Mail, Passwort);
Rückkehr erledigt(Null, Benutzer);
} Fang (Error) {
erledigt (Fehler);
}
}
)
);
}
Da Passport-Local einen Benutzernamen und ein Passwort erwartet und Sie eine E-Mail verwenden, setzen Sie das Feld Benutzername auf eine E-Mail. Der Benutzer bzw. der Frontend-Teil dieser Anwendung sendet die E-Mail-Adresse und das Passwort im Anfragetext. Sie müssen die Werte jedoch nicht selbst extrahieren, da Passport dies im Hintergrund übernimmt.
Dieses Programm prüft zunächst mit der Funktion emailExists() aus helper.js, ob die E-Mail bereits vergeben ist. Wenn die E-Mail nicht in der Datenbank vorhanden ist, wird mit der Funktion createUser() ein neuer Benutzer erstellt. Schließlich gibt es das Benutzerobjekt zurück.
Um Benutzer anzumelden, fügen Sie PassportConfig.js Folgendes hinzu:
Modul.exports = (Reisepass) => {
Pass.use(
"lokale Anmeldung",
Neu LokaleStrategie(
// Anmelden
)
);
Pass.use(
"Lokales Login",
Neu LokaleStrategie(
{
BenutzernameFeld: "E-Mail",
Passwortfeld: "Passwort",
},
asynchron (E-Mail, Passwort, fertig) => {
Versuchen {
konst Benutzer = erwarten emailExists (E-Mail);
wenn (!Benutzer) Rückkehr erledigt(Null, FALSCH);
konst isMatch = erwarten matchPassword (Passwort, user.password);
wenn (!isMatch) Rückkehr erledigt(Null, FALSCH);
Rückkehr erledigt(Null, {Ich würde: Benutzeridentifikation, Email: Benutzer Email});
} Fang (Error) {
Rückkehr erledigt (Fehler, FALSCH);
}
}
)
);
};
Hier prüft das Programm zunächst, ob die E-Mail registriert ist. Wenn nicht, wird false zurückgegeben. Findet er die E-Mail, vergleicht er sein Passwort mit dem aus der Anfrage. Wenn die Passwörter übereinstimmen, meldet es den Benutzer an und gibt das Benutzerobjekt zurück.
Der letzte Schritt besteht darin, die API-Endpunkte zu erstellen:
- POST /auth/signup
- POST /auth/login
Beide Endpunkte erhalten eine E-Mail und ein Kennwort im Anfragetext. Sie enthalten auch die Middleware-Funktionen für die Passauthentifizierung, die wir gerade konfiguriert haben.
Importieren und konfigurieren Sie Passport in einer neuen Datei mit dem Namen server.js:
konst Reisepass = benötigen("Reisepass");
benötigen("./passportConfig")(Pass);
Fügen Sie dann die folgenden Routen hinzu:
app.post(
"/auth/Anmelden",
Passport.Authenticate("Lokale Anmeldung", { Sitzung: FALSCH }),
(req, res, next) => {
res.json({
Benutzer: req.Benutzer,
});
}
);
app.post(
"/auth/Anmeldung",
Passport.Authenticate("Lokale Anmeldung", { Sitzung: FALSCH }),
(req, res, next) => {
res.json({ Benutzer: req.user });
}
);
Beide Routen geben bei Erfolg ein JSON-Objekt zurück, das den Benutzer enthält.
Überprüfen Sie Ihre API mithilfe von Unit-Tests
Sie können Passport verwenden, um eine Node-Anwendung mit einer PostgreSQL-Anwendung zu authentifizieren. Sie haben API-Endpunkte erstellt, um Benutzer zu registrieren und anzumelden.
Während Sie REST-Clients wie Postman verwenden können, um zu testen, wie gut eine API funktioniert, ist das Schreiben von Komponententests viel einfacher. Mit Unit-Tests können Sie die einzelnen Teile Ihrer Anwendung testen. Auf diese Weise können Sie, selbst wenn ein Endpunkt ausfällt, die genaue Fehlerstelle lokalisieren. Eines der Tools, mit denen Sie Node-Anwendungen testen können, ist Jest.