Perché OAuth v2 ha sia token di accesso che di aggiornamento?


654

La sezione 4.2 della bozza del protocollo OAuth 2.0 indica che un server di autorizzazione può restituire sia un access_token(che viene utilizzato per autenticarsi con una risorsa) sia un refresh_token, che viene utilizzato esclusivamente per creare un nuovo access_token:

https://tools.ietf.org/html/rfc6749#section-4.2

Perché entrambi? Perché non fare l' access_tokenultimo fino a quando refresh_tokennon hai un refresh_token?

Risposte:


463

L'idea dei token di aggiornamento è che se un token di accesso è compromesso, poiché è di breve durata, l'attaccante ha una finestra limitata in cui abusarne.

I token di aggiornamento, se compromessi, sono inutili perché l'attaccante richiede l'ID client e il segreto oltre al token di aggiornamento per ottenere un token di accesso.

Detto questo , poiché ogni chiamata al server di autorizzazione e al server di risorse viene eseguita su SSL, inclusi l'ID client e il segreto originali quando richiedono i token di accesso / aggiornamento, non sono sicuro di come sia il token di accesso " compromettibile "rispetto al token di aggiornamento di lunga durata e alla combinazione clientid / secret.

Questo ovviamente è diverso dalle implementazioni in cui non si controllano sia i server di autorizzazione che quelli delle risorse.

Ecco un buon thread che parla degli usi dei token di aggiornamento: OAuth Archives .

Una citazione di cui sopra, parlando degli scopi di sicurezza del token di aggiornamento:

Aggiorna token ... mitiga il rischio di perdite di access_token di lunga durata (query param in un file di registro su un server di risorse non sicuro, beta o app server di risorse scarsamente codificate, client JS SDK su un sito non https che inserisce access_token in un cookie, ecc.)


14
Catchdave ha ragione, ma ho pensato di aggiungere che le cose si sono evolute dalla sua risposta iniziale. L'uso di SSL è ora facoltativo (probabilmente si stava ancora discutendo quando ha risposto catchdave). Ad esempio, i token MAC (attualmente in fase di sviluppo), offrono la possibilità di firmare la richiesta con una chiave privata in modo che SSL non sia richiesto. I token di aggiornamento diventano quindi molto importanti poiché si desidera avere token mac di breve durata.
AlexGad,

54
"I token di aggiornamento, se compromessi, sono inutili perché l'attaccante richiede l'ID client e il segreto oltre al token di aggiornamento per ottenere un token di accesso." Ma l'ID client e il segreto sono anche memorizzati nel dispositivo, non è vero? Quindi un attaccante con accesso al dispositivo può ottenerli. Allora perché? Qui, github.com/auth0/lock/wiki/Using-a-Refresh-Token , è scritto che perdere un token di aggiornamento significa che può richiedere tutti i token di autenticazione che desidera, potrebbe non essere nello scenario di Google, ma cosa succede se sto implementando il mio server oauth2?
Jamsheed Kamarudeen,

42
"L'attaccante richiede l'ID client e il segreto oltre al token di aggiornamento per ottenere un token di accesso" : allora qual è la differenza tra l'utilizzo di un token di aggiornamento e la semplice rinuncia?
sp00m,

34
Il token di aggiornamento può essere utilizzato da una terza parte che può rinnovare il token di accesso senza conoscere le credenziali dell'utente.
Marek,

27
@KevinWheeler No, l'ID client e il segreto sono credenziali per il client OAuth, non per l'utente. Quando si parla di OAuth, il "client" è in genere un server (ad esempio il server Web StackOverflow) che si interfaccia con un server API di autorizzazione o risorsa (ad esempio il provider di autorizzazione di Facebook). Le credenziali dell'utente vengono passate solo tra l'utente e il server API OAuth e non vengono mai conosciute dal client. Il segreto del client viene passato solo dal client al server API OAuth e non è mai noto all'utente.
desiderio di macchina il

551

Il link alla discussione, fornito da Catchdave, ha un altro punto valido (originale, dead link) fatto da Dick Hardt, che credo valga la pena essere menzionato qui oltre a quanto scritto sopra:

Il mio ricordo dei token di aggiornamento era per la sicurezza e la revoca. <...>

revoca: se il token di accesso è autonomo, è possibile revocare l'autorizzazione non emettendo nuovi token di accesso. Non è necessario che una risorsa richieda al server di autorizzazione di verificare se il token di accesso è valido. Ciò semplifica la convalida del token di accesso e semplifica il ridimensionamento e il supporto di più server di autorizzazione. C'è una finestra temporale in cui un token di accesso è valido, ma l'autorizzazione viene revocata.

