Autorisierung und Authentifizierung in JavaScript (Node.js): vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Autorisierung und Authentifizierung in JavaScript (Node.js)



In der modernen Webentwicklung ist die Sicherheit von Benutzerdaten eine vorrangige Aufgabe. In diesem Leitfaden werden wir die wichtigsten Konzepte der Authentifizierung (Identitätsprüfung) und Autorisierung (Zugriffsverwaltung) in der Node.js-Umgebung erläutern. Sie erfahren, wie Sie Registrierung, Passwort-Login, die Verwendung von JWT-Tokens und den Schutz von Routen implementieren.



1. Grundlegende Begriffe

  • Authentifizierung — der Prozess der Identitätsbestätigung (z. B. per E-Mail+Passwort).
  • Autorisierung — die Prüfung, ob ein Benutzer berechtigt ist, eine Aktion auszuführen (Rolle admin/user).
  • JWT (JSON Web Token) — eine kompakte Methode zur Datenübertragung in Form eines Tokens, häufig für Sessions verwendet.
  • Passwort-Hashing — eine zwingende Sicherheitsanforderung (bcrypt, argon2).


2. Installation der Abhängigkeiten

Für die Arbeit benötigen wir die folgenden npm-Pakete:

npm install express bcryptjs jsonwebtoken dotenv


  • express — Web-Framework
  • bcryptjs — Passwort-Hashing
  • jsonwebtoken — Erstellung und Überprüfung von JWT
  • dotenv — Verwaltung von geheimen Schlüsseln


3. Einfache Registrierung und Passwort-Hashing

Erstellen wir ein einfaches Benutzermodell (als Beispiel verwenden wir ein Array im Speicher; in einem echten Projekt ersetzen Sie dies durch eine Datenbank):



const bcrypt = require('bcryptjs');const users = []; // DB-Simulation

async function registerUser(email, password) { const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(password, salt); users.push({ email, password: hashedPassword }); console.log('Benutzer registriert:', email);}

// Beispielaufruf:registerUser('user@example.com', 'myPassword123');


4. Authentifizierung mit JWT

Nach erfolgreichem Login stellen wir dem Client einen JWT-Token aus. Der Token enthält die Benutzer-ID und ein Ablaufdatum.



const jwt = require('jsonwebtoken');require('dotenv').config();

const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

function loginUser(email, password) { const user = users.find(u => u.email === email); if (!user) return null;

const isValid = bcrypt.compareSync(password, user.password); if (!isValid) return null;

// Token erstellen const token = jwt.sign( { userId: user.email, role: 'user' }, JWT_SECRET, { expiresIn: '1h' } ); return token;}


5. Middleware zum Schutz von Routen

Erstellen wir eine Middleware, die den JWT im Authorization-Header überprüft:



function authMiddleware(req, res, next) {  const authHeader = req.headers['authorization'];  const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN

if (!token) { return res.status(401).json({ message: 'Token nicht bereitgestellt' }); }

try { const decoded = jwt.verify(token, JWT_SECRET); req.user = decoded; // Benutzerdaten an die Anfrage übergeben next(); } catch (err) { return res.status(403).json({ message: 'Ungültiger Token' }); }}


6. Beispiel für die Verwendung in Express

Alles zusammenfügen — wir erstellen Routen für Login und geschütztes Profil:



const express = require('express');const app = express();app.use(express.json());

// Login-Routeapp.post('/api/login', (req, res) => { const { email, password } = req.body; const token = loginUser(email, password); if (!token) { return res.status(401).json({ message: 'Ungültige Anmeldedaten' }); } res.json({ token });});

// Geschützte Routeapp.get('/api/profile', authMiddleware, (req, res) => { res.json({ message: 'Zugriff gewährt', user: req.user });});

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


7. Wichtige Sicherheitshinweise

  • Verwenden Sie HTTPS in der Produktion, um Token-Abfangen zu verhindern.
  • Speichern Sie JWT_SECRET in Umgebungsvariablen, nicht im Code.
  • Setzen Sie eine kurze Token-Lebensdauer (z. B. 15 Minuten) und verwenden Sie Refresh-Tokens.
  • Verwenden Sie zur Speicherung von Passwörtern immer bcrypt oder argon2.
  • Implementieren Sie eine Ratenbegrenzung (Rate Limiting) für Login-Versuche.


Fazit

Wir haben die grundlegenden Konzepte der Authentifizierung und Autorisierung in Node.js behandelt. Dieses Fundament ermöglicht es Ihnen, sichere Webanwendungen mit Benutzerregistrierung, Token-basierten Sessions und geschützten Routen zu erstellen. Für Produktionssysteme fügen Sie unbedingt eine Datenbank (PostgreSQL, MongoDB) und zusätzliche Sicherheitsmaßnahmen hinzu.

Empfehlungen