a display case filled with lots of stuffed animals

Bearer Token Authentifizierung in Node.js

In modernen Webanwendungen ist die sichere Authentifizierung von Nutzern unerlässlich. Eine verbreitete Methode hierfür ist die Verwendung von Bearer Tokens, insbesondere in Verbindung mit JSON Web Tokens (JWT). In diesem Artikel erläutern wir, was Bearer Tokens sind, wie sie funktionieren und wie Sie sie in einer Node.js-API implementieren können.

Was sind Bearer Tokens?

Bearer Tokens sind Zugriffsschlüssel, die in der HTTP-Authorization-Header einer Anfrage übermittelt werden, um dem Server mitzuteilen, dass der Absender berechtigt ist, auf geschützte Ressourcen zuzugreifen. Der Begriff „Bearer“ bedeutet dabei, dass der Inhaber des Tokens Zugriff auf die Ressource hat. Diese Tokens werden häufig im Kontext von OAuth 2.0 und JWT verwendet. Ein JWT ist ein spezielles Format eines Bearer Tokens, das Informationen über den Nutzer sowie eine Ablaufzeit enthält und mit einem geheimen Schlüssel signiert ist.

Ein Bearer Token, insbesondere in Form eines JSON Web Tokens (JWT), besteht aus drei Teilen: Header, Payload und Signatur. Der Header enthält Informationen über den Typ des Tokens und den verwendeten Signaturalgorithmus. Die Payload beinhaltet sogenannte „Claims“, also Aussagen über eine Entität (z. B. den Benutzer) und zusätzliche Daten. Die Signatur dient der Verifizierung der Integrität des Tokens.

Die Payload kann verschiedene Informationen enthalten, darunter:

  • Issuer (iss): Der Aussteller des Tokens.
  • Subject (sub): Die Identität des Token-Inhabers.
  • Audience (aud): Die Zielgruppe, für die der Token bestimmt ist.
  • Expiration Time (exp): Der Zeitpunkt, ab dem der Token nicht mehr gültig ist.
  • Issued At (iat): Der Zeitpunkt, zu dem der Token erstellt wurde.
  • Benutzerdefinierte Claims: Zusätzliche Informationen wie Benutzerrollen oder Berechtigungen.

Ein Beispiel für die Payload eines dekodierten JWT könnte wie folgt aussehen:

{
  "sub": "1234567890",
  "name": "Max Mustermann",
  "admin": true,
  "iat": 1516239022
}

In diesem Beispiel repräsentiert sub die eindeutige Benutzer-ID, name den Namen des Benutzers, admin gibt an, ob der Benutzer Administratorrechte besitzt, und iat den Zeitpunkt der Token-Erstellung in Unix-Zeit. (jwt.io)

Es ist wichtig zu beachten, dass die im Token enthaltenen Informationen von der spezifischen Implementierung und den Anforderungen der Anwendung abhängen.

Funktionsweise von Bearer Tokens

Der typische Ablauf bei der Verwendung von Bearer Tokens sieht wie folgt aus:

  1. Der Client authentifiziert sich beim Server und erhält ein Token.
  2. Dieses Token wird bei nachfolgenden Anfragen im Authorization-Header mitgesendet.
  3. Der Server überprüft das Token und gewährt bei erfolgreicher Validierung Zugriff auf die angeforderten Ressourcen.

Eine HTTP-Anfrage mit einem Bearer Token könnte beispielsweise so aussehen:

GET /geschuetzter-bereich
Host: api.beispiel.de
Authorization: Bearer <token>

Implementierung von JWT in einer Node.js-API

Um JWT zur Authentifizierung in einer Node.js-Anwendung mit Express zu nutzen, geh wie folgt vor:

1. Installation der benötigten Pakete

Installiere die folgenden Pakete:

  • jsonwebtoken für das Erstellen und Verifizieren von JWTs.
  • express-jwt für die Integration von JWT in Express.

Führe dazu den folgenden Befehl aus:

npm install jsonwebtoken express-jwt

2. Einrichtung der API mit JWT-Authentifizierung

Erstelle eine einfache Express-Anwendung und integriere die JWT-Authentifizierung:

const express = require('express');
const jwt = require('jsonwebtoken');
const expressJwt = require('express-jwt');

const app = express();
const geheimnis = 'Ihr-geheimer-Schluessel'; // Bewahren diesen sicher auf

// Middleware zum Schutz von Routen mit JWT
const jwtMiddleware = expressJwt({ secret: geheimnis, algorithms: ['HS256'] });

app.use(express.json()); // Zum Parsen von JSON-Anfragen

// Route zum Einloggen und Ausstellen eines JWT
app.post('/einloggen', (req, res) => {
  const { benutzername, passwort } = req.body;

  // In einer realen Anwendung würde hier die Benutzerdaten validiert werden
  if (benutzername === 'benutzer' && passwort === 'passwort') {
    // JWT erstellen
    const token = jwt.sign({ benutzername }, geheimnis, { expiresIn: '1h' });
    return res.json({ token });
  }

  return res.status(401).json({ nachricht: 'Ungültige Anmeldedaten' });
});

// Geschützte Route, nur mit gültigem JWT zugänglich
app.get('/geschuetzter-bereich', jwtMiddleware, (req, res) => {
  res.send('Sie haben Zugriff auf den geschützten Bereich!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server läuft auf Port ${PORT}`);
});

3. Testen der API

  • Einloggen und Token erhalten: Sende eine POST-Anfrage an /einloggen mit den Anmeldedaten, um ein JWT zu erhalten.
  • Zugriff auf geschützte Ressourcen: Verwende das erhaltene Token, um auf geschützte Endpunkte zuzugreifen, indem es im Authorization-Header der Anfrage mitgesendet wird.

Vorteile von JWT

  • Zustandslosigkeit: Der Server muss keine Sitzungsdaten speichern, da alle notwendigen Informationen im Token enthalten sind.
  • Sicherheit: Durch die Signatur des Tokens kann der Server dessen Integrität und Authentizität überprüfen.
  • Flexibilität: JWTs können zusätzliche Informationen wie Benutzerrollen oder Berechtigungen enthalten und haben eine definierte Ablaufzeit.

Durch die Implementierung von JWT in Ihrer Node.js-API kannst Du eine effiziente und sichere Methode zur Authentifizierung und Autorisierung von Nutzern bereitstellen.

Viel Spaß beim Ausprobieren!