In effetti, nella situazione in cui Resource Server e Authorization Server sono la stessa entità e in cui la connessione tra l'utente e uno di essi è (di solito) ugualmente sicura, non ha molto senso mantenere il token di aggiornamento separato dal token di accesso.

Sebbene, come menzionato nella citazione, un altro ruolo dei token di aggiornamento sia quello di garantire che il token di accesso possa essere revocato in qualsiasi momento dall'utente (tramite l'interfaccia web nei loro profili, ad esempio) mantenendo il sistema scalabile allo stesso tempo .

In genere, i token possono essere identificatori casuali che puntano al record specifico nel database del server o possono contenere tutte le informazioni in sé (certamente, queste informazioni devono essere firmate, con MAC , ad esempio ).

Come dovrebbe funzionare il sistema con token di accesso di lunga durata

Il server consente al Cliente di accedere ai dati dell'utente all'interno di un set predefinito di ambiti emettendo un token. Poiché vogliamo mantenere il token revocabile, dobbiamo archiviare nel database il token insieme al flag "revocato" impostato o non impostato (altrimenti, come lo faresti con il token autonomo?) Il database può contenere fino alen(users) x len(registered clients) x len(scopes combination) record . Ogni richiesta API quindi deve colpire il database. Sebbene sia abbastanza banale eseguire query su tale database eseguendo O (1), il singolo punto di errore stesso può avere un impatto negativo sulla scalabilità e sulle prestazioni del sistema.

Come dovrebbe funzionare il sistema con token di aggiornamento di lunga durata e token di accesso di breve durata

Qui vengono emesse due chiavi: token di aggiornamento casuale con il record corrispondente nel database e token di accesso indipendente firmato, contenente tra l'altro il campo data / ora di scadenza.

Poiché il token di accesso è autonomo, non è necessario accedere al database per verificarne la validità. Tutto quello che dobbiamo fare è decodificare il token e convalidare la firma e il timestamp.

Tuttavia, dobbiamo comunque mantenere il database dei token di aggiornamento, ma il numero di richieste a questo database è generalmente definito dalla durata del token di accesso (maggiore è la durata, minore è la velocità di accesso).

Per revocare l'accesso del Cliente da un determinato Utente, dovremmo contrassegnare il token di aggiornamento corrispondente come "revocato" (o rimuoverlo completamente) e interrompere l'emissione di nuovi token di accesso. È ovvio, tuttavia, che esiste una finestra durante la quale il token di aggiornamento è stato revocato, ma il suo token di accesso potrebbe essere ancora valido.

compromessi

I token di aggiornamento eliminano parzialmente lo SPoF (Single Point of Failure) del database dei token di accesso, ma presentano alcuni ovvi inconvenienti.

  1. La finestra". Un intervallo di tempo tra gli eventi "l'utente revoca l'accesso" e "l'accesso è garantito per essere revocato".

  2. La complicazione della logica del cliente.

    senza token di aggiornamento

    • invia richiesta API con token di accesso
    • se il token di accesso non è valido, fallire e chiedere all'utente di eseguire nuovamente l'autenticazione

    con token di aggiornamento

    • invia richiesta API con token di accesso
    • Se il token di accesso non è valido, provare ad aggiornarlo utilizzando il token di aggiornamento
    • se passa la richiesta di aggiornamento, aggiorna il token di accesso e invia nuovamente la richiesta API iniziale
    • Se la richiesta di aggiornamento fallisce, chiedere all'utente di riautenticare

Spero che questa risposta abbia un senso e aiuti qualcuno a prendere una decisione più ponderata. Vorrei anche notare che alcuni noti provider OAuth2, tra cui github e foursquare, adottano il protocollo senza token di aggiornamento e sembrano soddisfatti.


4
@RomannImankulov Se capisco che aggiorna correttamente il token possiamo salvarlo in db ed eliminarli ogni volta che vogliamo revocare l'accesso, quindi perché non salvare i token di accesso stesso?
kosnkov,

30
@kosnkov la versione breve del mio post è che, se salvi il token di accesso nel database, colpisci il database su ogni richiesta alla tua API (che può o meno essere un problema nel tuo caso particolare). Se si salvano i token di aggiornamento e si mantengono i token di accesso "autonomi", si accede al database solo quando il client decide di aggiornare il token di accesso.
Roman Imankulov,

