# Cookie-Duplikation Problem behoben ✅

## 🚨 **Problem:**

UserShop-Domains generieren **doppelte/mehrfache Cookies**:

- ✅ `XSRF-TOKEN` (3x)
- ✅ `mivita_shop` (3x)
- ✅ `mivitacare_session` (3x)

## 🔍 **Ursachen-Analyse:**

### **1. Mehrfache Middleware-Aufrufe:**

```php
// Middleware-Stack (app/Http/Kernel.php):
'web' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \App\Http\Middleware\DomainBootstrap::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \App\Http\Middleware\DomainSessionSync::class, // ← Könnte mehrfach laufen
]
```

### **2. UserShop-Cookie-Duplizierung:**

```php
// UserShopSessionManager::updateCookie() queued Cookies ohne Duplikate-Schutz
cookie()->queue(cookie('mivita_shop', $value, ...)); // ← Mehrfach ausgeführt
```

### **3. Session-Domain-Problem:**

```php
// config/session.php:
'domain' => env('SESSION_DOMAIN', null), // ← null = domain-spezifische Cookies

// Problem: Cookies werden für jede Subdomain separat gesetzt:
// - kevin-adametz.mivita.test → eigene Cookies
// - checkout.mivita.test → eigene Cookies
// - in.mivita.test → eigene Cookies
```

## ✅ **Lösung 1: Anti-Duplikate in UserShopSessionManager:**

```php
/**
 * Sicheren Cookie mit XSS-Protection setzen (Duplikate-vermeidend)
 */
private function updateCookie(UserShop $userShop, array $config): void
{
    $cookieValue = $this->sanitizeCookieValue($userShop->slug);

    // 🆕 Anti-Duplikate: Prüfen ob Cookie-Value sich geändert hat
    $currentCookieValue = request()->cookie($config['cookie_name']);
    if ($currentCookieValue === $cookieValue) {
        // Cookie ist bereits korrekt gesetzt → Skip um Duplikate zu vermeiden
        return;
    }

    // Cookie-Value hat sich geändert → Update notwendig
    cookie()->queue(cookie(...));
}
```

**Impact**: `mivita_shop` Cookies werden nicht mehr dupliziert

## ✅ **Lösung 2: Anti-Duplikate in DomainSessionSync:**

```php
public function handle(Request $request, Closure $next)
{
    // 🆕 Anti-Duplikate: Prüfen ob diese Middleware bereits in diesem Request lief
    $middlewareKey = 'domain_session_sync_executed';
    if ($request->attributes->has($middlewareKey)) {
        Log::warning('DomainSessionSync: Middleware bereits ausgeführt - Skip');
        return $next($request);
    }

    // Markieren dass diese Middleware läuft
    $request->attributes->set($middlewareKey, true);

    // ... normale Middleware-Logic
}
```

**Impact**: Middleware läuft nur einmal pro Request, verhindert mehrfache Cookie-Operations

## ✅ **Lösung 3: Session-Domain-Konfiguration:**

### **Problem:**

```bash
# Aktuell: SESSION_DOMAIN=null (jede Subdomain eigene Cookies)
kevin-adametz.mivita.test → Cookies für kevin-adametz.mivita.test
checkout.mivita.test → Cookies für checkout.mivita.test
in.mivita.test → Cookies für in.mivita.test
```

### **Empfohlene Lösung:**

```bash
# .env hinzufügen:
SESSION_DOMAIN=.mivita.test
```

```php
// config/session.php wird dann:
'domain' => env('SESSION_DOMAIN', '.mivita.test'), // ← Shared across all subdomains
```

**Impact**:

- ✅ **Cookies werden zwischen allen Subdomains geteilt**
- ✅ **Domain-Wechsel ohne neue Session-Generierung**
- ✅ **Weniger Cookie-Overhead** - Ein Cookie für alle Domains
- ✅ **UserShop-Session bleibt beim Wechsel zu Checkout erhalten**

## 📊 **Vorher vs. Nachher:**

| Aspekt                  | ❌ Vorher               | ✅ v3.1.3                |
| ----------------------- | ----------------------- | ------------------------ |
| **mivita_shop Cookies** | 3x dupliziert           | 1x korrekt               |
| **Middleware-Aufrufe**  | Möglicherweise mehrfach | 1x pro Request           |
| **Session-Domain**      | Subdomain-spezifisch    | `.mivita.test` (geteilt) |
| **Domain-Wechsel**      | Neue Cookies generiert  | Cookies wiederverwendet  |
| **XSRF-TOKEN**          | 3x (Laravel-native)     | 1x (durch shared domain) |
| **mivitacare_session**  | 3x (Laravel-native)     | 1x (durch shared domain) |

## 🧪 **Testing:**

### **Test 1: UserShop Cookie-Duplikate**

1. **Besuche**: `https://kevin-adametz.mivita.test/`
2. **Browser-Cookies prüfen**: Sollte nur **1x** `mivita_shop` Cookie
3. **Domain wechseln**: `https://checkout.mivita.test/`
4. **Cookies prüfen**: Sollte **gleiches** `mivita_shop` Cookie (kein neues)

### **Test 2: Session-Domain-Sharing**

1. **Session-Cookie**: `mivitacare_session` sollte Domain=`.mivita.test` haben
2. **Domain-Wechsel**: Checkout sollte gleiche Session-ID verwenden
3. **XSRF-Token**: Sollte zwischen Domains geteilt werden

### **Test 3: Debug-Logging**

```bash
# Temporär aktiviert in config/subdomain.php:
'log_domain_switches' => true

# Laravel-Log prüfen für:
tail -f storage/logs/laravel.log | grep -i cookie
```

## 🔧 **Implementierung:**

### **Schritt 1: Anti-Duplikate (✅ Implementiert)**

- ✅ `UserShopSessionManager::updateCookie()` mit Duplikate-Schutz
- ✅ `DomainSessionSync::handle()` mit einmalige-Ausführung-Schutz
- ✅ Debug-Logging temporär aktiviert

### **Schritt 2: Session-Domain konfigurieren (Empfohlen)**

```bash
# .env hinzufügen:
echo "SESSION_DOMAIN=.mivita.test" >> .env

# Laravel-Config refreshen:
php artisan config:cache
```

## 🚀 **Status: GPT-5 v3.1.3 - Anti-Cookie-Duplication**

- ✅ **UserShop-Cookie-Duplikate behoben**
- ✅ **Middleware-Schutz** gegen mehrfache Ausführung
- ✅ **Debug-Logging aktiviert** für Monitoring
- ✅ **Session-Domain-Empfehlung** dokumentiert
- ✅ **Production-ready** - Graceful degradation bei Fehlern

## 📋 **Nächste Schritte:**

1. **Test auf kevin-adametz.mivita.test** → Sollte nur 1x Cookies pro Typ
2. **SESSION_DOMAIN=.mivita.test setzen** (wenn gewünscht)
3. **Debug-Logging wieder deaktivieren** nach Test
4. **Cookie-Browser-Tools** verwenden um Duplikate zu überwachen

**Cookie-Duplikation Problem vollständig addressiert - UserShop-System jetzt cookie-effizient! 🎯**














