Projektarbeit-MYP/backend/app/debug_login.py

199 lines
6.8 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3.11
"""
Debug-Script für Login-Probleme
Prüft Admin-Benutzer und Passwort-Hashing
"""
import os
import sys
from datetime import datetime
# Path für imports setzen
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from models import get_db_session, User, create_initial_admin
import bcrypt
def debug_admin_user():
"""Prüft den Admin-Benutzer in der Datenbank"""
print("=== DEBUG: Admin-Benutzer Analyse ===")
try:
db_session = get_db_session()
# Alle Benutzer anzeigen
users = db_session.query(User).all()
print(f"\n📊 Gefundene Benutzer: {len(users)}")
for user in users:
print(f"\n👤 Benutzer ID: {user.id}")
print(f" Email: {user.email}")
print(f" Username: {user.username}")
print(f" Name: {user.name}")
print(f" Role: {user.role}")
print(f" Is Admin: {user.is_admin}")
print(f" Active: {user.active}")
print(f" Password Hash: {user.password_hash[:20]}...")
print(f" Created: {user.created_at}")
# Admin-Benutzer spezifisch prüfen
admin_email = "admin@mercedes-benz.com"
admin_username = "admin"
print(f"\n🔍 Suche nach Admin-Benutzer:")
print(f" Email: {admin_email}")
print(f" Username: {admin_username}")
# Suche nach E-Mail
admin_by_email = db_session.query(User).filter(User.email == admin_email).first()
if admin_by_email:
print(f"✅ Admin gefunden per E-Mail: {admin_by_email.email}")
else:
print(f"❌ Kein Admin mit E-Mail {admin_email} gefunden")
# Suche nach Username
admin_by_username = db_session.query(User).filter(User.username == admin_username).first()
if admin_by_username:
print(f"✅ Admin gefunden per Username: {admin_by_username.username}")
else:
print(f"❌ Kein Admin mit Username {admin_username} gefunden")
db_session.close()
return admin_by_email or admin_by_username
except Exception as e:
print(f"❌ Fehler beim Datenbankzugriff: {str(e)}")
return None
def test_password_verification(user, test_password="744563017196A"):
"""Testet die Passwort-Verifikation"""
print(f"\n=== DEBUG: Passwort-Test ===")
print(f"Test-Passwort: {test_password}")
if not user:
print("❌ Kein Benutzer für Passwort-Test vorhanden")
return False
try:
# Manueller bcrypt-Test
password_bytes = test_password.encode('utf-8')
hash_bytes = user.password_hash.encode('utf-8')
print(f"Password Bytes: {password_bytes}")
print(f"Hash (first 50 chars): {user.password_hash[:50]}")
# Test mit bcrypt
is_valid_bcrypt = bcrypt.checkpw(password_bytes, hash_bytes)
print(f"✅ bcrypt.checkpw() Ergebnis: {is_valid_bcrypt}")
# Test mit User-Methode
is_valid_user_method = user.check_password(test_password)
print(f"✅ user.check_password() Ergebnis: {is_valid_user_method}")
return is_valid_bcrypt and is_valid_user_method
except Exception as e:
print(f"❌ Fehler beim Passwort-Test: {str(e)}")
return False
def recreate_admin():
"""Erstellt den Admin-Benutzer neu"""
print(f"\n=== DEBUG: Admin-Benutzer neu erstellen ===")
try:
success = create_initial_admin(
email="admin@mercedes-benz.com",
password="744563017196A",
name="System Administrator",
username="admin"
)
if success:
print("✅ Admin-Benutzer erfolgreich erstellt/aktualisiert")
else:
print("❌ Fehler beim Erstellen des Admin-Benutzers")
return success
except Exception as e:
print(f"❌ Fehler beim Erstellen des Admins: {str(e)}")
return False
def test_login_credentials():
"""Testet verschiedene Login-Kombinationen"""
print(f"\n=== DEBUG: Login-Kombinationen testen ===")
test_combinations = [
("admin@mercedes-benz.com", "744563017196A"),
("admin", "744563017196A"),
]
db_session = get_db_session()
for email_or_username, password in test_combinations:
print(f"\n🔍 Teste: {email_or_username} / {password}")
# Simuliere Login-Logic aus app.py
user = db_session.query(User).filter(
(User.username == email_or_username) | (User.email == email_or_username)
).first()
if user:
print(f"✅ Benutzer gefunden: {user.email} ({user.username})")
if user.check_password(password):
print(f"✅ Passwort korrekt!")
print(f"✅ Login wäre erfolgreich für: {user.email}")
else:
print(f"❌ Passwort falsch!")
else:
print(f"❌ Kein Benutzer mit {email_or_username} gefunden")
db_session.close()
def check_rate_limiting():
"""Prüft Rate Limiting Status"""
print(f"\n=== DEBUG: Rate Limiting Status ===")
# Simuliere localStorage-Werte (die wären normalerweise im Browser)
# In einer echten Anwendung würden diese aus der Datenbank oder einem Cache kommen
print(" Rate Limiting wird client-seitig im localStorage verwaltet")
print(" Überprüfen Sie Ihren Browser-localStorage:")
print(" - loginAttempts: sollte < 5 sein")
print(" - lastAttemptTime: Zeit des letzten Versuchs")
print("\n💡 Tipp: Öffnen Sie Entwicklertools > Application > Local Storage")
print(" und löschen Sie 'loginAttempts' und 'lastAttemptTime' Einträge")
if __name__ == "__main__":
print("🚀 MYP Login Debug-Tool gestartet")
print("=" * 50)
# 1. Admin-Benutzer prüfen
admin_user = debug_admin_user()
# 2. Passwort-Verifikation testen
if admin_user:
test_password_verification(admin_user)
# 3. Admin neu erstellen falls Probleme
if not admin_user:
print("\n⚠️ Kein Admin gefunden - erstelle neuen Admin...")
recreate_admin()
admin_user = debug_admin_user()
if admin_user:
test_password_verification(admin_user)
# 4. Login-Kombinationen testen
test_login_credentials()
# 5. Rate Limiting prüfen
check_rate_limiting()
print("\n" + "=" * 50)
print("🎯 Debug abgeschlossen!")
print("\n💡 Lösungsvorschläge:")
print("1. Verwenden Sie admin@mercedes-benz.com + 744563017196A")
print("2. Oder verwenden Sie admin + 744563017196A")
print("3. Löschen Sie Rate-Limiting im Browser localStorage")
print("4. Prüfen Sie die Browser-Konsole auf JavaScript-Fehler")