5
Personalmente non mi piace questo approccio di non colpire il database per ottenere prestazioni se comprometterà la sicurezza (anche se solo per il periodo di tempo della finestra). Uno dovrebbe essere in grado di revocare immediatamente un access_token, se necessario, poiché quasi sempre abbiamo a che fare con informazioni riservate dell'utente (altrimenti probabilmente non useremo OAuth in primo luogo). Mi chiedo quale approccio usano le aziende più grandi come Facebook e Google.
Tiago,

1
Non capisco bene perché dobbiamo tenere la "finestra aperta" per qualche tempo. Perché non possiamo semplicemente inviare una richiesta al server delle risorse per non accettare l'accesso ai token per questo utente? Inoltre, ho ragione che non puoi avere un comportamento token di aggiornamento quando non hai un segreto client con cui firmare tokkens? Quindi praticamente non puoi usare i token di aggiornamento dal software su dispositivi client, app desktop mobili ecc.
Igor Čordaš

1
@PSIXO il server delle risorse non ha alcun archivio permanente oltre al database e forse una cache locale. Pertanto, l'unico modo per verificare se un token viene revocato è colpire il database, che è ciò che l'intero processo tenta di evitare. Quanto alla tua seconda domanda, non hai ragione. Se si dispone di un token di aggiornamento, è possibile richiedere nuovi token di accesso.
Bernie,

199

Nonostante tutte le ottime risposte di cui sopra, io come studente di sicurezza e programmatore che in precedenza ha lavorato su eBay quando ho dato un'occhiata alla protezione dell'acquirente e alla frode, posso dire che separare il token di accesso e aggiornare il token ha il suo miglior equilibrio tra molestare l'utente con un nome utente frequente / inserimento password e mantenendo l'autorità a disposizione per revocare l'accesso a potenziali abusi del servizio.

Pensa a uno scenario come questo. Concedi all'utente un token di accesso di 3600 secondi e aggiorna il token molto più a lungo di un giorno.

  1. L'utente è un buon utente, è a casa e accede / spegne il tuo sito web acquistando e cercando sul suo iPhone. Il suo indirizzo IP non cambia e ha un carico molto basso sul server. Come 3-5 richieste di pagina ogni minuto. Al termine dei 3600 secondi sul token di accesso, ne richiede uno nuovo con il token di aggiornamento. Sul lato server, controlliamo la sua cronologia delle attività e l'indirizzo IP, pensiamo che sia un essere umano e si comporti da solo. Gli garantiamo un nuovo token di accesso per continuare a utilizzare il nostro servizio. L'utente non dovrà inserire nuovamente nome utente / password fino a quando non avrà raggiunto un giorno la durata del token di aggiornamento stesso.

  2. L'utente è un utente negligente . Vive a New York, negli Stati Uniti, ha chiuso il suo programma antivirus ed è stato violato da un hacker in Polonia . Quando l'hacker ha ottenuto il token di accesso e il token di aggiornamento, cerca di impersonare l'utente e utilizzare il nostro servizio. Ma dopo la scadenza del token di accesso di breve durata, quando l'hacker tenta di aggiornare il token di accesso, sul server abbiamo notato un drammatico cambiamento dell'IP nella cronologia del comportamento degli utenti (ehi, questo ragazzo accede negli Stati Uniti e ora aggiorna l'accesso in Polonia dopo solo 3600 ???). Terminiamo il processo di aggiornamento, invalidiamo il token di aggiornamento stesso e chiediamo di inserire nuovamente nome utente / password.

  3. L'utente è un utente malintenzionato . Ha intenzione di abusare del nostro servizio chiamando 1000 volte la nostra API ogni minuto usando un robot. Può farlo fino a 3600 secondi dopo, quando tenta di aggiornare il token di accesso, abbiamo notato il suo comportamento e pensiamo che potrebbe non essere un essere umano. Rifiutiamo e terminiamo il processo di aggiornamento e gli chiediamo di inserire nuovamente nome utente / password. Ciò potrebbe potenzialmente interrompere il flusso automatico del suo robot. Almeno lo mette a disagio.

Puoi vedere che il token di aggiornamento ha funzionato perfettamente quando proviamo a bilanciare il nostro lavoro, l'esperienza dell'utente e il potenziale rischio di un token rubato. Il tuo watch dog sul lato server può controllare più della modifica dell'IP, la frequenza delle chiamate API per determinare se l'utente deve essere un buon utente o meno.

Un'altra parola è che puoi anche provare a limitare il controllo dei danni del token rubato / abuso del servizio implementando su ogni chiamata API il watch watch IP di base o qualsiasi altra misura. Ma questo è costoso in quanto è necessario leggere e scrivere record sull'utente e rallentare la risposta del server.


