8.7 KiB
8.7 KiB
OTP-System für Gastaufträge - Dokumentation
Übersicht
Das OTP (One-Time Password) System ermöglicht es Gästen, den Status ihrer Druckaufträge sicher und ohne Anmeldung zu prüfen. Jeder Gast erhält bei der Antragsstellung einen eindeutigen 16-stelligen hexadezimalen Code.
Funktionsweise
🔐 OTP-Generierung
- Automatisch bei Antragstellung: Jeder neue Gastauftrag erhält sofort einen OTP-Code
- Sichere Speicherung: Der Code wird gehasht in der Datenbank gespeichert (bcrypt)
- Gültigkeitsdauer: 72 Stunden ab Erstellung
- Format: 16-stelliger hexadezimaler Code (z.B. "A1B2C3D4E5F67890")
📋 Status-Abfrage
- Öffentlicher Zugang: Keine Anmeldung erforderlich
- E-Mail-Verifikation: Optional für zusätzliche Sicherheit
- Einmalige Verwendung: Nach erfolgreicher Abfrage wird der Code als verwendet markiert
API-Endpunkte
Gast-Status-Abfrage
POST /guest/api/guest/status
Request Body:
{
"otp_code": "A1B2C3D4E5F67890",
"email": "gast@example.com" // Optional
}
Response (Erfolg):
{
"success": true,
"request": {
"id": 123,
"name": "Max Mustermann",
"file_name": "model.stl",
"status": "approved",
"created_at": "2025-01-07T10:30:00Z",
"updated_at": "2025-01-07T12:15:00Z",
"duration_min": 120,
"reason": "Prototyp für Projekt XY",
"message": "Ihr Auftrag wurde genehmigt! Sie können mit dem Drucken beginnen.",
"can_start_job": true,
"approved_at": "2025-01-07T12:15:00Z",
"approval_notes": "Auftrag genehmigt - Drucker B verfügbar",
"job": {
"id": 456,
"name": "3D Druck - Max Mustermann",
"status": "scheduled",
"start_at": "2025-01-07T14:00:00Z",
"end_at": "2025-01-07T16:00:00Z",
"printer_name": "Prusa i3 MK3S"
}
}
}
Response (Fehler):
{
"success": false,
"message": "Ungültiger Code oder E-Mail-Adresse"
}
Webinterface
Status-Abfrage-Seite
- URL:
/guest/status-check
- Zugang: Öffentlich zugänglich
- Funktionen:
- OTP-Code-Eingabe mit Formatierung
- Optionale E-Mail-Verifikation
- Detaillierte Status-Anzeige
- Aktualisierungsfunktion
Benutzeroberfläche-Features
- Responsive Design: Optimiert für mobile Geräte
- Echtzeit-Validierung: Client-seitige Code-Formatierung
- Loading-States: Visuelles Feedback während Abfragen
- Fehlerbehandlung: Benutzerfreundliche Fehlermeldungen
Status-Informationen
Pending (In Bearbeitung)
{
"status": "pending",
"message": "Ihr Auftrag wird bearbeitet. Wartezeit: 3 Stunden.",
"hours_waiting": 3
}
Approved (Genehmigt)
{
"status": "approved",
"message": "Ihr Auftrag wurde genehmigt! Sie können mit dem Drucken beginnen.",
"can_start_job": true,
"approved_at": "2025-01-07T12:15:00Z",
"approval_notes": "Auftrag genehmigt - Drucker B verfügbar"
}
Rejected (Abgelehnt)
{
"status": "rejected",
"message": "Ihr Auftrag wurde leider abgelehnt.",
"rejected_at": "2025-01-07T12:15:00Z",
"rejection_reason": "Datei nicht kompatibel mit verfügbaren Druckern"
}
Implementation Details
OTP-Klasse in models.py
class GuestRequest(Base):
# ... andere Felder ...
otp_code = Column(String(200), nullable=True) # Gehashter OTP
otp_expires_at = Column(DateTime, nullable=True)
otp_used_at = Column(DateTime, nullable=True)
def generate_otp(self) -> str:
"""Generiert einen neuen OTP-Code und speichert den Hash."""
otp_plain = secrets.token_hex(8) # 16-stelliger hex Code
otp_bytes = otp_plain.encode('utf-8')
salt = bcrypt.gensalt()
self.otp_code = bcrypt.hashpw(otp_bytes, salt).decode('utf-8')
return otp_plain
def verify_otp(self, otp_plain: str) -> bool:
"""Verifiziert einen OTP-Code."""
if not self.otp_code or not otp_plain:
return False
try:
otp_bytes = otp_plain.encode('utf-8')
hash_bytes = self.otp_code.encode('utf-8')
is_valid = bcrypt.checkpw(otp_bytes, hash_bytes)
if is_valid:
self.otp_used_at = datetime.now()
return is_valid
except Exception as e:
return False
Automatische OTP-Generierung
# In blueprints/guest.py - guest_request_form()
guest_request = GuestRequest(...)
db_session.add(guest_request)
db_session.flush() # Um ID zu erhalten
# OTP-Code sofort generieren für Status-Abfrage
otp_code = guest_request.generate_otp()
guest_request.otp_expires_at = datetime.now() + timedelta(hours=72)
db_session.commit()
Sicherheitsfeatures
🔒 Code-Sicherheit
- Bcrypt-Hashing: Sichere Speicherung der OTP-Codes
- Salt: Jeder Hash verwendet einen eindeutigen Salt
- One-Time-Use: Code wird nach erfolgreicher Verifikation als verwendet markiert
🛡️ Zusätzliche Sicherheit
- E-Mail-Verifikation: Optional für erhöhte Sicherheit
- Zeitliche Begrenzung: Codes laufen nach 72 Stunden ab
- Rate-Limiting: Schutz vor Brute-Force-Angriffen (falls implementiert)
🔍 Audit-Logging
- Alle OTP-Verifikationen werden protokolliert
- Fehlgeschlagene Versuche werden geloggt
- IP-Adressen werden für Sicherheitsanalysen gespeichert
Benutzer-Workflow
1. Antrag stellen
Gast füllt Antragsformular aus
↓
System generiert automatisch OTP-Code
↓
Gast erhält Code angezeigt/per E-Mail
2. Status prüfen
Gast besucht /guest/status-check
↓
Gibt 16-stelligen OTP-Code ein
↓
Optional: E-Mail zur Verifikation
↓
System zeigt aktuellen Status an
3. Job starten (bei Genehmigung)
Status zeigt "Genehmigt" an
↓
Link zu "Jetzt drucken" erscheint
↓
Gast kann Job mit anderem Code starten
Konfiguration
Gültigkeitsdauer
# In blueprints/guest.py
guest_request.otp_expires_at = datetime.now() + timedelta(hours=72) # 72h
Code-Format
# In models.py - generate_otp()
otp_plain = secrets.token_hex(8) # 16 Zeichen hexadezimal
Fehlerbehebung
Häufige Probleme
1. "Ungültiger Code"
Ursachen:
- Code falsch eingegeben
- Code bereits verwendet
- Code abgelaufen
- E-Mail stimmt nicht überein
Lösungen:
- Code-Eingabe überprüfen (16 Zeichen, hex)
- Neuen Code anfordern
- E-Mail-Feld leer lassen
2. "Verbindungsfehler"
Ursachen:
- Server nicht erreichbar
- Netzwerkprobleme
- API-Endpunkt nicht verfügbar
Lösungen:
- Internet-Verbindung prüfen
- Später erneut versuchen
- Browser-Cache leeren
3. "Fehler beim Abrufen des Status"
Ursachen:
- Datenbankfehler
- Server-Überlastung
- Code-Verifikation fehlgeschlagen
Lösungen:
- Server-Logs prüfen
- Datenbank-Verbindung überprüfen
- bcrypt-Installation validieren
Debug-Informationen
# Logging für OTP-Verifikation
logger.info(f"OTP-Verifikation für Request {request_id}: {'Erfolg' if valid else 'Fehlgeschlagen'}")
logger.warning(f"Ungültiger OTP-Code: {otp_code[:4]}****")
Best Practices
Für Administratoren
- Regelmäßige Bereinigung abgelaufener OTP-Codes
- Monitoring fehlgeschlagener Verifikationen
- Backup der OTP-Datenbank vor Updates
- Schulung des Personals zur OTP-Verwendung
Für Entwickler
- Sichere Code-Generierung mit
secrets.token_hex()
- Proper Hashing mit bcrypt und Salt
- Input-Validierung für alle OTP-Eingaben
- Error-Handling für alle Edge-Cases
- Rate-Limiting implementieren
Für Gäste
- Code sicher aufbewahren - nicht weitergeben
- Schnelle Verifikation - Code läuft ab
- E-Mail verwenden für zusätzliche Sicherheit
- Bei Problemen Admin kontaktieren
Integration
Bestehende Systeme
- Guest Blueprint: Nahtlose Integration in bestehende Gastauftrags-Verwaltung
- Admin-Panel: Übersicht über OTP-Status in Admin-Bereich
- Benachrichtigungen: OTP-Codes in E-Mail-Templates einbindbar
- Audit-Logs: Einheitliche Protokollierung mit bestehendem System
Erweiterungsmöglichkeiten
- SMS-Versand: OTP-Codes per SMS senden
- QR-Codes: Codes als QR-Code für mobile Apps
- Multi-Factor: Zusätzliche Authentifizierungsfaktoren
- Push-Notifications: Browser-Benachrichtigungen bei Status-Updates
Wartung
Regelmäßige Aufgaben
- Cleanup: Alte/abgelaufene OTP-Codes löschen
- Monitoring: Verifikations-Erfolgsrate überwachen
- Updates: bcrypt-Library aktuell halten
- Backup: OTP-Daten in Backups einschließen
Metriken
- Anzahl generierter OTP-Codes
- Verifikations-Erfolgsrate
- Durchschnittliche Zeit bis zur ersten Verifikation
- Häufigste Fehler-Typen
Dokumentation erstellt am: 2025-01-07 Version: 1.0 Autor: KI-Assistent