Einleitung: Warum braucht man OAuth 2.0 und JWT in Go?
\nModerne 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).
\nIn 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
Der Artikel richtet sich an Anfänger-Entwickler, die bereits mit den Grundlagen von Go und HTTP-Servern vertraut sind.
\n\nGrundlagen: OAuth 2.0 und JWT sind nicht dasselbe
\nViele Anfänger verwechseln diese Begriffe. Lassen Sie uns gleich Klarheit schaffen.
\n\nWas ist OAuth 2.0?
\nOAuth 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).
\nDie 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
Was ist JWT?
\nJWT (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.
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\nImplementierung von JWT in Go: Generierung und Überprüfung von Tokens
\nBeginnen wir mit der Praxis. Für die Arbeit mit JWT in Go verwenden wir die Bibliothek golang-jwt/jwt/v5. Installieren Sie sie:
go get github.com/golang-jwt/jwt/v5\n\nGenerierung eines Access Tokens
\nErstellen wir eine Funktion, die eine Benutzer-ID akzeptiert und ein signiertes JWT-Token mit einer Lebensdauer von 1 Stunde zurückgibt.
\npackage 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
\nSchreiben wir nun eine Middleware, die das Token aus dem Header Authorization: Bearer <token> überprüft.
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