@laalaguer Hai delle politiche più precise come ad esempio: non revocare il token quando l'indirizzo IP dell'utente viene modificato (quando il telefono cellulare si disconnette dal WiFi e si collega alla rete 3G / 4G)?
svlada,

65
Queste sono alcune ottime idee e politiche, ma non vedo nulla nella tua risposta che richieda intrinsecamente l'uso di token di aggiornamento. Tutte queste funzionalità possono essere implementate solo con il token di accesso.
Evert

12
@Evert, uno dei vantaggi dell'utilizzo sia dei token di accesso che di aggiornamento è che i token di accesso possono essere di breve durata e quindi non è un grave compromesso per la sicurezza fidarsi incondizionatamente di essi senza verificare con il server che li ha originariamente emessi. Ciò può consentire di ridimensionare la propria infrastruttura in modo tale che parti non critiche possano fidarsi delle informazioni memorizzate nel token (firmato) senza accesso diretto alle informazioni dell'account dell'utente.
Avi Cherry,

7
@Avi Cherry - Sì, un token di accesso può essere di breve durata e può anche essere aggiornato se l'utente è ancora considerato valido. Non richiede un token di aggiornamento per farlo.
Rick Jolly,

10
Ritengo che questa risposta presuma che non vogliamo mai che i server di risorse eseguano autonomamente il controllo degli accessi (ad es. Verifica dell'attività IP su vari database, ecc.) E che invece possano fare affidamento solo sulla verifica del token di accesso in completo isolamento. Anche se questo potrebbe essere ovvio su scala (per motivi di prestazioni), chiaramente non è ovvio per tutti qui, data la confusione in altri post e commenti. È un buon post con belle informazioni ma ritengo che manchi molto il punto della domanda originale. Raccomando almeno di rendere esplicito il presupposto di cui sopra.
TNE

72

Nessuna di queste risposte arriva alla ragione principale per cui esistono token di aggiornamento. Ovviamente, puoi sempre ottenere una nuova coppia di accesso-token / refresh-token inviando le tue credenziali client al server di autenticazione, ecco come le ottieni in primo luogo.

Pertanto, l'unico scopo del token di aggiornamento è limitare l'uso delle credenziali del client inviate via cavo al servizio di autenticazione. Più breve è il ttl del token di accesso, più spesso le credenziali del client dovranno essere utilizzate per ottenere un nuovo token di accesso, e quindi maggiori sono le opportunità che gli aggressori devono compromettere le credenziali del client (anche se questo può essere super difficile comunque se la crittografia asimmetrica viene utilizzata per inviarli). Pertanto, se si dispone di un token di aggiornamento monouso, è possibile ridurre arbitrariamente le dimensioni dei token di accesso senza compromettere le credenziali del client.


16
Questo è interessante come nel caso di Google quando chiedi un token di aggiornamento, invii anche l'ID client e il segreto client. Quindi stai comunque scendendo a compromessi ogni ora.
Rottura del

1
Alexander, in realtà più breve è il ttl, più spesso il client dovrà ottenere un nuovo token di accesso (che richiede l'utilizzo delle credenziali del client). Quindi in realtà intendo "più breve" lì. Aggiungerò una nota per chiarire.
BT

2
"unico scopo" - non lava. Rendere il TTL del token di accesso fintanto che quello del token di aggiornamento immaginato raggiungerà lo stesso risultato.
Rabarbaro,

8
Poiché lo standard richiede che le credenziali del client vengano inviate insieme al token di aggiornamento, la premessa di questa risposta è semplicemente falsa. "Poiché i token di aggiornamento sono in genere credenziali di lunga durata utilizzate per richiedere token di accesso aggiuntivi ... il client DEVE autenticarsi con il server di autorizzazione." Vedi anche il commento di @Rots.
Kevin Christopher Henry,

8
A) Penso che tu stia mescolando i segreti dei clienti e i segreti degli utenti. Il segreto del client non viene mai inviato dal dispositivo dell'utente, solo dall'applicazione back-end di accesso ai dati che forniscono l'applicazione back-end. B) Il server oAuth che consente la concessione di password per un client pubblico (un client che non può mantenere un client segreto come un'app nativa o javascript) fornirà anche una concessione di token di aggiornamento per quel client pubblico, quindi non è necessario invia un segreto client durante l'aggiornamento del token. C) Il token di aggiornamento fornisce al back-end un "battito duro" quando verificare la validità dell'utente!
Andreas Lundgren,

55

Per chiarire un po 'di confusione devi capire i ruoli del segreto client e della password utente , che sono molto diversi.

