# 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
```http
POST /guest/api/guest/status
```

**Request Body:**
```json
{
  "otp_code": "A1B2C3D4E5F67890",
  "email": "gast@example.com"  // Optional
}
```

**Response (Erfolg):**
```json
{
  "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):**
```json
{
  "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)
```json
{
  "status": "pending",
  "message": "Ihr Auftrag wird bearbeitet. Wartezeit: 3 Stunden.",
  "hours_waiting": 3
}
```

### Approved (Genehmigt)
```json
{
  "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)
```json
{
  "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
```python
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
```python
# 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
```python
# In blueprints/guest.py
guest_request.otp_expires_at = datetime.now() + timedelta(hours=72)  # 72h
```

### Code-Format
```python
# 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
```python
# 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
1. **Regelmäßige Bereinigung** abgelaufener OTP-Codes
2. **Monitoring** fehlgeschlagener Verifikationen
3. **Backup** der OTP-Datenbank vor Updates
4. **Schulung** des Personals zur OTP-Verwendung

### Für Entwickler
1. **Sichere Code-Generierung** mit `secrets.token_hex()`
2. **Proper Hashing** mit bcrypt und Salt
3. **Input-Validierung** für alle OTP-Eingaben
4. **Error-Handling** für alle Edge-Cases
5. **Rate-Limiting** implementieren

### Für Gäste
1. **Code sicher aufbewahren** - nicht weitergeben
2. **Schnelle Verifikation** - Code läuft ab
3. **E-Mail verwenden** für zusätzliche Sicherheit
4. **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* 