Autorisierung und Authentifizierung in Go: Pakete und praktische Beispiele

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

Autorisierung und Authentifizierung in Go (Golang): Überblick über die wichtigsten Werkzeuge



Authentifizierung (Überprüfung der Benutzeridentität) und Autorisierung (Überprüfung der Zugriffsrechte) sind grundlegende Komponenten jeder Webanwendung. Im Go (Golang)-Ökosystem gibt es mehrere bewährte Bibliotheken, mit denen sich diese Mechanismen schnell, sicher und mit minimalem Codeaufwand implementieren lassen. In diesem Artikel betrachten wir vier Hauptansätze: Passwort-Hashing, JWT-Tokens, Session-Verwaltung und OAuth2.



1. Passwort-Hashing: golang.org/x/crypto/bcrypt

Der erste Schritt jeder Authentifizierung ist die sichere Speicherung von Passwörtern. Speichern Sie Passwörter niemals im Klartext! Das Paket bcrypt aus der Go-Standardbibliothek bietet einen bewährten Hashing-Algorithmus mit anpassbarem Kostenfaktor (cost factor).



Installation:

go get golang.org/x/crypto/bcrypt


Beispiel für Registrierung und Anmeldung:

package main

import ( "fmt" "golang.org/x/crypto/bcrypt")

func hashPassword(password string) (string, error) { bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) return string(bytes), err}

func checkPasswordHash(password, hash string) bool { err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) return err == nil}

func main() { password := "mySecretP@ssw0rd" hash, _ := hashPassword(password)

fmt.Println("Hash:", hash)

// Überprüfung des korrekten Passworts match := checkPasswordHash(password, hash) fmt.Println("Password match:", match) // true

// Überprüfung eines falschen Passworts match = checkPasswordHash("wrong", hash) fmt.Println("Wrong password match:", match) // false}


Wichtig: bcrypt.DefaultCost beträgt 10. Verwenden Sie für ein höheres Sicherheitsniveau (aber langsamer) einen Wert von 12-14. Verwenden Sie niemals einen cost-Wert unter 10.



2. JWT (JSON Web Tokens) — github.com/golang-jwt/jwt/v5

JWT ist eine kompakte Möglichkeit, Daten zwischen Parteien als JSON-Objekt zu übertragen. Ideal geeignet für REST-APIs und Microservices. Das Paket golang-jwt/jwt ist das beliebteste und wird aktiv gewartet.



Installation:

go get github.com/golang-jwt/jwt/v5


Beispiel zum Erstellen und Überprüfen eines JWT:

package main

import ( "fmt" "time" "github.com/golang-jwt/jwt/v5")

var jwtSecret = []byte("your-secret-key-keep-it-safe")

func createToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(24 * time.Hour).Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}

func verifyToken(tokenString string) (string, error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return jwtSecret, nil }) if err != nil { return "", err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims["user_id"].(string), nil } return "", fmt.Errorf("invalid token")}

func main() { token, _ := createToken("user123") fmt.Println("JWT:", token)

userID, err := verifyToken(token) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Authenticated user:", userID) }}


Tipp: Speichern Sie den geheimen Schlüssel in Umgebungsvariablen, nicht im Code. Verwenden Sie für die Produktion asymmetrische Verschlüsselung (RS256).



3. Session-Verwaltung — gorilla/sessions

Für klassische Webanwendungen mit HTML-Vorlagen

Empfehlungen