Il client è un'app / sito Web / programma / ..., supportato da un server, che desidera autenticare un utente utilizzando un servizio di autenticazione di terze parti. Il segreto del client è una stringa (casuale) nota sia a questo client che al server di autenticazione. Utilizzando questo segreto il client può identificarsi con il server di autenticazione, ricevendo l' autorizzazione a richiedere token di accesso.

Per ottenere il token di accesso iniziale e il token di aggiornamento, è necessario:

  • L'ID utente
  • La password dell'utente
  • L'ID client
  • Il segreto del cliente

Per ottenere un token di accesso aggiornato, tuttavia il client utilizza le seguenti informazioni:

  • L'ID client
  • Il segreto del cliente
  • Il token di aggiornamento

Ciò mostra chiaramente la differenza: durante l'aggiornamento, il client riceve l'autorizzazione per aggiornare i token di accesso utilizzando il suo segreto client e può quindi autenticare nuovamente l'utente utilizzando il token di aggiornamento anziché l'ID utente + la password. Questo impedisce efficacemente all'utente di dover reinserire la propria password.

Ciò dimostra anche che perdere un token di aggiornamento non è un problema perché l'ID client e il segreto non sono noti. Dimostra anche che è fondamentale mantenere l'ID client e il segreto del client .


1
"Questo dimostra anche che perdere un token di aggiornamento non è un problema perché l'ID client e il segreto non sono noti". Ma non ho bisogno di loro. Se ho un token di aggiornamento, posso passarlo al server delle applicazioni. Aggiunge client_id e secret e quindi passa tutti e tre al servizio OAuth. Qual e il punto?
3DFace

7
Il server delle applicazioni non fornisce un modo per fornire un token di aggiornamento da soli, non è possibile chiedergli di generare un nuovo token di autenticazione assegnandogli un token di aggiornamento. Rinnova il token di autenticazione stesso quando necessario, "dietro le quinte".
Adversus,

2
Si noti che in realtà è necessario il segreto del client per ottenere il token di aggiornamento in primo luogo. Potresti pensare al flusso di autenticazione implicito, in cui non hai bisogno di un segreto, ma i token di aggiornamento non vengono emessi o utilizzati in quel caso.
Kevin Christopher Henry,

@KevinChristopherHenry questo tipo di ipotesi suggerisce che per un utente finale accedendo al sito Web dell'azienda XYZ.com un token di aggiornamento non ha senso per ottenere un nuovo token di accesso per XYZ.com? Ma un token di aggiornamento può essere qualsiasi stringa non indovinabile - come un guid - memorizzata in una tabella che può essere cercata molto rapidamente. Considerando che un token di accesso può essere molto più lungo e più difficile da indicizzare in un database. Quindi il token di aggiornamento PUO 'essere memorizzato e avere vantaggi sul lato dell'utente finale. [anche se dal momento che questa domanda parla di oauth2, forse nessuna risposta senza un servizio di terze parti che agisce per conto di una persona non è comunque pertinente]
Simon_Weaver

perché non puoi semplicemente passare "ID client" + "Segreto client" + "token di accesso scaduto" per ottenere un nuovo token di accesso?
Miele

37

Questa risposta è di Justin Richer tramite la mailing list standard di OAuth 2. Questo è pubblicato con il suo permesso.


La durata di un token di aggiornamento dipende dal server di autorizzazione (AS): possono scadere, essere revocati, ecc. La differenza tra un token di aggiornamento e un token di accesso è il pubblico: il token di aggiornamento ritorna solo al server di autorizzazione, il token di accesso va al server delle risorse (RS).

Inoltre, ottenere un token di accesso non significa che l'utente abbia effettuato l'accesso. In effetti, l'utente potrebbe non essere più lì, che è in realtà il caso d'uso previsto del token di aggiornamento. L'aggiornamento del token di accesso ti darà accesso a un'API per conto dell'utente, non ti dirà se l'utente è lì.

OpenID Connect non ti fornisce solo informazioni utente da un token di accesso, ma ti dà anche un token ID. Questo è un dato separato che è diretto al client stesso, non all'AS o alla RS. In OIDC, dovresti considerare qualcuno che in realtà ha "effettuato l'accesso" dal protocollo se riesci a ottenere un nuovo token ID. Non è probabile che l'aggiornamento sia sufficiente.

Per ulteriori informazioni, leggere http://oauth.net/articles/authentication/


Questo sembra riguardare OpenID Connect e l'autenticazione, quindi non vedo come questo risponda alla domanda, che riguarda la motivazione per l'aggiornamento del token.
sleske,

18

