Node.js-Module: Passport

Node.js-Module: Authentifizierung mit Passport
Kommentare

Das Schreiben von Logdateien, der Upload von Dateien und die Authentifizierung sind wahrscheinlich die Problemstellungen, mit denen man in der Webentwicklung am häufigsten konfrontiert wird. Glücklicherweise gibt es für all diese Aufgaben bereits vorgefertigte Lösungen.

Heute möchte ich Ihnen mit Passport eine Erweiterung für Express vorstellen, mit der Sie mit wenig Aufwand eine flexible Authentifizierung in Ihrer Applikation umsetzen können.

Bei der Implementierung von Webapplikationen mit Node.js wird sehr häufig Express als Framework eingesetzt. Express basiert auf dem HTTP-Modul von Node.js und erweitert es um Features wie Routing und ein Plug-in-Konzept mit dem Namen Middleware. Express ist das am häufigsten verwendete Web-Application-Framework für Node.js. StrongLoop, das Unternehmen hinter Express, wurde mittlerweile von IBM aufgekauft. Das bedeutet für Sie als Entwickler, dass Sie sowohl auf ein großes Unternehmen im Hintergrund als auch auf eine der größten Communities im Node.js-Bereich setzen.

Bei der Beantwortung von Anfragen werden in einer Express-Applikation Callback-Funktionen nach bestimmten Regeln aufgerufen, um die Antwort an den Client zu generieren. Meist wird eine bestimmte Funktion aufgrund des URL-Pfads und der HTTP-Methode ausgewählt und ausgeführt. Das Konzept der Middleware sieht vor, dass nicht nur eine Callback-Funktion ausgeführt wird, sondern beliebig viele Funktionen zwischen der eingehenden Anfrage und der ausgehenden Antwort stehen können. Diese zwischengeschalteten Funktionen werden auch als Middleware bezeichnet und dienen dazu, den eingehenden Request auszuwerten oder die Response mit Informationen anzureichern. Eine solche Middleware-Funktion eignet sich also hervorragend, um die Authentifizierung umzusetzen.

Passport ist eine konkrete Implementierung einer Middleware, die eine flexible Lösung für die Authentifizierung in einer Webapplikation bietet. Zu diesem Zweck verfolgt Passport, wie auch Express, einen modularen Aufbau. Der Kern von Passport kümmert sich darum, die Infrastruktur für die Authentifizierung zur Verfügung zu stellen. Die konkrete Implementierung übernehmen die sogenannten Strategies. Das sind kleine Module, die separat installiert werden können und Ihnen beispielsweise einen Log-in über Twitter, Facebook oder GitHub ermöglichen.

Installation

Die Installation erfolgt wie gewohnt über npm. Mit dem Kommando npm install –save passport installieren Sie Passport und halten es als Abhängigkeit in Ihrer lokalen package.json-Datei fest. Um einen Benutzer zu authentifizieren, müssen Sie lediglich Ihre Strategy konfigurieren und anschließend die authenticate-Methode von Passport aufrufen. Ist der Benutzer nicht berechtigt, wird die Anfrage standardmäßig mit dem HTTP-Statuscode 401 abgewiesen. Alternativ können Sie auch festlegen, dass Sie die Anfrage beispielsweise auf die Log-in-Seite Ihrer Applikation weiterleiten möchten. Wie die Authentifizierung im Detail funktioniert, sehen Sie im folgenden Beispiel mit der Local Strategy.

Local Strategy – einfache Authentifizierung mit Benutzername und Passwort

Die einfachste Variante, um einen Benutzer mit Passport zu authentifizieren, ist die Verwendung der Local Strategy. Sie erwartet, dass der Benutzername und das Passwort mit dem eingehenden Request gesendet werden. Die Überprüfung, ob die übergebene Kombination korrekt ist, bleibt Ihnen überlassen. Sie können hier sowohl eine Textdatei als auch eine beliebige Datenbank als Datenquelle verwenden. Bevor Sie jedoch diese Strategy verwenden können, müssen Sie sie zunächst einmal installieren. Das geschieht wieder über npm mit npm install –save passport-local. Danach können Sie Passport in Ihre Applikation integrieren. Listing 1 zeigt eine Minimalimplementierung einer Express-Applikation mit Passport.

 

const express = require('express');
const passport = require('passport');

var LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
 function(username, password, done) {
  if (username === 'admin' && password === 'secret') {
   return done(null, {name: 'admin'});
  }
  return done(null, false);
 }
));
passport.serializeUser(function(user, cb) {
 cb(null, user);
});
passport.deserializeUser(function(user, cb) {
 cb(null, user);
});

