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




oauth-2.0 (7)

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é?


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


Dal punto di vista pratico (cosa ho capito), il motivo principale per avere il flusso di codice Authz è:

  1. Supporto per i token di aggiornamento (accesso a lungo termine da parte di app per conto dell'utente), non supportato in modo implicito: consultare: https://tools.ietf.org/html/rfc6749#section-4.2
  2. Supporto per la pagina di consenso che è un luogo in cui il proprietario di risorse può controllare quale accesso fornire (tipo di autorizzazioni / pagina di autorizzazione che vedi in google). Lo stesso non è lì implicito. Vedi la sezione: https://tools.ietf.org/html/rfc6749#section-4.1 , punto (B)

"Il server di autorizzazione autentica il proprietario della risorsa (tramite l'utente-agente) e stabilisce se il proprietario della risorsa concede o nega la richiesta di accesso del client"

Oltre a ciò, utilizzando i token di aggiornamento, le app possono ottenere l'accesso a lungo termine ai dati dell'utente.


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.


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/


Permettetemi di riassumere i punti che ho imparato dalle risposte di cui sopra e aggiungere alcune delle mie intese.

Flusso di codice di autorizzazione !!!

  • Se si dispone di un server di applicazioni Web che funge da client OAuth
  • Se vuoi avere un accesso di lunga durata
  • Se si desidera avere accesso offline ai dati
  • quando si è responsabili delle chiamate API effettuate dalla propria app
  • Se non vuoi perdere il token OAuth
  • Se non si desidera che l'applicazione esegua il flusso di autorizzazione ogni volta che è necessario accedere ai dati. NOTA: il flusso di Grant implicito non intrattiene token di aggiornamento, pertanto se il server di autorizzazione scade regolarmente i token di accesso, l'applicazione dovrà eseguire il flusso di autorizzazione ogni volta che è necessario accedere.

Flusso implicito di sovvenzioni !!!

  • Quando non si dispone di Web Application Server per agire come client OAuth
  • Se non hai bisogno di un accesso di lunga durata, è necessario solo un accesso temporaneo ai dati.
  • Se ti fidi del browser in cui viene eseguita la tua app e vi è una preoccupazione limitata che il token di accesso perde a utenti non fidati.

Ecco un elenco di codici di errore: http://fbdevwiki.com/wiki/Error_codes

# 4 significa che hai fatto troppe richieste API. Ci sono dei limiti sul numero di richieste che l'applicazione può dare una certa quantità di tempo. Ci sono anche limiti basati su ciascun utente. Se aspetti qualche istante, l'errore dovrebbe scomparire e permetterti di fare nuovamente richieste.

I codici di errore sono un ritorno alle vecchie API, quindi è possibile che abbiano combinato solo # 4 e # 17 per tornare sempre al punto # 4.

Inoltre, i limiti non sono fissi come "100M / giorno". Vai a Statistiche per la tua applicazione e guarda in Diagnostica. Ti mostrerà quali richieste stanno causando quell'errore. I limiti variano da un giorno all'altro e penso che siano legati a quanto altro traffico ci sia.