Arbeit mit JWT-Token in TypeScript: Bibliothek jsonwebtoken und vollständige Anleitung

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

JWT-Token in TypeScript: Vollständige Anleitung mit der Bibliothek jsonwebtoken

\n\n

JSON Web Token (JWT) ist ein offener Standard (RFC 7519) zur Erstellung von Zugriffstoken, die auf dem JSON-Format basieren. JWT wird häufig für die Authentifizierung und den Informationsaustausch zwischen Client und Server verwendet. In TypeScript wird die Arbeit mit JWT dank der strengen Typisierung besonders komfortabel und sicher. In diesem Artikel betrachten wir, wie die beliebte Bibliothek jsonwebtoken in TypeScript zum Erstellen, Überprüfen und Verwalten von JWT-Token verwendet wird.

\n\n

Installation und Einrichtung

\n\n

Um zu beginnen, installieren wir die erforderlichen Pakete:

\n\n
npm install jsonwebtoken\nnpm install -D @types/jsonwebtoken
\n\n

Das erste Paket ist die Bibliothek selbst, das zweite sind die TypeScript-Typen dafür. Nach der Installation erstellen wir eine Datei jwt.service.ts, in der wir die gesamte Logik für die Arbeit mit Token speichern.

\n\n

Erstellen eines JWT-Tokens

\n\n

Die Hauptfunktion von jsonwebtoken ist sign(). Betrachten wir ihre Verwendung mit Typisierung:

\n\n
import jwt from 'jsonwebtoken';\n\ninterface TokenPayload {\n  userId: number;\n  email: string;\n  role: 'user' | 'admin';\n}\n\nconst createAccessToken = (payload: TokenPayload): string => {\n  const secret = process.env.JWT_SECRET || 'default_secret';\n  const options: jwt.SignOptions = {\n    expiresIn: '15m', // Token ist 15 Minuten gültig\n    algorithm: 'HS256',\n  };\n\n  return jwt.sign(payload, secret, options);\n};
\n\n

Wichtig: Speichern Sie den geheimen Schlüssel niemals im Code. Verwenden Sie Umgebungsvariablen (.env-Datei).

\n\n

Verifizierung und Dekodierung des Tokens

\n\n

Zur Überprüfung der Authentizität des Tokens wird die Funktion verify() verwendet. Sie prüft automatisch die Signatur und die Gültigkeitsdauer:

\n\n
const verifyToken = (token: string): TokenPayload => {\n  const secret = process.env.JWT_SECRET || 'default_secret';\n\n  try {\n    const decoded = jwt.verify(token, secret) as TokenPayload;\n    return decoded;\n  } catch (error) {\n    if (error instanceof jwt.TokenExpiredError) {\n      throw new Error('Token abgelaufen');\n    }\n    if (error instanceof jwt.JsonWebTokenError) {\n      throw new Error('Ungültiges Token');\n    }\n    throw error;\n  }\n};
\n\n

Beachten Sie die Typumwandlung as TokenPayload – dies stellt sicher, dass TypeScript die Struktur der dekodierten Daten kennt.

\n\n

Refresh-Token: Verlängerung der Sitzung

\n\n

In der Praxis haben Access-Token eine kurze Lebensdauer (15-30 Minuten), daher wird ein Mechanismus zu ihrer Aktualisierung benötigt. Dazu wird ein Refresh-Token mit einer längeren Lebensdauer verwendet:

\n\n
const createRefreshToken = (payload: TokenPayload): string => {\n  const secret = process.env.JWT_REFRESH_SECRET || 'refresh_secret';\n  const options: jwt.SignOptions = {\n    expiresIn: '7d', // eine Woche\n    algorithm: 'HS256',\n  };\n\n  return jwt.sign(payload, secret, options);\n};\n\nconst refreshAccessToken = (refreshToken: string): string => {\n  const secret = process.env.JWT_REFRESH_SECRET || 'refresh_secret';\n\n  try {\n    const decoded = jwt.verify(refreshToken, secret) as TokenPayload;\n    // Es kann geprüft werden, ob das Refresh-Token in der Datenbank widerrufen wurde\n    return createAccessToken({\n      userId: decoded.userId,\n      email: decoded.email,\n      role: decoded.role,\n    });\n  } catch {\n    throw new Error('Ungültiges Refresh-Token');\n  }\n};
\n\n

Middleware für Express in TypeScript

\n\n

Die Integration von JWT mit Express.js erfordert die Erstellung einer Middleware. Hier ist die typisierte Version:

\n\n
import { Request, Response, NextFunction } from 'express';\n\ninterface AuthRequest extends Request {\n  user?: TokenPayload;\n}\n\nconst authMiddleware = (req: AuthRequest, res: Response, next: NextFunction) => {\n  const authHeader = req.headers.authorization;\n\n  if (!authHeader || !authHeader.startsWith('Bearer ')) {\n    return res                    

Empfehlungen