I clienti possono essere compromessi in molti modi. Ad esempio un telefono cellulare può essere clonato. La scadenza di un token di accesso significa che il client è costretto a riautenticare il server delle autorizzazioni. Durante la riautenticazione, il server di autorizzazione può verificare altre caratteristiche (IOW esegue la gestione adattiva degli accessi).

I token di aggiornamento consentono solo una nuova autenticazione del client, dove una nuova autorizzazione forza una finestra di dialogo con l'utente che molti hanno indicato che preferirebbero non fare.

I token di aggiornamento si adattano essenzialmente allo stesso posto in cui i normali siti Web potrebbero scegliere di riautenticare periodicamente gli utenti dopo circa un'ora (ad es. Sito bancario). Al momento non è molto utilizzato poiché la maggior parte dei siti Web social non esegue nuovamente l'autenticazione degli utenti Web, quindi perché dovrebbero autenticare nuovamente un client?


2
"I token di aggiornamento consentono solo una nuova autenticazione del client ..." è un aspetto importante qui.
James,

13

Perché non fare solo durare il token di accesso fino a quando il token di aggiornamento non ha un token di aggiornamento?

Oltre alle ottime risposte fornite da altre persone, c'è un altro motivo per cui utilizzare i token di aggiornamento e che ha a che fare con le affermazioni.

Ogni token contiene attestazioni che possono includere qualsiasi cosa dal nome degli utenti, i loro ruoli o il provider che ha creato il reclamo. Quando un token viene aggiornato, queste affermazioni vengono aggiornate.

Se aggiorniamo i token più spesso, stiamo ovviamente mettendo a dura prova i nostri servizi di identità, ma stiamo ottenendo reclami più accurati e aggiornati.


4
Sarebbe una cattiva pratica insolita inserire tali "richieste" nel token di accesso. Come descritto nelle specifiche , il token di accesso "è generalmente opaco per il client". Hai esempi di provider OAuth che lo fanno?
Kevin Christopher Henry,

3
@heymega Quando il ruolo utente viene declassato da ADMIN a REGULAR_USER l'aspettativa è che il ruolo utente debba essere revocato immediatamente e non alla scadenza di access_token. Quindi, sembra che colpire il database su ogni richiesta sia inevitabile.
svlada,

@svlada Immagino che sarebbe un caso in cui l'applicazione che esegue il downgrade di un'entità da ADMIN a REGULAR_USER (nello stesso processo) dovrebbe anche revocare il token appropriato. cioè se sappiamo che le richieste cambieranno, non aspettiamo la scadenza,
revociamo

13

Per semplificare ulteriormente la risposta di BT: utilizzare i token di aggiornamento quando in genere non si desidera che l'utente debba digitare nuovamente le credenziali, ma si desidera comunque che il potere sia in grado di revocare le autorizzazioni (revocando il token di aggiornamento)

Non è possibile revocare un token di accesso, ma solo un token di aggiornamento.


1
È possibile revocare un token di accesso, che richiede il login di nuovo per un altro token di accesso o l'utilizzo del token di aggiornamento per ottenere un altro token di accesso. Se il token di aggiornamento non era valido, l'utente dovrà eseguire nuovamente l'autenticazione per ottenere un nuovo token di accesso insieme a un nuovo token di aggiornamento.
Atieh,

10
Non sono d'accordo. Un token di accesso viene emesso dal server di autenticazione, firmato con una data di scadenza e inviato al client. Quando il client invia quel token al server delle risorse, il server delle risorse non contatta il server di autenticazione per verificare il token; guarda solo la data di scadenza nel token (firmato e non manomesso). Quindi, indipendentemente da ciò che fai sul server di autenticazione per provare a "revocare", al server di risorse non importa. Alcune persone si riferiscono al logout del client come revoca (ovvero il client elimina il suo token) ma immagino che questa sia una terminologia fuorviante - vogliamo "revocare" un token sul server, non sul client
bitcoder

1
Non dire che non è possibile scrivere codice personalizzato per ignorare determinati token (come qui stackoverflow.com/questions/22708046/… ), ma probabilmente ciò comporta alcuni viaggi di rete dal server delle risorse al server oauth / db ogni volta che il client effettua una chiamata. Puoi evitare quelle chiamate usando invece i token di aggiornamento e penso che sia più in linea con ciò che intendevano gli autori di Oauth.
bitcoder

13

Questa risposta è stata messa insieme dall'aiuto di due sviluppatori senior (John Brayton e David Jennes).

Il motivo principale per utilizzare un token di aggiornamento è ridurre la superficie di attacco.

Supponiamo che non ci sia un tasto di aggiornamento e passiamo attraverso questo esempio:

