JWT-Token in Go (Golang): Bibliothek golang-jwt und Anwendungsbeispiele

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 Go (Golang): Vollständige Anleitung mit der Bibliothek golang-jwt



JSON Web Token (JWT) ist ein offener Standard (RFC 7519) zur Erstellung von Access-Token auf Basis von JSON. JWT wird häufig für die Authentifizierung und den Informationsaustausch zwischen Parteien verwendet. In Go (Golang) ist die am weitesten verbreitete und aktiv unterstützte Bibliothek für die Arbeit mit JWT golang-jwt/jwt/v5. In diesem Artikel werden wir im Detail besprechen, wie man diese Bibliothek installiert, konfiguriert und verwendet, um sichere Webanwendungen zu erstellen.



Installation der Bibliothek golang-jwt



Fügen Sie die Bibliothek zunächst mit go get zu Ihrem Projekt hinzu:



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


Nach der Installation importieren Sie das Paket in Ihren Code:



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


Grundlegende Komponenten von JWT



JWT besteht aus drei durch Punkte getrennten Teilen: Header, Payload und Signature. Die Bibliothek golang-jwt bietet praktische Strukturen für die Arbeit mit jedem dieser Teile:



  • Header – enthält Metadaten über den Tokentyp und den Signaturalgorithmus (z. B. HS256, RS256).
  • Payload – enthält Claims (Behauptungen) wie Benutzer-ID, Ablaufzeit, Rollen und andere Daten.
  • Signature – wird mit einem geheimen Schlüssel oder einem Schlüsselpaar (privat/öffentlich) erstellt.


Erstellen eines JWT Access-Token



Betrachten wir ein Beispiel für die Erstellung eines Access-Token mit dem Algorithmus HS256 (symmetrische Verschlüsselung). Zuerst definieren wir eine Struktur mit benutzerdefinierten Claims:



type CustomClaims struct {    UserID   int    `json:"user_id"`    Username string `json:"username"`    jwt.RegisteredClaims}


Jetzt erstellen wir eine Funktion zur Generierung des Token:



func GenerateAccessToken(userID int, username string, secretKey []byte) (string, error) {    claims := CustomClaims{        UserID:   userID,        Username: username,        RegisteredClaims: jwt.RegisteredClaims{            ExpiresAt: jwt.NewNumericDate(time.Now().Add(15 * time.Minute)),            IssuedAt:  jwt.NewNumericDate(time.Now()),            Subject:   "access",        },    }

token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(secretKey)}


Hier setzen wir die Lebensdauer des Token auf 15 Minuten, was eine Standardpraxis für Access-Token ist. Verwenden Sie jwt.NewNumericDate() für die korrekte Formatierung der Zeit.



Verifizierung und Parsen des Token



Um die Authentizität des Token zu überprüfen, müssen die Claims extrahiert und die Signatur geprüft werden:



func ValidateToken(tokenString string, secretKey []byte) (*CustomClaims, error) {    token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {        // Prüfen, ob der erwartete Signaturalgorithmus verwendet wird        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {            return nil, fmt.Errorf("unerwartete Signaturmethode: %v", token.Header["alg"])        }        return secretKey, nil    })

if err != nil { return nil, err }

if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { return claims, nil }

return nil, fmt.Errorf("ungültiger Token")}


Es ist wichtig, den Signaturalgorithmus in der Callback-Funktion zu überprüfen, um Angriffe im Zusammenhang mit dem Austausch des Algorithmus zu vermeiden.



Erstellen und Aktualisieren von Refresh-Token



Zur Erhöhung der Sicherheit wird häufig ein Token-Paar verwendet: ein kurzlebiger Access-Token und ein langlebiger Refresh-Token. Der Refresh-Token ermöglicht es, einen neuen Access-Token zu erhalten, ohne erneut Benutzername/Passwort eingeben zu müssen.



func GenerateRefreshToken(userID int, secretKey []byte) (string, error) {                    

Empfehlungen