- Neuer Abschnitt "Karten erstellen (Aufgaben-Workflow)" mit Workflow A/B - Bekannte Struktur erweitert: Workflows, Columns, Lanes für Board 1 - Pitfalls ergänzt: Arrival Rule, Parent-Link API, linkedCards read-only - Settings und Plans aktualisiert Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
174 lines
5.4 KiB
Markdown
174 lines
5.4 KiB
Markdown
# 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
|