Un edificio ha 80 porte. Tutte le porte sono aperte con la stessa chiave. La chiave cambia ogni 30 minuti. Alla fine dei 30 minuti devo dare la vecchia chiave al keymaker e ottenere una nuova chiave.

Se sono l'hacker e ottengo la tua chiave, alla fine dei 30 minuti la spedirò al keymaker e riceverò una nuova chiave. Potrò continuamente aprire tutte le porte indipendentemente dal cambio di chiave.

Domanda: Durante i 30 minuti, quante opportunità di hacking ho avuto contro la chiave? Ho avuto 80 opportunità di hacking, ogni volta che hai usato la chiave (pensa a questo come fare una richiesta di rete e passare il token di accesso per identificarti). Quindi questa è una superficie di attacco 80X.

Ora passiamo allo stesso esempio, ma questa volta supponiamo che ci sia un tasto di aggiornamento.

Un edificio ha 80 porte. Tutte le porte sono aperte con la stessa chiave. La chiave cambia ogni 30 minuti. Per ottenere una nuova chiave, non riesco a passare il vecchio token di accesso. Devo solo passare la chiave di aggiornamento.

Se sono l'hacker e ottengo la tua chiave, posso usarla per 30 minuti, ma alla fine dei 30 minuti l'invio al keymaker non ha alcun valore. In tal caso, il keymaker direbbe semplicemente questo token di aggiornamento errato. Per poter estendere il mio hack dovrei hackerare il corriere al keymaker. Il corriere ha una chiave distinta (pensala come un token di aggiornamento).

Domanda: Durante i 30 minuti, quante opportunità di hacking ho avuto contro il tasto di aggiornamento? 80? No. Ho avuto solo 1 opportunità di hacking. Durante il tempo il corriere comunica con il keymaker. Quindi questa è una superficie d'attacco 1X. Ho avuto 80 opportunità di hacking contro la chiave, ma non vanno bene dopo 30 minuti.


Un server verificherebbe un token di accesso in base alle credenziali e alla firma (in genere) di un JWT.

Una perdita del token di accesso è errata, ma una volta scaduta non è più utile a un utente malintenzionato. Una perdita di token di aggiornamento è molto peggio, ma presumibilmente è meno probabile. (Penso che ci sia spazio per chiedersi se la probabilità di una perdita di token di aggiornamento sia molto inferiore a quella di una perdita di token di accesso, ma questa è l'idea.)

Il punto è che il token di accesso viene aggiunto a ogni richiesta effettuata, mentre un token di aggiornamento viene utilizzato solo durante il flusso di aggiornamento. Meno possibilità di un MITM di vedere il token

La frequenza aiuta un attaccante. Possibili perdite di cuore, come potenziali difetti di sicurezza in SSL, potenziali difetti di sicurezza nel client e potenziali difetti di sicurezza nel server.

Inoltre, se il server delle autorizzazioni è separato dal server delle applicazioni che elabora altre richieste client, quel server delle applicazioni non vedrà mai i token di aggiornamento. Vedrà solo token di accesso che non dureranno a lungo.

La compartimentazione è buona per la sicurezza.

Ultimo ma non meno importante vedere questa risposta fantastica


Di quale token di aggiornamento NON si tratta?

La possibilità di aggiornare / revocare il livello di accesso tramite i token di aggiornamento è un sottoprodotto della scelta di utilizzare i token di aggiornamento, altrimenti un token di accesso autonomo potrebbe essere revocato o avere il suo livello di accesso modificato quando scade e gli utenti ottengono un nuovo token


2
è difficile seguire questo confronto poiché le domande sono diverse 1. "Durante i 30 minuti, quante opportunità di hacking ho avuto contro la chiave?" (non avevo prima la chiave come hacker?) 2. "Durante i 30 minuti, quante opportunità di hacking ho avuto contro il corriere?". Quale sarebbe una "opportunità di hacking"? Come hacker, non avevo la chiave in primo luogo?
Cesc

1
Hai ragione. Ho apportato modifiche
Miele

4

Supponi di fare l' access_tokenultimo lunghissimo, e non ce l'hai refresh_token, quindi un giorno l'hacker lo capiràaccess_token e può accedere a tutte le risorse protette!

Ma se lo hai refresh_token, il access_tokentempo di vita è breve, quindi l'hacker è difficile da hackerare access_tokenperché non sarà valido dopo un breve periodo di tempo. Access_tokenpuò essere recuperato solo utilizzando non solo refresh_tokenma anche da client_ideclient_secret , che l'hacker non ha.


2
"usando non solo refresh_token ma anche da client_id e client_secret, che l'hacker non ha." 1. supponi che sia solo token di accesso, quindi l'hacker non ha ancora bisogno di client_id e client_secret? 2. se un hacker è un buon hacker, può hackerare anche client_id e client_secret. Indipendentemente da quella parte, l'hacking di cose aggiuntive non dovrebbe importare al confronto, perché se è difficile hackerare allora è anche difficile hackerare nel caso in cui si usi solo il token di accesso ... per farla breve, non si confrontano situazioni identiche. Li stai mescolando
Honey

2

Mentre il token di aggiornamento viene mantenuto dal server di autorizzazione. Il token di accesso è autonomo, quindi il server delle risorse può verificarlo senza memorizzarlo, risparmiando così lo sforzo di recupero in caso di convalida. Un altro punto mancante nella discussione è da rfc6749 # page-55

"Ad esempio, il server di autorizzazione potrebbe utilizzare la rotazione del token di aggiornamento in cui viene emesso un nuovo token di aggiornamento con ogni risposta di aggiornamento del token di accesso. Il token di aggiornamento precedente viene invalidato ma conservato dal server di autorizzazione. Se un token di aggiornamento viene compromesso e successivamente utilizzato da sia l'attaccante che il cliente legittimo, uno di loro presenterà un token di aggiornamento non valido, che informerà il server di autorizzazione della violazione. "

Penso che il punto centrale dell'utilizzo del token di aggiornamento sia che anche se l'attaccante riesce in qualche modo a ottenere il token di aggiornamento, l'ID client e la combinazione segreta. Con le chiamate successive per ottenere un nuovo token di accesso dall'attaccante può essere tracciato nel caso in cui ogni richiesta di aggiornamento comporti un nuovo token di accesso e un token di aggiornamento.


Penso che questo sia un punto molto importante :-) Inoltre, in una certa misura, invalida l'argomento qui auth0.com/docs/tokens/refresh-token/current#rest restrizioni cheA Single-Page Application (normally implementing Single-Page Login Flow) should not under any circumstances get a Refresh Token. The reason for that is the sensitivity of this piece of information. You can think of it as user credentials, since a Refresh Token allows a user to remain authenticated essentially forever. Therefore you cannot have this information in a browser, it must be stored securely.
Simon_Weaver,

