So sieht die Meldung aus
Error 400: redirect_uri_mismatchHäufige Ursachen
- http statt https, weil die App hinter einem TLS-Proxy ihr eigenes Protokoll falsch erkennt.
- Schrägstrich am Ende,
index.phpim Pfad oder ein anderer Port. - Anderer Hostname als registriert, z. B. interne Adresse oder www vs. ohne www.
- Neue Callback-URL nach App-Update, beim IdP noch die alte eingetragen.
- Falscher Client: die Client-ID gehört zu einer anderen Umgebung (Test/Produktion).
Prüfen
- Gesendete Authorize-URL ermitteln (Nextcloud user_oidc, Provider-ID 1)
curl -s -o /dev/null -w '%{redirect_url}\n' https://cloud.example.com/apps/user_oidc/login/1 - redirect_uri aus der Authorize-URL dekodieren
python3 -c "import sys,urllib.parse as u;print(u.parse_qs(u.urlparse(sys.argv[1]).query)['redirect_uri'][0])" 'PASTE_AUTHORIZE_URL' - Proxy-Einstellungen von Nextcloud anzeigen
sudo -u www-data php /var/www/nextcloud/occ config:system:get overwriteprotocol; sudo -u www-data php /var/www/nextcloud/occ config:system:get overwrite.cli.url
Lösung
- Die dekodierte redirect_uri Zeichen für Zeichen mit der Registrierung beim IdP vergleichen.
- Hinter TLS-Proxy
'overwriteprotocol' => 'https'setzen, damit die App https-URLs erzeugt. - Für Nextcloud user_oidc
https://cloud.example.com/apps/user_oidc/coderegistrieren, mit'htaccess.RewriteBase' => '/'ohne index.php. - Keine Wildcards in Produktion – lieber die exakten URLs eintragen.
- Bei Entra ID heißt der Fehler AADSTS50011, bei Keycloak „Invalid parameter: redirect_uri“ – die Lösung ist dieselbe.
Häufige Fragen
Warum funktioniert es intern, aber nicht von außen?
Intern erzeugt die App eine URL mit internem Hostnamen oder http. Registriert ist aber die externe https-Adresse. overwrite-Einstellungen beheben das.
Ist ein Schrägstrich am Ende wirklich ein Unterschied?
Ja. Die meisten IdPs vergleichen die redirect_uri als exakte Zeichenkette. /code und /code/ sind zwei verschiedene URLs.