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 dotenvexpress— Web-Frameworkbcryptjs— Passwort-Hashingjsonwebtoken— Erstellung und Überprüfung von JWTdotenv— 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_SECRETin 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.