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/bcryptBeispiel 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/v5Beispiel 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
Auch in der Bibliothek
Inversify TypeScript: Vollständige Anleitung mit Beispielen
Micrometer Java: Vollständige Anleitung mit Beispielen
Datenbankmigrationen in Kotlin: Überblick über Tools und Ansätze