Einführung in OAuth 2.0 und JWT mit Go
Moderne Webanwendungen und APIs erfordern ein zuverlässiges und sicheres Authentifizierungs- und Autorisierungssystem. Die beiden gängigsten Standards in diesem Bereich sind OAuth 2.0 und JWT (JSON Web Tokens). In der Sprache Go (Golang) wird die Implementierung dieser Mechanismen dank der integrierten Unterstützung für Nebenläufigkeit, hoher Leistung und einem reichhaltigen Ökosystem an Bibliotheken besonders effizient.
In diesem Artikel werden wir im Detail besprechen, wie man OAuth 2.0 und JWT-Autorisierung mit Go implementiert. Sie erfahren, wie Sie einen Server einrichten, Token generieren und überprüfen sowie Ihre Endpunkte schützen. Das Material ist sowohl für Anfänger als auch für erfahrene Go-Entwickler nützlich.
Grundlagen von OAuth 2.0 und JWT
Was ist OAuth 2.0?
OAuth 2.0 ist ein Autorisierungsprotokoll, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne das Passwort weiterzugeben. Stattdessen werden Access Tokens verwendet. Die Hauptakteure des Prozesses sind:
- Resource Owner — der Benutzer, der die Daten besitzt
- Client — die Anwendung, die Zugriff anfordert
- Authorization Server — der Server, der Token ausstellt
- Resource Server — der Server, der geschützte Ressourcen bereitstellt
Was ist JWT?
JWT (JSON Web Token) ist ein kompaktes und eigenständiges Format zur Übertragung von Daten zwischen Parteien als JSON-Objekt. Der Token besteht aus drei Teilen, die durch Punkte getrennt sind:
header.payload.signatureVorteile von JWT:
- Erfordert keine Speicherung von Sitzungen auf dem Server (zustandslos)
- Enthält alle notwendigen Informationen (Claims)
- Ist zur Überprüfung der Integrität signiert
Implementierung der JWT-Autorisierung mit Go
Für die Arbeit mit JWT in Go verwenden wir die beliebte Bibliothek golang-jwt/jwt/v5. Installieren Sie sie mit dem Befehl:
go get github.com/golang-jwt/jwt/v5Generierung eines JWT-Tokens
Erstellen wir eine Funktion zur Generierung von Access- und Refresh-Tokens:
package auth
import ( "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("your-secret-key")
type Claims struct { UserID uint `json:"user_id"` Email string `json:"email"` jwt.RegisteredClaims}
func GenerateAccessToken(userID uint, email string) (string, error) { claims := &Claims{ UserID: userID, Email: email, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(15 * time.Minute)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "myapp", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}
func GenerateRefreshToken(userID uint) (string, error) { claims := &Claims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(7 * 24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}Überprüfung des JWT-Tokens
Middleware zur Überprüfung des Tokens in HTTP-Anfragen:
package middleware
import ( "net/http" "strings" "github.com/gin-gonic/gin" "myapp/auth")
func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "missing authorization header"}) c.Abort() return }
tokenString := strings.TrimPrefix(authHeader, "Bearer ") if tokenString == authHeader {