Autorisierung und Authentifizierung in TypeScript: Vollständiger Leitfaden
In der modernen Webentwicklung ist die Anwendungssicherheit ein kritisch wichtiger Aspekt. TypeScript, als Erweiterung von JavaScript, bietet leistungsstarke Werkzeuge zur Erstellung typisierter und sicherer Systeme für Autorisierung und Authentifizierung. In diesem Artikel werden wir die wichtigsten Konzepte, beliebte Bibliotheken erläutern und praktische Beispiele in TypeScript schreiben.
Grundlegende Begriffe
Bevor wir zum Code übergehen, ist es wichtig, zwei Begriffe zu unterscheiden:
- Authentifizierung (Authentication) — Überprüfung der Identität des Benutzers (Wer sind Sie?). Dies erfolgt normalerweise über Login/Passwort, Token oder Biometrie.
- Autorisierung (Authorization) — Festlegung der Zugriffsrechte (Was dürfen Sie tun?). Zum Beispiel Zugriff auf das Admin-Panel nur für die Rolle "admin".
Beliebte Bibliotheken für TypeScript
Im TypeScript/Node.js-Ökosystem gibt es mehrere bewährte Lösungen:
- Passport.js — die beliebteste Bibliothek für Authentifizierungsstrategien (local, JWT, OAuth). Sie hat eine hervorragende TypeScript-Unterstützung durch die Typen
@types/passport. - jsonwebtoken — Arbeit mit JWT (JSON Web Tokens). Vollständig typisiert.
- bcrypt — Hashing von Passwörtern. Wird zusammen mit anderen Bibliotheken verwendet.
- express-session — Verwaltung von Sessions auf dem Server.
Beispiel 1: Grundlegende Authentifizierung mit JWT
Betrachten wir die Erstellung eines einfachen Systems mit Zugriffstoken. Installieren Sie die Abhängigkeiten:
npm install express jsonwebtoken bcrypt @types/express @types/jsonwebtoken @types/bcryptErstellen wir einen Server mit Registrierung und Login:
import express, { Request, Response } from 'express';import jwt from 'jsonwebtoken';import bcrypt from 'bcrypt';
const app = express();app.use(express.json());
const SECRET_KEY = 'your-secret-key';const users: { username: string; passwordHash: string }[] = [];
// Registrierungapp.post('/register', async (req: Request, res: Response) => { const { username, password } = req.body; const passwordHash = await bcrypt.hash(password, 10); users.push({ username, passwordHash }); res.status(201).json({ message: 'User created' });});
// Loginapp.post('/login', async (req: Request, res: Response) => { const { username, password } = req.body; const user = users.find(u => u.username === username); if (!user) return res.status(401).json({ error: 'Invalid credentials' });
const isValid = await bcrypt.compare(password, user.passwordHash); if (!isValid) return res.status(401).json({ error: 'Invalid credentials' });
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' }); res.json({ token });});
// Geschützte Routeapp.get('/protected', (req: Request, res: Response) => { const authHeader = req.headers.authorization; if (!authHeader) return res.status(401).json({ error: 'No token provided' });
const token = authHeader.split(' ')[1]; // Bearer token try { const decoded = jwt.verify(token, SECRET_KEY); res.json({ message: 'Access granted', user: decoded }); } catch { res.status(403).json({ error: 'Invalid token' }); }});
app.listen(3000, () => console.log('Server running on port 3000'));Beispiel 2: Middleware für Autorisierung mit Rollen
Fügen wir ein Rollenmodell hinzu. Erstellen wir eine typisierte Middleware:
interface JwtPayload { username: string; role: 'user' | 'admin';}
// Middleware zur Überprüfung der Authentifizierungfunction authenticate(req: Request, res: Response, next: Function) { const token = req.headers.authorization?.split(' ')[1]; if (!token) return res.status(401).json({ error: 'Unauthorized' });
try { const decoded = jwt.verify(token, SECRET_KEY) as JwtPayload; (req as any).user = Auch in der Bibliothek
Generierung von PDF-Berichten in Kotlin: iText, Apache PDFBox, OpenPDF
Arbeiten mit Apache Kafka in C++: Die Bibliothek librdkafka und praktische Beispiele
Arbeiten mit Daten in Kotlin: Überblick über Bibliotheken und Werkzeuge
golang-jwt für Go: Vollständige Anleitung mit Beispielen