Einleitung: Warum braucht man OAuth 2.0 und JWT in Go?
Moderne Webentwicklung ist ohne sichere Authentifizierung und Autorisierung undenkbar. Wenn Sie Ihr erstes API, einen Microservice oder eine Webanwendung in Go (Golang) schreiben, werden Sie früher oder später auf die Notwendigkeit stoßen, Benutzerdaten zu schützen. Zwei Standards – OAuth 2.0 und JWT (JSON Web Token) – sind zum Goldstandard in diesem Bereich geworden.
In diesem Artikel werden wir analysieren, wie OAuth 2.0 und JWT funktionieren, und eine einfache, aber funktionierende Implementierung in Go schreiben. Sie erfahren, wie Sie Zugriffstoken ausstellen, diese überprüfen und Ihre Endpunkte schützen. Der Artikel richtet sich an Anfänger-Entwickler, die mit den Grundlagen von Go und HTTP vertraut sind.
Was sind OAuth 2.0 und JWT? Einfach erklärt
OAuth 2.0 – Protokoll für delegierten Zugriff
OAuth 2.0 ist keine Bibliothek und keine Funktion, sondern ein Protokoll. Stellen Sie sich vor, Sie möchten sich über Google auf einer Website anmelden. OAuth 2.0 ermöglicht es der Website, von Google einen eingeschränkten Zugriff auf Ihre Daten (z. B. E-Mail) zu erhalten, ohne dass Sie Ihr Google-Passwort weitergeben müssen. Dies wird als "delegierter Zugriff" bezeichnet.
Die Hauptrollen in OAuth 2.0:
- Resource Owner – der Benutzer (Sie).
- Client – die Anwendung, die Zugriff erhalten möchte (unsere Website).
- Authorization Server – der Server, der Token ausstellt (Google).
- Resource Server – der Server mit den Benutzerdaten (Google API).
JWT – Token-Format
JWT (JSON Web Token) ist eine kompakte und eigenständige Möglichkeit, Informationen zwischen Parteien in Form eines JSON-Objekts zu übertragen. Es besteht aus drei Teilen, die durch Punkte getrennt sind:
- Header – Tokentyp und Signaturalgorithmus (z. B. HS256).
- Payload – Daten (Claims): Benutzer-ID, Rolle, Ablaufdatum.
- Signature – Signatur, die garantiert, dass das Token nicht verändert wurde.
JWT wird häufig als Access Token in OAuth 2.0 verwendet. Der Server signiert das Token mit einem geheimen Schlüssel, und der Client sendet es im Header Authorization: Bearer <token>.
Praxis: Implementierung der JWT-Autorisierung in Go
Wir werden einen kleinen HTTP-Server in Go schreiben, der JWT-Token ausstellt und diese auf geschützten Routen überprüft. Für die Arbeit mit JWT verwenden wir die beliebte Bibliothek github.com/golang-jwt/jwt/v5.
Schritt 1: Installation der Abhängigkeiten und Projektstruktur
Erstellen Sie ein neues Modul und installieren Sie die Bibliothek:
go mod init auth-examplego get github.com/golang-jwt/jwt/v5go get golang.org/x/cryptoDie Dateistruktur wird einfach sein:
main.go– Einstiegspunkt und Routen.auth.go– Logik zum Erstellen und Überprüfen von JWT.handlers.go– HTTP-Handler.
Schritt 2: Erstellen eines JWT-Tokens
Erstellen wir die Datei auth.go. Hier definieren wir den geheimen Schlüssel (in einem echten Projekt speichern Sie ihn in .env) und eine Funktion zur Generierung des Tokens.
package main
import ( "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("your-secret-key-here")
type Claims struct { UserID int `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims}
func GenerateToken(userID int, username string) (string, error) { claims := Claims{ UserID: userID, Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "auth-example", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}\