Un paio di scenari potrebbero aiutare a illustrare lo scopo dell'accesso e dei token di aggiornamento e i compromessi ingegneristici nella progettazione di un sistema oauth2 (o di qualsiasi altra autorizzazione):
Scenario di app Web
Nello scenario dell'app Web sono disponibili un paio di opzioni:
- se si dispone della propria gestione della sessione, archiviare sia access_token che refresh_token sull'ID sessione nello stato sessione sul servizio stato sessione. Quando una pagina viene richiesta dall'utente che richiede di accedere alla risorsa, utilizzare access_token e se access_token è scaduto, utilizzare refresh_token per ottenere quello nuovo.
Immaginiamo che qualcuno riesca a dirottare la tua sessione. L'unica cosa che è possibile è richiedere le tue pagine.
- se non si dispone della gestione della sessione, inserire access_token in un cookie e utilizzarlo come sessione. Quindi, ogni volta che l'utente richiede pagine dal tuo server web invia access_token. Il server delle app potrebbe aggiornare access_token se necessario.
Confronto tra 1 e 2:
In 1, access_token e refresh_token viaggiano solo attraverso il filo lungo la strada tra il server di autorizzazione (google nel tuo caso) e il tuo server app. Questo sarebbe fatto su un canale sicuro. Un hacker potrebbe dirottare la sessione ma potrebbe interagire solo con la tua app web. In 2, l'hacker potrebbe rimuovere access_token e formare le proprie richieste alle risorse a cui l'utente ha concesso l'accesso. Anche se l'hacker ottiene un access_token avranno solo una breve finestra in cui possono accedere alle risorse.
In ogni caso, refresh_token e clientid / secret sono noti solo al server, rendendo impossibile dal browser web ottenere l'accesso a lungo termine.
Immaginiamo di implementare oauth2 e impostare un timeout lungo sul token di accesso:
In 1) Non c'è molta differenza qui tra un token di accesso breve e lungo poiché è nascosto nel server delle app. In 2) qualcuno potrebbe ottenere il token di accesso nel browser e quindi utilizzarlo per accedere direttamente alle risorse dell'utente per un lungo periodo.
Scenario mobile
Sul cellulare, ci sono un paio di scenari che conosco:
Archivia clientid / secret sul dispositivo e fai orchestrare il dispositivo ottenendo l'accesso alle risorse dell'utente.
Utilizzare un server app back-end per contenere il clientid / secret e fare in modo che l'orchestrazione. Utilizzare access_token come una specie di chiave di sessione e passarlo tra il client e il server delle app.
Confronto tra 1 e 2
In 1) Una volta che hai clientid / segreto sul dispositivo, non sono più segreti. Chiunque può decompilare e quindi iniziare a comportarsi come se fossi tu, con il permesso dell'utente ovviamente. Anche access_token e refresh_token sono in memoria e sono accessibili su un dispositivo compromesso, il che significa che qualcuno potrebbe agire come app senza che l'utente fornisca le proprie credenziali. In questo scenario la lunghezza di access_token non fa differenza per l'hackability poiché refresh_token si trova nello stesso posto di access_token. In 2) il clientid / secret né il token di aggiornamento sono compromessi. Qui la durata della scadenza di access_token determina per quanto tempo un hacker potrebbe accedere alle risorse degli utenti, se dovessero ottenerlo.
Lunghezze di scadenza
Qui dipende da cosa stai proteggendo con il tuo sistema di autenticazione su quanto dovrebbe durare la tua scadenza di access_token. Se è qualcosa di particolarmente prezioso per l'utente, dovrebbe essere breve. Qualcosa di meno prezioso, può essere più lungo.
Alcune persone come Google non scadono il refresh_token. Ad alcuni piace stackflow. La decisione sulla scadenza è un compromesso tra facilità d'uso e sicurezza. La lunghezza del token di aggiornamento è correlata alla lunghezza di ritorno dell'utente, ovvero imposta l'aggiornamento sulla frequenza con cui l'utente ritorna alla tua app. Se il token di aggiornamento non scade, l'unico modo per essere revocato è con una revoca esplicita. Normalmente, un accesso non viene revocato.
Spero che un post piuttosto lungo sia utile.