oauth - Qual è la differenza tra i 2 flussi di lavoro? Quando utilizzare il flusso del codice di autorizzazione?




oauth-2.0 (5)

Flusso implicito

vantaggi

  • Più semplice da implementare

svantaggi

  • Accedi ai token visibili al browser
  • L'origine dei token di accesso non può essere determinata
  • I token di accesso non possono scadere (secondo le norme di Google)

Flusso del codice di autorizzazione

vantaggi

  • Più sicuro
  • I token di accesso e i token di aggiornamento possono essere creati solo se è noto un segreto condiviso
  • Può essere migliorato con nuove funzionalità di sicurezza e UX quando diventano disponibili

svantaggi

  • Deve implementare più endpoint auth

Citazione: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows

OAuth 2.0 ha più flussi di lavoro. Ho alcune domande riguardo ai due.

  1. Flusso del codice di autorizzazione : l'utente accede dall'app client, il server di autorizzazione restituisce un codice di autorizzazione all'app. L'app scambia quindi il codice di autorizzazione per il token di accesso.
  2. Flusso di concessione implicito : l'utente accede dall'app client, il server di autorizzazione invia direttamente un token di accesso all'app client.

Qual è la differenza tra i due approcci in termini di sicurezza? Quale è più sicuro e perché?

Non vedo un motivo per cui un passaggio aggiuntivo (scambio di codice di autorizzazione per token) viene aggiunto in un flusso di lavoro quando il server può emettere direttamente un token di accesso.

Diversi siti Web affermano che il flusso del codice di autorizzazione viene utilizzato quando l'app client può proteggere le credenziali. Perché?


Aggiungerò qualcosa qui che non penso sia chiarito nelle risposte di cui sopra:

  • Il codice di autorizzazione-Flusso consente al token di accesso finale di non raggiungere mai e non essere mai memorizzato sulla macchina con il browser / l'app . Il codice di autorizzazione temporaneo viene fornito alla macchina con il browser / l'app, che viene quindi inviato a un server. Il server può quindi scambiarlo con un token di accesso completo e avere accesso alle API, ecc. L'utente con il browser ottiene l'accesso all'API solo attraverso il server con il token.
  • Il flusso implicito può coinvolgere solo due parti e il token di accesso finale viene memorizzato sul client con il browser / l'app. Se questo browser / app è compromesso, anche il loro token di autenticazione potrebbe essere pericoloso.

tl; dr non usa il flusso implicito se non ti fidi della macchina degli utenti per tenere i token ma ti fidi dei tuoi server.


La concessione implicita è simile alla concessione del codice di autorizzazione con due distinte differenze.

È destinato a essere utilizzato per client basati su user-agent (ad esempio app web a pagina singola) che non possono mantenere un client segreto poiché tutto il codice dell'applicazione e l'archiviazione sono facilmente accessibili.

In secondo luogo, invece del server di autorizzazione che restituisce un codice di autorizzazione che viene scambiato per un token di accesso, il server di autorizzazione restituisce un token di accesso.

Si prega di trovare i dettagli qui http://oauth2.thephpleague.com/authorization-server/which-grant/


La differenza tra entrambi è che:

  1. In Flusso implicito, il token viene restituito direttamente tramite l'URL di reindirizzamento con il segno "#" e questo è utilizzato principalmente in client javascript o applicazioni mobili che non hanno il lato server a sé stante e il client non deve fornire il suo segreto in alcune implementazioni .

  2. Nel flusso del codice di autorizzazione, il codice viene restituito con "?" per essere leggibile dal lato server, lato server è necessario fornire questa volta il client all'URL del token per ottenere token come oggetto json dal server di autorizzazione. Viene utilizzato nel caso in cui si disponga di un server applicazioni in grado di gestirlo e di archiviare il token utente con il proprio profilo sul proprio sistema e utilizzato principalmente per le comuni applicazioni mobili.

quindi dipende dalla natura della tua applicazione client, quale un "codice di autorizzazione" più sicuro in quanto richiede il segreto sul client e il token può essere inviato tra il server di autorizzazione e l'applicazione client su una connessione molto sicura e il provider di autorizzazione può limitare alcuni client a utilizzare solo "Codice di autorizzazione" e disabilitare Implicit


access_token è ciò che è necessario chiamare una risorsa protetta (un'API). Nel flusso del codice di autorizzazione ci sono 2 passaggi per ottenerlo:

  1. L'utente deve autenticare e restituire un code al consumatore dell'API (chiamato "Client").
  2. Il "client" dell'API (di solito il tuo server web) scambia il code ottenuto in # 1 per un access_token , autenticandosi con un client_id e client_secret
  3. Quindi può chiamare l'API con access_token .

Quindi, c'è un doppio controllo: l'utente che possiede le risorse emerse tramite un'API e il client che utilizza l'API (ad esempio un'app Web). Entrambi sono convalidati per consentire l'accesso. Nota la natura di "autorizzazione" di OAuth qui: l'utente concede l'accesso alla sua risorsa (tramite il code restituito dopo l'autenticazione) a un'app, l'app ottiene un access_token e chiama per conto dell'utente.

Nel flusso implicito, il passaggio 2 viene omesso. Quindi, dopo l'autenticazione dell'utente, viene restituito un access_token , che è possibile utilizzare per accedere alla risorsa. L'API non sa chi sta chiamando quell'API. Chiunque abbia il access_token può, mentre nell'esempio precedente, solo l'app Web (i suoi interni non sono normalmente accessibili a nessuno).

Il flusso implicito viene solitamente utilizzato in scenari in cui non è consigliabile memorizzare client id e client secret (ad esempio un dispositivo, sebbene molti lo facciano comunque). Questo è ciò che significa il disclaimer. Le persone hanno accesso al codice cliente e quindi possono ottenere le credenziali e fingere di diventare clienti risorsa. Nel flusso implicito tutti i dati sono volatili e nell'app non c'è nulla.