const app = express();

app.use(passport.initialize());
app.get(
 '/secret', passport.authenticate('local'), (req, res) => {
  res.send('Hello Authenticated User!');
 }
);

app.listen(8080);

In unserem Beispiel werden zunächst sämtliche benötigten Bibliotheken geladen. Danach werden Passport und die Local Strategy mit der passport.use-Methode konfiguriert. In diesem Beispiel wird nur geprüft, ob der Benutzer im Request die Felder username und password mit den Werten admin und secret korrekt übermittelt hat. Zum Test können Sie diese beiden Werte einfach als get-Parameter übergeben. Der entsprechende URL lautet dann http://localhost:8080/secret?username=admin&password=secret.

Die Callback-Funktionen der serializeUser- und deserializeUser-Methoden werden von Passport dazu benutzt, den Benutzer optional in die Session zu speichern und zu einem späteren Zeitpunkt die Informationen wieder zu verwenden. Auch wenn Sie dieses Feature nicht nutzen, müssen Sie beide Funktionen aufrufen, ansonsten wird ein Fehler geworfen. Mit der Zeile app.use(passport.initialize()) aktivieren Sie schließlich Passport für Ihre Applikation. Bei der Definition der /secret-Route sehen Sie, wie Sie eine Route mit Passport schützen können. Versuchen Sie nun, mit einem falschen Passwort auf die /secret-Seite zuzugreifen, wird das mit der Fehlermeldung „401 Unauthorized“ quittiert.

Go for PHP Developers

mit Terrence Ryan (google)

Everything you need to know about PHP 7.2

mit Sebastian Bergmann (thePHP.cc)

Redirect

Eine Anfrage mit einer Antwort aus dem 400er-Bereich abzuweisen, ist häufig nicht erstrebenswert. Oft handelt es sich bei solchen Zugriffen nicht um böswillige Angriffe, sondern um Benutzer, die sich lediglich noch nicht angemeldet haben. Eine bessere Art, mit solchen Anfragen umzugehen, ist es, die Benutzer zur Log-in-Seite weiterzuleiten.

Zu diesem Zweck akzeptiert die authenticate-Methode von Passport als zweites Argument ein Objekt, das die Eigenschaften successRedirect und failureRedirect haben kann. Der successRedirect sorgt bei erfolgreicher Authentifizierung dafür, dass der Benutzer auf eine weitere Seite weitergeleitet wird. Häufig wird das bei einem POST auf die Log-in-Seite verwendet. Der failureRedirect leitet den Benutzer bei einer fehlgeschlagenen Authentifizierung auf die angegebene Route weiter.

 
app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));

Session

Wie bereits erwähnt, verfügt Passport über die Möglichkeit, die Anmeldung in einer Session zu persistieren, sodass sich der Benutzer nicht bei jedem Besuch einer neuen Seite wieder anmelden muss. Damit das funktionieren kann, müssen Sie das Paket express-session mit npm installieren. Nach erfolgter Installation konfigurieren Sie zunächst die Session-Unterstützung von Express und rufen anschließend app.use(passport.session()); auf, um das Session-Feature von Passport zu aktivieren.

Weitere Strategies

Passport ist modular aufgebaut, was bedeutet, dass jeder eine Strategy implementieren kann. Mittlerweile existieren über dreihundert Strategies für Passport, eine Übersicht finden Sie in der Passport-Dokumentation. Hier können Sie die Strategies durchsuchen und werden auf die Projektseite der jeweiligen Strategy weitergeleitet. Es gibt beispielsweise Strategies für JSON Web Tokens, Slack und nahezu jeden verbreiteten Internetdienst.

Fazit

Passport ist ein Open-Source-Projekt, das sich darauf konzentriert, das Problem der Authentifizierung in Ihrer Applikation zu lösen. Leider wird das Projekt aktuell nicht wirklich aktiv weiterentwickelt. Da die Strategies jedoch von der eigentlichen Bibliothek entkoppelt sind und auch der komplette Quellcode von Passport auf GitHub verfügbar ist, stellt das kein Problem dar.

Passport ist leichtgewichtig, flexibel und deckt nahezu jeden Anwendungsfall ab. Müssen Sie also für Ihre Express-Applikation eine Authentifizierung umsetzen, sollten Sie den Einsatz von Passport zumindest prüfen.

PHP Magazin

Entwickler MagazinDieser Artikel ist im PHP Magazin erschienen. Das PHP Magazin deckt ein breites Spektrum an Themen ab, die für die erfolgreiche Webentwicklung unerlässlich sind.

Natürlich können Sie das PHP Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -