Authentifizierung und Autorisierung in Go (Golang)
In der modernen Webentwicklung mit Go (Golang) sind die Sicherheit von Benutzerdaten und die Zugriffskontrolle kritische Aspekte. Bibliotheken und Werkzeuge für Authentifizierung und Autorisierung ermöglichen es Entwicklern, schnell und zuverlässig Schutz in ihre Anwendungen zu integrieren. In diesem Artikel betrachten wir die grundlegenden Ansätze und beliebten Bibliotheken zur Implementierung von Authentifizierung (Überprüfung der Benutzeridentität) und Autorisierung (Bestimmung der Zugriffsrechte) in Go.
Grundlegende Konzepte
Bevor wir zu den Werkzeugen übergehen, ist es wichtig, zwei Schlüsselbegriffe zu unterscheiden:
- Authentifizierung — der Prozess der Überprüfung, ob ein Benutzer der ist, der er vorgibt zu sein (normalerweise durch Login/Passwort, Token, OAuth).
- Autorisierung — der Prozess der Bestimmung, welche Ressourcen und Aktionen einem authentifizierten Benutzer zur Verfügung stehen (Rollen, Zugriffsrechte).
Beliebte Bibliotheken und Werkzeuge
1. bcrypt zum Hashen von Passwörtern
Die Bibliothek golang.org/x/crypto/bcrypt ist der De-facto-Standard für die sichere Speicherung von Passwörtern. Sie fügt automatisch Salt hinzu und verwendet eine adaptive Hash-Funktion.
package main
import ( "fmt" "golang.org/x/crypto/bcrypt")
func main() { password := "mySecretPassword123" // Passwort hashen hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { panic(err) } fmt.Printf("Hash: %s", hash) // Passwort überprüfen err = bcrypt.CompareHashAndPassword(hash, []byte("wrongPassword")) if err != nil { fmt.Println("Passwort falsch:", err) } else { fmt.Println("Passwort korrekt") } // Erfolgreiche Überprüfung err = bcrypt.CompareHashAndPassword(hash, []byte(password)) if err == nil { fmt.Println("Passwort korrekt!") }}2. JWT (JSON Web Tokens) mit der Bibliothek golang-jwt
Die Bibliothek github.com/golang-jwt/jwt/v5 ermöglicht das Erstellen und Überprüfen von JWT-Token. Dies ist eine beliebte Methode zur Implementierung von zustandsloser Authentifizierung.
package main
import ( "fmt" "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("super-secret-key")
func createToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(time.Hour * 24).Unix(), "iat": time.Now().Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}
func validateToken(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("unerwartete Signiermethode: %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("ungültiger Token")}
func main() { // Token erstellen token, _ := createToken("user123") fmt.Println("JWT Token:", token) // Token überprüfen userID, err := validateToken(token) if err != nil { fmt.Println("Validierungsfehler:", err) } else { fmt.Println("Benutzer-ID aus Token:", userID) }}3. Session-basierte Authentifizierung mit gorilla/sessions
Für die traditionelle Session-Authentifizierung verwenden Sie github.com/gorilla/sessions. Sessions werden auf dem Server gespeichert, und der Client erhält nur ein Cookie mit der Session-ID.
package main
import ( "net/http" "github.com/gorilla/sessions")\ Auch in der Bibliothek
Logging in Swift (iOS/macOS): SwiftyBeaver, XCGLogger, OSLog
Dependency Injection Container für Java: vollständiger Überblick