Introduzione a OAuth 2.0

Questa pagina si applica ad Apigee e Apigee hybrid.

Visualizza la documentazione di Apigee Edge.

Home page di OAuth: visita la home page di OAuth per una visualizzazione di primo livello delle indicazioni su OAuth che forniamo.

Questo argomento offre una panoramica di base di OAuth 2.0 su Apigee.

Che cos'è OAuth 2.0?

Esistono molti libri, blog e siti dedicati a OAuth 2.0. Ti consigliamo vivamente di iniziare esaminando la specifica OAuth 2.0 IETF. Ecco la definizione di OAuth 2.0 dalla specifica IETF OAuth 2.0 stessa:

"Il framework di autorizzazione OAuth 2.0 consente a un'applicazione di terze parti di ottenere l'accesso limitato a un servizio HTTP per conto del proprietario di una risorsa orchestrando un'interazione di approvazione tra il proprietario della risorsa e il servizio HTTP oppure consentendo all'applicazione di terze parti di ottenere l'accesso per proprio conto."

La cosa principale da sapere è che OAuth 2.0 consente alle app di ottenere accesso limitato alle risorse protette di un utente (ad esempio il conto bancario o altre informazioni sensibili a cui un utente potrebbe voler accedere da un'app) senza che l'utente debba divulgare le proprie credenziali di accesso all'app.

Il flusso OAuth 2.0

Di seguito è riportato il flusso generale del framework di sicurezza OAuth 2.0. Discuteremo questo flusso in modo più dettagliato in questo argomento, iniziando con un diagramma che illustra molto bene il funzionamento di OAuth 2.0. Se non hai dimestichezza con i termini utilizzati in questo diagramma, leggi questa sezione per una breve introduzione.

Flusso generale per il framework di sicurezza OAuth 2.0.

Termini da conoscere

  • Client: chiamato anche l'app. Può essere un'app in esecuzione su un dispositivo mobile o un'app web tradizionale. L'app invia richieste al server delle risorse per gli asset protetti per conto del proprietario della risorsa. Il proprietario della risorsa deve concedere all'app l'autorizzazione per accedere alle risorse protette.
  • Proprietario della risorsa:chiamato anche utente finale. In genere si tratta della persona (o di un'altra entità) che è in grado di concedere l'accesso a una risorsa protetta. Ad esempio, se un'app deve utilizzare i dati di uno dei tuoi siti di social media, sei il proprietario della risorsa, ovvero l'unica persona che può concedere all'app l'accesso ai tuoi dati.
  • Server di risorse: pensa al server di risorse come a un servizio come Facebook, Google o Twitter; un servizio RU sulla tua intranet; o un servizio di partner sulla tua extranet B2B. Apigee è un server di risorse ogni volta che è necessaria la convalida del token OAuth per elaborare le richieste API. Il server delle risorse ha bisogno di un qualche tipo di autorizzazione prima di poter fornire risorse protette all'app.
  • Server di autorizzazione:il server di autorizzazione è implementato in conformità con la specifica OAuth 2.0 ed è responsabile della convalida delle concessioni di autorizzazione e dell'emissione dei token di accesso che consentono all'app di accedere ai dati dell'utente sul server di risorse. Puoi configurare gli endpoint dei token su Apigee, in questo caso Apigee assume il ruolo di server di autorizzazione.
  • Concessione dell'autorizzazione:concede all'app l'autorizzazione per recuperare un token di accesso per conto dell'utente finale. OAuth 2.0 definisce quattro "tipi di concessione" specifici. Consulta Quali sono i tipi di concessione OAuth 2.0.
  • Token di accesso:una lunga stringa di caratteri che funge da credenziale per accedere alle risorse protette. Consulta Che cos'è un token di accesso?.
  • Risorsa protetta:dati di proprietà del proprietario della risorsa. Ad esempio, l'elenco contatti dell'utente, i dati dell'account o altri dati sensibili.

Il ruolo di Apigee

Puoi proteggere qualsiasi API proxy tramite Apigee con OAuth 2.0. Apigee include un'implementazione del server di autorizzazione e, pertanto, può generare e convalidare i token di accesso. Gli sviluppatori iniziano registrando le proprie app con Apigee. Le app registrate possono richiedere token di accesso tramite una delle quattro interazioni con i tipi di concessione.

Apigee fornisce un criterio OAuthV2 sfaccettato che implementa i dettagli di ogni tipo di concessione, semplificando la configurazione di OAuth su Apigee. Ad esempio, puoi configurare un criterio che riceva una richiesta di token di accesso, valuti tutte le credenziali richieste e restituisca un token di accesso se le credenziali sono valide.

Tieni presente che tutti i server di risorse chiamati dal proxy API sicuro devono essere protetti da un firewall (ovvero le risorse non devono essere accessibili tramite nessun altro mezzo oltre al proxy API o a un'altra API ben protetta).

Quali sono i tipi di autorizzazioni OAuth 2.0?

Pensa ai tipi di concessione come a percorsi o interazioni diversi che un'app può intraprendere per ottenere un token di accesso. Ogni tipo di concessione si occupa di uno o più casi d'uso e dovrai selezionare i tipi di concessione da utilizzare in base alle tue esigenze. In generale, ogni tipo di sovvenzione presenta vantaggi e svantaggi e dovrai valutare i compromessi in base ai casi d'uso della tua attività. Un aspetto importante da considerare è l'affidabilità delle app che avranno accesso ai tuoi dati. In genere, le app di terze parti sono meno attendibili di quelle sviluppate e utilizzate all'interno di un'azienda.

Apigee supporta i quattro tipi principali di concessioni OAuth 2.0:

  • codice di autorizzazione: considerato il tipo di autorizzazione più sicuro. Prima che il server di autorizzazione emetta un token di accesso, l'app deve prima ricevere un codice di autorizzazione dal server di risorse. Hai visto questo flusso ogni volta che la tua app apre un browser per la pagina di accesso del server di risorse e ti invita ad accedere al tuo account effettivo (ad esempio, Facebook o Twitter).

Se accedi correttamente, l'app riceverà un codice di autorizzazione che potrà utilizzare per negoziare un token di accesso con il server di autorizzazione. In genere, questo tipo di autorizzazione viene utilizzato quando l'app risiede su un server anziché sul client. Questo tipo di concessione è considerato molto sicuro perché l'app client non gestisce né visualizza mai il nome utente o la password dell'utente per il server di risorse (ad esempio, l'app non visualizza né gestisce mai le tue credenziali di Twitter). Questo flusso di tipo di concessione è chiamato anche OAuth a tre parti.

  • implicit: considerata una versione semplificata del codice di autorizzazione. In genere, questo tipo di autorizzazione viene utilizzato quando l'app risiede sul client. Ad esempio, il codice dell'app viene implementato in un browser utilizzando JavaScript o un altro linguaggio di scripting (anziché risiedere ed essere eseguito su un server web separato). In questo flusso di tipo di concessione, il server di autorizzazione restituisce un token di accesso direttamente quando l'utente viene autenticato, anziché emettere prima un codice di autorizzazione. In alcuni casi, le concessioni implicite possono migliorare la reattività dell'app, ma questo vantaggio deve essere valutato rispetto alle possibili implicazioni per la sicurezza, come descritto nella specifica IETF.
  • Credenziali della password del proprietario della risorsa: in questo flusso, al client viene emesso un token di accesso quando il nome utente/la password dell'utente vengono convalidati dal server di autorizzazione. Questo flusso è consigliato per le applicazioni altamente attendibili. Un vantaggio di questo flusso rispetto, ad esempio, all'autenticazione di base è che l'utente deve inserire il nome utente/la password una sola volta. Da quel momento, viene utilizzato il token di accesso.
  • Credenziali client: ti consigliamo di utilizzarle nelle situazioni in cui l'app client agisce per proprio conto. In altre parole, il client è anche il proprietario della risorsa. Questo tipo di concessione viene in genere utilizzato quando l'app deve accedere a un servizio di archiviazione dati di backend, ad esempio. L'app deve utilizzare il servizio per funzionare e il servizio è altrimenti opaco per l'utente finale. Con questo tipo di concessione, un'app può ricevere un token di accesso presentando le proprie chiavi ID client e client secret al server di autorizzazione. Non sono necessari ulteriori passaggi. fornisce una soluzione di credenziali client pronta all'uso, facile da implementare per qualsiasi proxy API.

Che cos'è un token di accesso?

Un token di accesso è una lunga stringa di caratteri che funge da credenziale utilizzata per accedere alle risorse protette. I token delle risorse (chiamati anche token bearer) vengono passati nelle intestazioni Authorization, come segue:

$ curl -H "Authorization: Bearer UAj2yiGAcMZGxfN2DhcUbl9v8WsR" \
  http://myorg-test.apigee.net/v0/weather/forecastrss?w=12797282

Il server di risorse comprende che il token di accesso sostituisce le credenziali come nome utente e password. Inoltre, i token di accesso possono essere emessi con limitazioni, in modo che, ad esempio, l'app possa leggere, ma non scrivere o eliminare dati sul server di risorse. Tieni presente che un token di accesso può essere revocato se, ad esempio, l'app è compromessa. In questo caso, dovrai recuperare un nuovo token di accesso per continuare a utilizzare l'app. Tuttavia, non dovrai modificare il tuo nome utente o la tua password sul server delle risorse protette (ad esempio Facebook o Twitter).

I token di accesso in genere hanno una scadenza (per motivi di sicurezza). Alcuni tipi di concessione consentono al server di autorizzazione di emettere un token di aggiornamento, che consente all'app di recuperare un nuovo token di accesso quando quello precedente scade. Per maggiori dettagli sui token di accesso e aggiornamento, consulta la specifica OAuth 2.0 di IETF.

Accesso limitato tramite ambiti

Attraverso il meccanismo degli ambiti, OAuth 2.0 può concedere a un'app l'accesso limitato alle risorse protette. Ad esempio, un'app potrebbe avere accesso solo a risorse specifiche, potrebbe essere in grado di aggiornare le risorse o potrebbe essere concesso solo l'accesso in sola lettura. Nei cosiddetti flussi OAuth a tre vie, l'utente in genere specifica il livello di accesso tramite una pagina di consenso (ad esempio una pagina web in cui l'utente seleziona l'ambito con una casella di controllo o un altro meccanismo).

Registrazione di un'app

Tutti i client (app) devono registrarsi al server di autorizzazione OAuth 2.0 da cui intendono richiedere i token di accesso. Quando registri un'app, ricevi un insieme di chiavi. Una è una chiave pubblica chiamata identificatore client e l'altra è una chiave segreta chiamata secret client. Senza queste chiavi, un'app non può inviare richieste di codici di autorizzazione o token di accesso al server di autorizzazione. Tieni presente che, mentre la specifica OAuth IETF chiama queste chiavi ID client e client secret, l'interfaccia utente di Apigee le chiama ID consumatore e segreto consumatore. Sono equivalenti.

Riepilogo dei casi d'uso di OAuth 2.0

Il flusso di tipo di concessione OAuth 2.0 che hai scelto di implementare dipende dal tuo caso d'uso specifico, poiché alcuni tipi di concessione sono più sicuri di altri. La scelta dei tipi di concessione dipende dall'affidabilità dell'app client e richiede un'attenta considerazione, come descritto nella tabella seguente:

Caso d'uso Attendibilità Tipi di concessione dell'autorizzazione OAuth 2.0 suggeriti Descrizione
B2B (extranet), intranet, altro

App altamente attendibili, scritte da uno sviluppatore interno o da sviluppatori con un rapporto commerciale attendibile con il fornitore dell'API.

App che devono accedere alle risorse per proprio conto.

  • Credenziali client
  • In genere, l'app è anche il proprietario della risorsa
  • Richiede le chiavi ID client e client secret
  • L'app deve essere registrata presso il fornitore di servizi
Siti intranet, portali

App attendibili scritte da sviluppatori interni o di terze parti attendibili.

Un buon esempio è accedere al sito RU della tua azienda per effettuare selezioni assicurative, inviare recensioni o modificare informazioni personali.

  • Password
  • Bias implicito
  • Richiede ID client e secret, oltre a nome utente e password
  • L'app deve essere registrata presso il fornitore di servizi
App disponibili pubblicamente Le app non attendibili sono scritte da sviluppatori di terze parti che non hanno un rapporto commerciale attendibile con il fornitore dell'API. Ad esempio, in genere non è consigliabile considerare attendibili gli sviluppatori che si registrano ai programmi per API pubbliche.
  • Codice di autorizzazione
  • Richiede all'utente di accedere al provider di risorse di terze parti (ad es. Twitter, Facebook)
  • L'app non vede mai il nome utente e la password dell'utente
  • L'app deve essere registrata presso il fornitore di servizi
B2C È coinvolto un singolo utente finale (utente mobile) e le credenziali dell'utente vengono memorizzate sul dispositivo mobile.
  • Bias implicito
  • L'app deve essere registrata presso il fornitore di servizi.
  • Le credenziali utente vengono memorizzate sul dispositivo su cui è in esecuzione l'app.

Sicurezza di OAuth 2.0 e delle chiavi API

La convalida delle chiavi API richiede che un'app invii una chiave ad Apigee. La chiave deve essere una chiave consumer valida di un'app per sviluppatori Apigee associata al proxy API. Se per qualche motivo devi revocare l'autorizzazione per consentire a un'app client di effettuare chiamate a un proxy, devi revocare la chiave consumer. Anche le app client che utilizzano questa chiave non potranno accedere al proxy API. Invece, un token OAuth può essere revocato in qualsiasi momento senza revocare le chiavi dell'app. L'app può semplicemente richiedere un nuovo token per conto dell'utente e, se un token viene concesso, può continuare a utilizzare il proxy API.

Un'altra differenza tra una chiave API e un token è che un token può includere attributi dei metadati che puoi recuperare e utilizzare in un secondo momento. Ad esempio, potresti memorizzare l'ID dell'utente che effettua la chiamata API e utilizzarlo per personalizzare le chiamate al servizio di destinazione di backend.

Per informazioni dettagliate sulla convalida delle chiavi API, consulta Chiavi API. Per informazioni sull'utilizzo degli attributi personalizzati con i token OAuth, consulta Personalizzare token e codici di autorizzazione.

Impatto della scadenza dei token e dei tempi di eliminazione sullo spazio di archiviazione su disco

Quando generi un nuovo token OAuth con il criterio OAuthV2, puoi impostare una scadenza per il token con l'attributo ExpiresIn. Per impostazione predefinita, i token vengono eliminati dall'archiviazione tre giorni dopo la loro scadenza. Se imposti un'ora di scadenza lunga, ad esempio 48 ore, potresti notare un aumento imprevisto dell'utilizzo dello spazio su disco per Cassandra. Per evitare un utilizzo eccessivo dello spazio su disco, puoi impostare un'ora di scadenza più breve (è consigliata un'ora) e/o una configurazione che modifichi il ritardo post-scadenza di tre giorni in un periodo di tempo più breve.

I clienti di Apigee hybrid possono modificare la data e l'ora di eliminazione predefinita impostando la seguente configurazione nel file di override:

runtime:
  cwcAppend:
    "conf_keymanagement_oauth.access.token.purge.after.seconds": "SECONDS"

dove SECONDS è il numero di secondi che Apigee attenderà per eliminare definitivamente i token dopo la loro scadenza. Assicurati di includere questa strofa esattamente come è scritta, incluse le virgolette.

Ad esempio, per impostare l'ora di eliminazione su un'ora dopo la scadenza:

runtime:
  cwcAppend:
    "conf_keymanagement_oauth.access.token.purge.after.seconds": "3600"

Risorse consigliate

Lettura

Consulta la sezione Informazioni su OAuth 2.0.