# Fix: OAuth Callback 403 Forbidden - WEBHOOK_URL und BASE_URL fehlen Prefix ## Aktuelle Situation (Stand 2026-02-05) **Problem:** OAuth-Callback zu `flow.wvits.de/rest/oauth2-credential/callback` schlägt mit **403 Forbidden** fehl. **Screenshot zeigt:** Callback-URL hat **KEINEN Prefix** → nginx blockt mit 403. ## Root Cause Analyse ### Gefundene Probleme: 1. ✅ **WEBHOOK_URL ohne Prefix** (Hauptursache) ```yaml # docker-compose.yml auf srv-docker02 # WEBHOOK_URL=https://flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/ # ← Auskommentiert! WEBHOOK_URL=https://flow.wvits.de/ # ← Aktiv, OHNE Prefix ``` → OAuth-Callbacks gehen zu `/rest/oauth2-credential/callback` statt `/PREFIX/rest/oauth2-credential/callback` 2. ✅ **N8N_EDITOR_BASE_URL fehlt** ```yaml # N8N_EDITOR_BASE_URL=https://flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/ # ← Auskommentiert ``` → n8n nutzt Fallback (`N8N_PROTOCOL + N8N_HOST`), aber ohne Prefix → UI-Redirects, WebSocket-URLs, Asset-Loading könnten fehlschlagen 3. ⚠️ **nginx blockt alles ohne Prefix** ```nginx # /home/vinosadmin/n8n-reverse-proxy/nginx.conf auf srv-revproxy01 location / { return 403; } # ← Catch-All blockt ``` → Nur Requests unter `/77ba0b14e9ccd5521a0ec1867332378c/` werden weitergeleitet 4. ℹ️ **NPM Asset-Cache existiert** (kein direktes Problem, aber Pitfall) - Cache-Key: `$host$request_uri` (ohne Client-IP) - Könnte 403-Responses cachen wenn externer Client Assets abruft - Aktuell: Cache leer, kein Problem 5. ℹ️ **Custom Certificates Mount-Error** (kein Problem für OAuth) - `/opt/custom-certificates` Access denied - Betrifft nur HTTPS zu internen Services mit Custom CA - SMTP ist unverschlüsselt (SSL=false), kein Impact ## Fix-Plan ### Schritt 1: n8n docker-compose.yml korrigieren (srv-docker02) **SSH:** `ssh vinosadmin@srv-docker02` **Datei:** `/home/vinosadmin/n8n/docker-compose.yml` **Änderungen:** ```yaml # 1. WEBHOOK_URL mit Prefix aktivieren (Zeile ~31) # WEBHOOK_URL=https://flow.wvits.de/ WEBHOOK_URL=https://flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/ # 2. N8N_EDITOR_BASE_URL mit Prefix hinzufügen (nach N8N_PROXY_HOPS) N8N_EDITOR_BASE_URL=https://flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/ ``` **Begründung:** - `WEBHOOK_URL`: n8n nutzt diese für OAuth-Callback-URLs und Webhook-Generierung - `N8N_EDITOR_BASE_URL`: n8n nutzt diese für UI-Redirects, WebSocket-URLs, Asset-Pfade ### Schritt 2: Container neu starten ```bash cd /home/vinosadmin/n8n docker compose down docker compose up -d ``` **Warum `down` statt `restart`?** - Environment-Variablen werden nur beim `up` neu eingelesen - `restart` behält alte Env-Vars bei ### Schritt 3: Verifikation **A) Container-Status prüfen:** ```bash docker compose ps docker compose logs -f n8n-main | head -20 ``` **B) Environment-Variablen verifizieren:** ```bash docker exec n8n-n8n-main-1 env | grep -E "(WEBHOOK_URL|EDITOR_BASE_URL)" ``` Erwartete Ausgabe: ``` WEBHOOK_URL=https://flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/ N8N_EDITOR_BASE_URL=https://flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/ ``` **C) OAuth-Flow testen:** 1. n8n UI öffnen: `https://flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/` 2. Credentials → Microsoft Teams account 2 → "Connect my account" 3. Microsoft-Login → Callback sollte zu `/PREFIX/rest/oauth2-credential/callback` gehen 4. Erfolgreich: "Connected" - Credential ist authorisiert **D) Nginx-Logs prüfen (falls 403):** ```bash # Auf srv-revproxy01 ssh -J sshtest@10.10.254.201 vinosadmin@srv-revproxy01 docker logs --tail 50 n8n-reverse-proxy-nginx-1 2>&1 | grep oauth ``` ### Schritt 4 (Optional): NPM-Cache leeren Falls nach dem Fix immer noch Probleme auftreten: ```bash # Auf srv-revproxy01 ssh -J sshtest@10.10.254.201 vinosadmin@srv-revproxy01 docker exec npm sh -c 'rm -rf /var/lib/nginx/cache/public/*' docker exec npm nginx -s reload ``` ## Geänderte Dateien | Datei | Host | Änderung | |-------|------|----------| | `/home/vinosadmin/n8n/docker-compose.yml` | srv-docker02 | WEBHOOK_URL + N8N_EDITOR_BASE_URL mit Prefix | ## Sicherheit & Impact **Was ändert sich:** - OAuth-Callbacks gehen nun zu `/PREFIX/rest/oauth2-credential/callback` (mit Prefix) - nginx leitet alle `/PREFIX/*` Requests weiter (bestehende IP-Kontrolle bleibt) - Keine Änderungen an Firewall-Regeln oder nginx-Config **Keine Regression:** - Bestehende Webhooks (UPS-Workflow) unverändert: `/PREFIX/webhook/*` - Interner Zugang via n8n.vinos.de weiterhin funktional - Externe Webhooks weiterhin erlaubt (`allow all` in Webhook-Block) ## Troubleshooting ### Falls OAuth immer noch 403: **A) Callback-URL prüfen:** ```bash # Browser DevTools → Network Tab → OAuth-Redirect URL ansehen # Sollte sein: flow.wvits.de/77ba0b14e9ccd5521a0ec1867332378c/rest/oauth2-credential/callback # NICHT: flow.wvits.de/rest/oauth2-credential/callback ``` **B) Container-Logs prüfen:** ```bash docker compose logs n8n-main | grep -i webhook ``` **C) nginx-Logs prüfen:** ```bash # Auf srv-revproxy01 docker logs --tail 100 n8n-reverse-proxy-nginx-1 2>&1 | grep "403\|oauth" ``` ### Falls SPA nicht lädt (weiße Seite): **NPM-Cache leeren** (gecachte 403-Responses): ```bash # Auf srv-revproxy01 docker exec npm sh -c 'rm -rf /var/lib/nginx/cache/public/*' docker exec npm nginx -s reload ``` **Browser-Cache leeren:** - Ctrl+Shift+R (Hard Reload) - Oder Incognito-Fenster