OAuth 2.0 und JWT-Autorisierung in Go: Vollständiger Leitfaden für Anfänger

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

Einleitung: Warum braucht man OAuth 2.0 und JWT in Go?

\n

Moderne Webanwendungen und APIs kommen selten ohne ein Autorisierungssystem aus. Wenn Sie in Go (Golang) programmieren und Ihre Endpunkte schützen möchten, müssen Sie sich mit zwei Schlüsseltechnologien vertraut machen: OAuth 2.0 (Zugriffsdelegierungsprotokoll) und JWT (JSON Web Token – kompaktes Token-Format).

\n

In diesem Artikel werden wir durchgehen, wie man eine sichere Autorisierung in Go von Grund auf implementiert. Sie erfahren:

\n
    \n
  • Wie sich OAuth 2.0 von JWT unterscheidet und wie sie zusammenarbeiten.
  • \n
  • Wie man JWT-Tokens in Go generiert und überprüft.
  • \n
  • Wie man eine minimale OAuth 2.0-Autorisierung (Client Credentials Flow) aufbaut.
  • \n
  • Wie man eine REST API mit Middleware schützt.
  • \n
\n

Der Artikel richtet sich an Anfänger-Entwickler, die bereits mit den Grundlagen von Go und HTTP-Servern vertraut sind.

\n\n

Grundlagen: OAuth 2.0 und JWT sind nicht dasselbe

\n

Viele Anfänger verwechseln diese Begriffe. Lassen Sie uns gleich Klarheit schaffen.

\n\n

Was ist OAuth 2.0?

\n

OAuth 2.0 ist ein Autorisierungsprotokoll, das es einem Dienst (Client) ermöglicht, eingeschränkten Zugriff auf die Ressourcen eines anderen Dienstes (Servers) im Namen eines Benutzers zu erhalten. Stellen Sie sich vor, Sie möchten sich auf einer Website über Google anmelden. Die Website erhält nicht Ihr Passwort – sie erhält von Google ein temporäres Token, das nur Zugriff auf Ihre E-Mail gewährt (und das nur mit Ihrer Zustimmung).

\n

Die Hauptrollen in OAuth 2.0:

\n
    \n
  • Resource Owner – der Eigentümer der Daten (normalerweise der Benutzer).
  • \n
  • Client – die Anwendung, die Zugriff erhalten möchte.
  • \n
  • Authorization Server – der Server, der nach Überprüfung Tokens ausstellt.
  • \n
  • Resource Server – der Server, der geschützte Daten speichert und Tokens überprüft.
  • \n
\n\n

Was ist JWT?

\n

JWT (JSON Web Token) ist das Format des Tokens selbst. Es besteht aus einer Zeichenkette mit drei durch Punkte getrennten Teilen: header.payload.signature. JWT kann beliebige Daten enthalten (z. B. Benutzer-ID, Rolle, Ablaufdatum) und ist mit einem geheimen Schlüssel signiert, sodass es nicht gefälscht werden kann.

\n

OAuth 2.0 ist nicht an JWT gebunden – das Token kann eine beliebige Zeichenkette sein. In der Praxis wird jedoch am häufigsten JWT verwendet, da es eigenständig ist: Der Server muss keine Sitzungen in der Datenbank speichern, alle Informationen können spontan überprüft werden.

\n\n

Implementierung von JWT in Go: Generierung und Überprüfung von Tokens

\n

Beginnen wir mit der Praxis. Für die Arbeit mit JWT in Go verwenden wir die Bibliothek golang-jwt/jwt/v5. Installieren Sie sie:

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

Generierung eines Access Tokens

\n

Erstellen wir eine Funktion, die eine Benutzer-ID akzeptiert und ein signiertes JWT-Token mit einer Lebensdauer von 1 Stunde zurückgibt.

\n
package main\n\nimport (\n    "time"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nvar jwtSecret = []byte("your-secret-key") // In der Produktion in .env speichern!\n\ntype Claims struct {\n    UserID uint `json:"user_id"`\n    jwt.RegisteredClaims\n}\n\nfunc GenerateAccessToken(userID uint) (string, error) {\n    claims := Claims{\n        UserID: userID,\n        RegisteredClaims: jwt.RegisteredClaims{\n            ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour)),\n            IssuedAt:  jwt.NewNumericDate(time.Now()),\n            Issuer:    "my-app",\n        },\n    }\n    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n    return token.SignedString(jwtSecret)\n}
\n\n

Überprüfung und Parsen von JWT

\n

Schreiben wir nun eine Middleware, die das Token aus dem Header Authorization: Bearer <token> überprüft.

\n
func ValidateToken(tokenString string) (*Claims, error) {\n    token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {\n        // Überprüfen, ob die richtige Signaturmethode verwendet wird\n                

Blogs

Buchempfehlungen