Cos’è una URI di reindirizzamento?
Una URI di reindirizzamento, nota anche come URL di callback o URL di reindirizzamento, è una URI che indica dove il Server di autorizzazione dovrebbe reindirizzare l’user-agent dopo che la Richiesta di autorizzazione (Authorization request) è completata.
Gli Universal Resource Identifier (URI) sono spesso confusi con gli URL (Uniform Resource Locator). Per ulteriori informazioni, consulta Unveiling URI, URL, and URN .
Diamo un’occhiata a un esempio di una richiesta di autorizzazione che include una URI di reindirizzamento:
GET /authorize?response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback
&scope=openid%20profile%20email
&state=abc123
&nonce=123456 HTTP/1.1
In questo esempio, il valore grezzo del parametro redirect_uri
è https%3A%2F%2Fclient.example.com%2Fcallback
, che è codificato in URL. Il valore effettivo è https://client.example.com/callback
.
Come funziona una URI di reindirizzamento?
Nel contesto di OpenID Connect (OIDC) , il flusso di lavoro per la Richiesta di autorizzazione (Authorization request) di OAuth 2.0 e il Server di autorizzazione si applica in modo simile. La URI di reindirizzamento funziona allo stesso modo in cui fa in OAuth 2.0, sia per la Richiesta di autenticazione (Authentication request) che per OpenID Provider (OP) .
Supponiamo che il Client avvii la richiesta di autorizzazione dall’URL https://client.example.com
. Dopo che l’utente completa il processo di autorizzazione, il server di autorizzazione reindirizzerà l’user-agent (browser) a https://client.example.com/callback
.
È chiaro che la URI di reindirizzamento è essenziale affinché il server di autorizzazione possa reindirizzare l’user-agent quando il processo di autorizzazione è completo. Inoltre, la URI di reindirizzamento è utilizzata anche per ricevere il codice di autorizzazione o i token, a seconda del flusso.
Ecco un esempio non normativo di come potrebbe apparire il reindirizzamento effettivo in un Flusso del codice di autorizzazione (Authorization code flow) :
HTTP/1.1 302 Found
Location: https://client.example.com/callback?code=AUTHORIZATION_CODE&state=abc123
Nota che i parametri URL code
e state
che sono aggiunti dal server di autorizzazione sono inclusi nella URI di reindirizzamento. Il client deve estrarre i parametri code
e state
dall’URL per continuare il processo di autorizzazione.
Perché abbiamo bisogno di una URI di reindirizzamento?
Come possiamo vedere nell’esempio sopra, il server di autorizzazione deve sapere dove reindirizzare dopo una richiesta di autorizzazione riuscita. È particolarmente utile quando ci sono più client (cioè, Single sign-on (SSO) ), e ogni client ha una diversa URI di reindirizzamento.
Con il Flusso del codice di autorizzazione (Authorization code flow) , la URI di reindirizzamento è utilizzata anche per passare il codice di autorizzazione al client, invece di usare il canale frontale (browser) per evitare di esporre i token a potenziali attacchi.
Era possibile utilizzare il Resource Owner Password Credentials (ROPC) grant per ottenere token per l’utente senza una URI di reindirizzamento. Tuttavia, è deprecato in OAuth 2.1 a causa di problemi di sicurezza.
Considerazioni sulla sicurezza
La URI di reindirizzamento è un parametro critico ed è un obiettivo comune per gli attaccanti. Ecco alcune considerazioni sulla sicurezza da tenere a mente:
- Whitelist delle URI di reindirizzamento: Il client dovrebbe accettare solo URI di reindirizzamento che sono registrate con il server di autorizzazione. Questo previene che gli attaccanti reindirizzino gli utenti a siti malevoli.
- Usa HTTPS: Usa sempre HTTPS per la URI di reindirizzamento per proteggere la comunicazione tra il client e il server di autorizzazione.
- Corrispondenza esatta: La URI di reindirizzamento dovrebbe corrispondere esattamente con la URI registrata. I server di autorizzazione possono imporre regole di corrispondenza rigorose che disabilitano modelli di corrispondenza ampi.
- Parametro di stato: Usa il parametro
state
per prevenire attacchi Cross-site request forgery (CSRF) . Il client dovrebbe validare il parametrostate
per assicurarsi che corrisponda al valore inviato nella richiesta di autorizzazione.