OAuth 2.0 und JWT-Autorisierung in Go: Ein praktischer Leitfaden

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

OAuth 2.0 und JWT-Autorisierung in Go: Von der Theorie zur Praxis

\n\n

Moderne 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\n

Wir 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\n

1. Grundlagen von OAuth 2.0 und JWT

\n\n

Bevor 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
\n\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\n

2. Projekteinrichtung und Abhängigkeiten

\n\n

Erstellen wir ein neues Go-Projekt und installieren die erforderlichen Pakete:

\n\n
mkdir 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\n

Wir 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
\n\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).

\n\n

3. Implementierung des OAuth 2.0-Logins über Google

\n\n

Beginnen wir mit der Erstellung der OAuth 2.0-Konfiguration und der Endpunkte für Login und Rückruf.

\n\n
package 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                

Blogs

Buchempfehlungen