203 lines
5.9 KiB
Markdown
203 lines
5.9 KiB
Markdown
# 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! 🎯**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|