tl; dr: tutto questo per motivi di sicurezza.
OAuth 2.0 voleva soddisfare questi due criteri:
- Si desidera consentire agli sviluppatori di utilizzare l'URI di reindirizzamento non HTTPS perché non tutti gli sviluppatori dispongono di un server abilitato SSL e, in tal caso, non è sempre configurato correttamente (certificati SSL non autofirmati, attendibili, orologio server sincronizzato ...).
- Non vuoi che gli hacker siano in grado di rubare l'accesso / aggiornare i token intercettando le richieste.
Dettagli sotto:
Il flusso implicito è possibile solo in un ambiente browser per motivi di sicurezza:
Nel flusso implicito il token di accesso viene passato direttamente come frammento di hash (non come parametro URL). Una cosa importante del frammento di hash è che, una volta seguito un collegamento contenente un frammento di hash, solo il browser è a conoscenza del frammento di hash. I browser passano il frammento di hash direttamente alla pagina Web di destinazione (l'URI di reindirizzamento / la pagina Web del client). Il frammento di hash ha le seguenti proprietà:
- Non fanno parte della richiesta HTTP, pertanto non possono essere letti dai server e per questo motivo non possono essere intercettati da server / router intermedi (questo è importante).
- Esistono solo sul browser - lato client - quindi l'unico modo per leggere il frammento di hash è usare JavaScript che gira sulla pagina.
Ciò consente di passare un token di accesso direttamente al client senza il rischio che venga intercettato da un server intermedio. Questo ha il solo avvertimento di essere possibile solo sul lato client e richiede javascript in esecuzione sul lato client per utilizzare il token di accesso.
Il flusso implicito presenta anche problemi di sicurezza che richiedono ulteriore logica per risolvere il problema / evitare ad esempio:
- Un utente malintenzionato potrebbe ottenere un token di accesso da un utente su un altro sito Web / app (supponiamo che sia il proprietario dell'altro sito Web / app), registrare il token sul proprio sito Web e quindi passarlo come parametro URL sul proprio sito Web quindi impersonare l'utente sul tuo sito web. Per evitare ciò, è necessario controllare l'ID client associato al token di accesso (ad esempio per Google è possibile utilizzare l'endpoint tokeninfo) per assicurarsi che il token sia stato emesso con il proprio ID client (ovvero dalla propria app) o controllare la firma se si utilizza un IDToken (ma ciò richiede il segreto del client).
- Se la richiesta di autenticazione non ha avuto origine dalla tua proprietà (chiamata attacchi di fissazione della sessione), per evitarlo ti consigliamo di generare un hash casuale dal tuo sito Web, salvarlo in un cookie e passare lo stesso hash nel parametro URL di stato di la richiesta di autorizzazione, quando l'utente ritorna controlla il parametro di stato con il cookie e deve corrispondere.
Nel flusso del codice di autorizzazione non è possibile passare un token di accesso direttamente in un parametro URL poiché i parametri URL fanno parte della richiesta HTTP, pertanto qualsiasi server / router intermedio attraverso il quale passerebbe la richiesta (potrebbero essere centinaia) potrebbe essere in grado di leggere il token di accesso se non si utilizza una connessione crittografata (HTTPS) che consente i cosiddetti attacchi man-in-the-middle.
In teoria, il passaggio del token di accesso direttamente in un parametro URL potrebbe essere possibile, ma l'autorità dovrebbe assicurarsi che l'URI di reindirizzamento stia utilizzando HTTPS con crittografia TLS e un certificato SSL "attendibile" (in genere da un'autorità di certificazione che non è gratuita) per essere sicuri che il server di destinazione sia legittimo e che la richiesta HTTP sia completamente crittografata. Avere tutti gli sviluppatori che acquistano un certificato SSL e configurare correttamente SSL sul loro dominio sarebbe un grosso problema e rallenterebbe notevolmente l'adozione. Questo è il motivo per cui viene fornito un "codice di autorizzazione" intermedio usa e getta che solo il legittimo destinatario sarà in grado di scambiare (perché è necessario il segreto del cliente) e che il codice sarà inutile per i potenziali hacker che intercettano le richieste su transazioni non crittografate (perché non
Potresti anche sostenere che il flusso implicito è meno sicuro, ci sono potenziali vettori di attacco come lo spoofing del dominio al reindirizzamento, ad esempio dirottando l'indirizzo IP del sito Web del client. Questo è uno dei motivi per cui il flusso implicito garantisce solo token di accesso (che dovrebbero avere un uso limitato nel tempo) e non aggiorna mai token (che sono illimitati nel tempo). Per risolvere questo problema, ti consiglio di ospitare le tue pagine web su un server abilitato HTTPS ogni volta che è possibile.