JWT-Tokens in Go (Golang): Erstellung und Überprüfung mit Beispielen

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-Tokens in Go (Golang): Vollständige Anleitung

\n\n

JSON Web Tokens (JWT) sind ein offener Standard (RFC 7519) zur Erstellung von Zugriffstokens auf Basis von JSON. JWT wird häufig für die Authentifizierung und den Informationsaustausch zwischen Client und Server verwendet. In der Sprache Go (Golang) wird die Arbeit mit JWT-Tokens dank der Bibliothek golang-jwt/jwt einfach und effizient umgesetzt.

\n\n

In diesem Artikel werden wir die Erstellung, Signatur, Überprüfung und Verwendung von JWT-Tokens in Go im Detail besprechen. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler nützlich, die eine sichere Authentifizierung in ihre Golang-Projekte implementieren möchten.

\n\n

Installation der Bibliothek golang-jwt

\n\n

Für die Arbeit mit JWT in Go wird das Paket github.com/golang-jwt/jwt/v5 verwendet. Installieren Sie es mit dem Befehl:

\n\n
go get github.com/golang-jwt/jwt/v5
\n\n

Nach der Installation können Sie das Paket in Ihren Code importieren:

\n\n
import (\n    "github.com/golang-jwt/jwt/v5"\n)
\n\n

Struktur eines JWT-Tokens

\n\n

Ein JWT-Token besteht aus drei Teilen, die durch Punkte getrennt sind:

\n\n
    \n
  • Header — enthält den Tokentyp (JWT) und den Signaturalgorithmus (z.B. HS256 oder RS256).
  • \n
  • Payload (Nutzlast) — enthält die Daten (Claims), wie Benutzer-ID, Rolle, Ablaufdatum usw.
  • \n
  • Signature (Signatur) — wird basierend auf Header und Payload mit einem geheimen Schlüssel oder einem RSA/ECDSA-Schlüsselpaar erstellt.
  • \n
\n\n

Erstellung eines JWT-Tokens in Go

\n\n

Betrachten wir ein Beispiel zur Erstellung eines JWT-Tokens mit dem HMAC-SHA256 (HS256) Algorithmus. Dazu wird ein geheimer Schlüssel benötigt.

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n    // Geheimer Schlüssel (muss an einem sicheren Ort aufbewahrt werden)\n    secretKey := []byte("my_secret_key_12345")\n\n    // Claims (Behauptungen) erstellen\n    claims := jwt.MapClaims{\n        "user_id": 123,\n        "role":    "admin",\n        "exp":     time.Now().Add(time.Hour * 24).Unix(), // Token ist 24 Stunden gültig\n        "iat":     time.Now().Unix(),\n    }\n\n    // Token erstellen\n    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n\n    // Token mit dem geheimen Schlüssel signieren\n    tokenString, err := token.SignedString(secretKey)\n    if err != nil {\n        fmt.Println("Fehler bei der Token-Erstellung:", err)\n        return\n    }\n\n    fmt.Println("Erstellter JWT-Token:")\n    fmt.Println(tokenString)\n}
\n\n

Überprüfung und Parsen eines JWT-Tokens

\n\n

Zur Überprüfung der Authentizität des Tokens wird derselbe geheime Schlüssel verwendet. Es ist wichtig, die Gültigkeitsdauer und die Signatur zu prüfen.

\n\n
package main\n\nimport (\n    "fmt"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n    tokenString := "ihr_token_hier"\n    secretKey := []byte("my_secret_key_12345")\n\n    // Token parsen und überprüfen\n    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\n        // Signaturalgorithmus überprüfen\n        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\n            return nil, fmt.Errorf("unerwartete Signaturmethode: %v", token.Header["alg"])\n        }\n        return secretKey, nil\n    })\n\n    if err != nil {\n        fmt.Println("Fehler bei der Token-Überprüfung:", err)\n        return\n    }\n\n    // Claims extrahieren\n    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {\n        fmt.Println("Token ist gültig!")\n        fmt.Printf("User ID: %v\\n", claims["user_id"])\n        fmt.Printf("Rolle: %v\\n", claims["role"])\n    } else {\n        fmt.Println("Token ist ungültig")\n    }\n}
\n\n

Verwendung strukturierter Claims

\n\n

Der Einfachheit halber können Sie eine eigene Claims-Struktur definieren, die das Interface jwt.Claims implementiert:

\n\n
type CustomClaims struct {\n    UserID int    `json:"user_id"`\n    Role   string `json:"role"`\n    jwt.RegisteredCl                    

Empfehlungen