OAuth 2.0 und JWT-Autorisierung in Go: Von der Theorie zur Praxis
\n\nModerne Webanwendungen und APIs kommen selten ohne ein zuverlässiges Authentifizierungs- und Autorisierungssystem aus. Zwei Standards – OAuth 2.0 und JWT (JSON Web Tokens) – haben sich in der Entwicklungswelt als De-facto-Standards etabliert. In diesem Artikel werden wir anhand praktischer Beispiele erläutern, wie man OAuth 2.0-Autorisierung mit JWT in der Sprache Go (Golang) implementiert.
\n\nWir werden einen einfachen REST-API-Server erstellen, der nach erfolgreicher Authentifizierung über einen OAuth 2.0-Anbieter (z. B. Google) JWT-Tokens ausgibt und diese bei jeder Anfrage überprüft.
\n\n1. Grundlagen von OAuth 2.0 und JWT
\n\nBevor wir Code schreiben, klären wir kurz die Begriffe.
\n\n- \n
- OAuth 2.0 – ein Autorisierungsprotokoll, das es Benutzern ermöglicht, Drittanbietern eingeschränkten Zugriff auf ihre Ressourcen zu gewähren, ohne Login und Passwort weiterzugeben. Hauptrollen: Resource Owner (Benutzer), Client (unsere Anwendung), Authorization Server (Server, der Tokens ausstellt), Resource Server (Server mit geschützten Daten). \n
- JWT – ein kompaktes, URL-sicheres Token-Format, das aus drei Teilen besteht: Header, Payload und Signatur. JWT kann beliebige Daten (Claims) enthalten und wird mit einem geheimen Schlüssel oder einem RSA-Schlüsselpaar signiert. \n
In unserer Implementierung wird OAuth 2.0 verwendet, um ein Identitätstoken vom Anbieter (Google) zu erhalten, und anschließend generieren wir ein eigenes JWT für die weitere Arbeit mit unserer API.
\n\n2. Projekteinrichtung und Abhängigkeiten
\n\nErstellen wir ein neues Go-Projekt und installieren die erforderlichen Pakete:
\n\nmkdir go-oauth-jwt\ncd go-oauth-jwt\ngo mod init example.com/go-oauth-jwt\ngo get github.com/gin-gonic/gin\ngo get github.com/golang-jwt/jwt/v5\ngo get golang.org/x/oauth2\ngo get golang.org/x/oauth2/google\n\nWir werden verwenden:
\n- \n
- Gin – ein schnelles HTTP-Framework für Go. \n
- golang-jwt – eine Bibliothek für die Arbeit mit JWT. \n
- oauth2 – die Standard-Go-Bibliothek für OAuth 2.0. \n
Sie müssen außerdem eine Anwendung in der Google Cloud Console registrieren, eine OAuth 2.0-Client-ID und ein Client-Secret erstellen sowie eine Redirect-URI angeben (z. B. http://localhost:8080/auth/google/callback).
3. Implementierung des OAuth 2.0-Logins über Google
\n\nBeginnen wir mit der Erstellung der OAuth 2.0-Konfiguration und der Endpunkte für Login und Rückruf.
\n\npackage main\n\nimport (\n "crypto/rand"\n "encoding/base64"\n "net/http"\n "os"\n\n "github.com/gin-gonic/gin"\n "golang.org/x/oauth2"\n "golang.org/x/oauth2/google"\n)\n\nvar (\n googleOauthConfig *oauth2.Config\n oauthStateString string\n)\n\nfunc init() {\n googleOauthConfig = &oauth2.Config{\n RedirectURL: "http://localhost:8080/auth/google/callback",\n ClientID: os.Getenv("GOOGLE_CLIENT_ID"),\n ClientSecret: os.Getenv("GOOGLE_CLIENT_SECRET"),\n Scopes: []string{"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"},\n Endpoint: google.Endpoint,\n }\n // Generieren eines zufälligen State-Tokens zum Schutz vor CSRF\n b := make([]byte, 32)\n rand.Read(b)\n oauthStateString = base64.StdEncoding.EncodeToString(b)\n}\n\nfunc main() {\n r := gin.Default()\n\n r.GET("/auth/google/login", handleGoogleLogin)\n r.GET("/auth/google/callback", handleGoogleCallback)\n\n r.Run(":8080")\n}\n\nfunc handleGoogleLogin(c *gin.Context) {\n url := googleOauthConfig.AuthCodeURL(oauthStateString)\n c.Redirect(http.StatusTemporaryRedirect, url)\n}\n\nfunc handleGoogleCallback(c *gin.Context) {\n state := c.Query("state")\n if state != oauthStateString {\n c.JSON(http.StatusBadRequest, gin.H{"error": "invalid oauth state"})\n return\n }\n\n code := c.Query("code")\n token, err := googl