diff --git a/internal/api/server.go b/internal/api/server.go index 1bd37c7..0a4bca0 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -559,21 +559,31 @@ func (s *Server) handleLogin(w http.ResponseWriter, r *http.Request) { } user, err := s.store.GetUserByLogin(identifier) - if err != nil || !auth.CheckPassword(req.Password, user.PasswordHash) { + if err != nil { + slog.Warn("Login fehlgeschlagen: Benutzer existiert nicht", "login", identifier, "remote_addr", r.RemoteAddr) + writeError(w, http.StatusUnauthorized, "Benutzername/E-Mail oder Passwort ungültig") + return + } + if !auth.CheckPassword(req.Password, user.PasswordHash) { + slog.Warn("Login fehlgeschlagen: Falsches Passwort", "login", identifier, "user_id", user.ID, "display_name", user.DisplayName, "remote_addr", r.RemoteAddr) writeError(w, http.StatusUnauthorized, "Benutzername/E-Mail oder Passwort ungültig") return } if !user.IsActive { + slog.Warn("Login verweigert: Benutzerkonto ist deaktiviert", "login", identifier, "user_id", user.ID, "display_name", user.DisplayName, "remote_addr", r.RemoteAddr) writeError(w, http.StatusForbidden, "Dieses Benutzerkonto ist deaktiviert") return } token, err := auth.GenerateToken(s.cfg.JWTSecret, user.ID, user.Email, user.DisplayName, user.TokenVersion) if err != nil { + slog.Error("Login-Token konnte nicht erstellt werden", "login", identifier, "user_id", user.ID, "error", err) writeError(w, http.StatusInternalServerError, "Token konnte nicht erstellt werden") return } + slog.Info("Login erfolgreich", "login", identifier, "user_id", user.ID, "display_name", user.DisplayName, "role", user.Role, "remote_addr", r.RemoteAddr) + writeJSON(w, http.StatusOK, map[string]interface{}{ "token": token, "user": user,