Come appare il messaggio
Error 400: redirect_uri_mismatchCause frequenti
- http invece di https, perché l'app dietro un proxy TLS riconosce male il proprio protocollo.
- Slash finale,
index.phpnel percorso o una porta diversa. - Hostname diverso da quello registrato, ad es. indirizzo interno o www contro senza www.
- Nuova URL di callback dopo un aggiornamento dell'app, sull'IdP c'è ancora la vecchia.
- Client sbagliato: il client ID appartiene a un altro ambiente (test/produzione).
Verifica
- Ricava l'URL authorize inviata (Nextcloud user_oidc, provider ID 1)
curl -s -o /dev/null -w '%{redirect_url}\n' https://cloud.example.com/apps/user_oidc/login/1 - Decodifica la redirect_uri dall'URL authorize
python3 -c "import sys,urllib.parse as u;print(u.parse_qs(u.urlparse(sys.argv[1]).query)['redirect_uri'][0])" 'PASTE_AUTHORIZE_URL' - Mostra le impostazioni proxy di Nextcloud
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
Soluzione
- Confronta carattere per carattere la redirect_uri decodificata con la registrazione sull'IdP.
- Dietro un proxy TLS imposta
'overwriteprotocol' => 'https', così l'app genera URL https. - Per Nextcloud user_oidc registra
https://cloud.example.com/apps/user_oidc/code, con'htaccess.RewriteBase' => '/'per togliere index.php. - Niente wildcard in produzione: registra le URL esatte.
- In Entra ID l'errore è AADSTS50011, in Keycloak “Invalid parameter: redirect_uri”: la soluzione è la stessa.
Domande frequenti
Perché funziona dall'interno ma non da fuori?
All'interno l'app genera un'URL con hostname interno o http, ma è registrato l'indirizzo esterno https. Le impostazioni overwrite risolvono.
Lo slash finale fa davvero differenza?
Sì. La maggior parte degli IdP confronta la redirect_uri come stringa esatta. /code e /code/ sono due URL diverse.