1

Consideriamo un sistema in cui ogni utente è collegato a uno o più ruoli e ogni ruolo è collegato a uno o più privilegi di accesso. Queste informazioni possono essere memorizzate nella cache per migliorare le prestazioni dell'API. Tuttavia, potrebbero esserci dei cambiamenti nell'utente e nelle configurazioni dei ruoli (ad esempio, potrebbe essere concesso un nuovo accesso o potrebbe essere revocato l'accesso corrente) e questi dovrebbero riflettersi nella cache.

A tale scopo possiamo utilizzare i token di accesso e aggiornamento. Quando viene richiamata un'API con token di accesso, il server delle risorse controlla i diritti di accesso alla cache. SE ci sono nuove concessioni di accesso, non si riflette immediatamente. Una volta scaduto il token di accesso (diciamo tra 30 minuti) e il client utilizza il token di aggiornamento per generare un nuovo token di accesso, la cache può essere aggiornata con le informazioni aggiornate sull'accesso utente dal DB.

In altre parole, possiamo spostare le costose operazioni da ogni chiamata API utilizzando i token di accesso all'evento di generazione di token di accesso utilizzando il token di aggiornamento.


0

Innanzitutto, il client esegue l'autenticazione con il server di autorizzazione fornendo la concessione di autorizzazione.

Quindi, il client richiede il server delle risorse per la risorsa protetta fornendo il token di accesso.

Il server delle risorse convalida il token di accesso e fornisce la risorsa protetta.

Il client effettua la richiesta di risorsa protetta al server delle risorse concedendo il token di accesso, dove il server delle risorse lo convalida e serve la richiesta, se valida. Questo passaggio continua a ripetersi fino alla scadenza del token di accesso.

Se il token di accesso scade, il client esegue l'autenticazione con il server di autorizzazione e richiede un nuovo token di accesso fornendo un token di aggiornamento. Se il token di accesso non è valido, il server delle risorse invia al client la risposta di errore del token non valida.

Il client esegue l'autenticazione con il server di autorizzazione concedendo il token di aggiornamento.

Il server di autorizzazione quindi convalida il token di aggiornamento autenticando il client ed emette un nuovo token di accesso, se valido.


Questo in realtà non menziona da dove proviene il token di aggiornamento. Suppongo che il secondo paragrafo dovrebbe dire access token + refresh token?
Simon_Weaver,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.