Proteggere un'API con OAuth 2.0

Questa pagina si applica a Apigee e Apigee ibrido.

Visualizza la documentazione di Apigee Edge.

Questo tutorial mostra come proteggere un proxy API utilizzando un token di accesso OAuth 2.0.

Prima di iniziare

Per completare questo tutorial, devi avere accesso a un'organizzazione Apigee in cui disponi dell'autorizzazione per:

  • Crea ed esegui il deployment dei proxy API
  • Creare prodotti API
  • Creare app per sviluppatori

Devi anche avere un nome host del gruppo di ambienti configurato correttamente con cui puoi effettuare chiamate proxy API Apigee. Se hai dubbi sul nome host del gruppo di ambienti da utilizzare, consulta l'amministratore di Apigee.

Esegui il deployment del proxy OAuth 2.0

Su GitHub forniamo un proxy API, configurato per generare token di accesso OAuth 2.0. Segui questi passaggi per scaricare ed eseguire il deployment di questo proxy API nel tuo ambiente:

  1. Scarica il proxy API di esempio oauth in una directory del tuo file system.
  2. Vai all'UI di Apigee e accedi, quindi seleziona la tua organizzazione Apigee.
  3. Seleziona Develop > API Proxy nella barra di navigazione a sinistra.
  4. Fai clic su Crea nuovo.
    Pulsante Crea proxy
  5. Nella procedura guidata di creazione del proxy, seleziona Carica bundle proxy.
  6. Scegli il file oauth.zip che hai scaricato e fai clic su Avanti.
  7. Fai clic su Crea.
  8. Al termine della build, fai clic su Modifica proxy per visualizzare il nuovo proxy nell'editor proxy API.
  9. Fai clic su Esegui il deployment.
  10. Seleziona la revisione e l'ambiente in cui eseguire il deployment. Puoi lasciare vuoto il campo Account di servizio.
  11. Fai clic su Esegui il deployment.

Hai scaricato un proxy API per la generazione di token di accesso ed eseguito il deployment nella tua organizzazione Apigee.

Visualizza il flusso e il criterio OAuth 2.0

Esamina la configurazione dei criteri OAuth 2.0.

Nuovo editor proxy

A questo punto, osserverai più da vicino i contenuti del proxy API.

  1. Nell'editor del proxy API, fai clic sulla scheda Sviluppo.

    Criteri visualizzati nella scheda Sviluppo.

    Nel riquadro a sinistra, vedrai due criteri. Vedrai anche due flussi POST nella sezione Endpoint proxy.

  2. Fai clic su AccessTokenClientCredential in Proxy Endpoints. L'editor di testo visualizza il codice XML per il flusso condizionale AccessTokenClientCredential:
    <Flow name="AccessTokenClientCredential">
        <Description/>
        <Request>
            <Step>
                <Name>GenerateAccessTokenClient</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/accesstoken") and (request.verb = "POST")</Condition>
    </Flow>
    

    Un flusso è una fase di elaborazione in un proxy API. In questo caso, il flusso viene attivato quando è soddisfatta una determinata condizione (è chiamato "flusso condizionale"). La condizione, definita nell'elemento <Condition>, indica che se viene effettuata la chiamata proxy API alla risorsa /accesstoken e il verbo della richiesta è POST, quindi esegui il criterio GenerateAccessTokenClient, che genera il token di accesso.

  3. Ora diamo un'occhiata al criterio che verrà attivato dal flusso condizionale. Fai clic sul criterio GenerateAccessTokenClient nel riquadro Richiesta: Fai clic su GeneraAccessTokenClient sotto AccessTokenClientCredential.

Editor proxy classico

A questo punto, osserverai più da vicino i contenuti del proxy API.

  1. Nell'editor del proxy API, fai clic sulla scheda Sviluppo. Nel riquadro di navigazione a sinistra vedrai due criteri. Vedrai anche due flussi POST nella sezione Endpoint proxy.
  2. Fai clic su AccessTokenClientCredential in Endpoint Proxy.
    Codice XML per il flusso condizionale.

    Nella visualizzazione codice XML, vedrai un Flow denominato AccessTokenClientCredential:

    <Flow name="AccessTokenClientCredential">
        <Description/>
        <Request>
            <Step>
                <Name>GenerateAccessTokenClient</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/accesstoken") and (request.verb = "POST")</Condition>
    </Flow>
    

    Un flusso è una fase di elaborazione in un proxy API. In questo caso, il flusso viene attivato quando è soddisfatta una determinata condizione. La condizione definita nell'elemento <Condition> è che se viene effettuata la chiamata proxy API alla risorsa /accesstoken e il verbo di richiesta è POST, quindi esegui il criterio GenerateAccessTokenClient, che genera il token di accesso.

  3. Ora diamo un'occhiata al criterio che verrà attivato dal flusso condizionale. Fai clic sull'icona del criterio GenerateAccessTokenClient nel diagramma di flusso.

    Icona del criterio GeneraAccessTokenClient nel diagramma di flusso.

Viene visualizzata la seguente configurazione XML:

<OAuthV2 name="GenerateAccessTokenClient">
    <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
    <Operation>GenerateAccessToken</Operation>
    <!-- This is in milliseconds, so expire in an hour -->
    <ExpiresIn>3600000</ExpiresIn>
    <SupportedGrantTypes>
        <!-- This part is very important: most real OAuth 2.0 apps will want to use other
         grant types. In this case it is important to NOT include the "client_credentials"
         type because it allows a client to get access to a token with no user authentication -->
        <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
    <GrantType>request.queryparam.grant_type</GrantType>
    <GenerateResponse/>
</OAuthV2>

La configurazione include:

  • <Operation>, che può essere uno dei numerosi valori predefiniti, definisce lo scopo del criterio. In questo caso, genererà un token di accesso.
  • Il token scadrà 1 ora (3600000 millisecondi) dopo essere stato generato.
  • In <SupportedGrantTypes>, si prevede che verrà utilizzato OAuth 2.0 <GrantType> client_credentials (scambio di una chiave utente e di un secret per un token OAuth 2.0).
  • Il secondo elemento <GrantType> indica al criterio dove cercare nella chiamata API il parametro del tipo di autorizzazione, come richiesto dalla specifica OAuth 2.0. (questo sarà visualizzato più avanti nella chiamata API). Il tipo di concessione può essere inviato anche nell'intestazione HTTP (request.header.grant_type) o come parametro del modulo (request.formparam.grant_type).

Al momento non devi fare altro con il proxy API. Nei passaggi successivi, utilizzerai questo proxy API per generare un token di accesso OAuth 2.0. Prima, però, devi fare un paio di cose:

  • Crea il proxy API che vuoi effettivamente proteggere con OAuth 2.0.
  • Crea alcuni altri artefatti che restituiranno la chiave utente e il secret utente necessari per lo scambio di un token di accesso.

Crea un proxy API protetto

Ora creerai il proxy API da proteggere. Questa è la chiamata API che restituisce un elemento desiderato. In questo caso, il proxy API chiamerà il servizio mocktarget di Apigee per restituire il tuo indirizzo IP. MA, potrai vederlo solo se passi un token di accesso OAuth 2.0 valido con la chiamata API.

Il proxy API che crei qui includerà un criterio che verifica la presenza di un token OAuth 2.0 nella richiesta.

  1. Seleziona Develop > API Proxy nella barra di navigazione a sinistra.
  2. Fai clic su Crea nuovo.
    Pulsante Crea proxy
  3. Nella procedura guidata Crea un proxy, seleziona Inverti proxy (più comune).
  4. Configura il proxy con quanto segue:
    In questo campo fai questo
    Nome proxy Inserisci: helloworld_oauth2
    Percorso di base del progetto

    Cambia in: /hellooauth2

    Il percorso di base del progetto fa parte dell'URL utilizzato per effettuare richieste al proxy API.

    API esistente

    Inserisci: https://mocktarget.apigee.net/ip

    Definisce l'URL di destinazione che Apigee richiama su una richiesta al proxy API.

    Descrizione Inserisci: hello world protected by OAuth 2.0
  5. Fai clic su Avanti.
  6. Nella pagina Norme comuni:
    In questo campo fai questo
    Sicurezza: autorizzazione Seleziona:
    • OAuth 2.0

    Queste opzioni sono molto utili. Aggiungeranno automaticamente due criteri al proxy API e creerà un prodotto API.

  7. Fai clic su Avanti.
  8. Nella pagina Riepilogo, in Deployment facoltativo, seleziona un ambiente e fai clic su Crea ed esegui il deployment.
  9. Fai clic su Modifica proxy per visualizzare la pagina Panoramica del proxy API.
    Il deployment del proxy API viene eseguito automaticamente. Il completamento del deployment potrebbe richiedere qualche istante.

Visualizza i criteri

Diamo un'occhiata più da vicino a ciò che hai creato.

Nuovo editor proxy

  1. Nell'editor del proxy API, fai clic sulla scheda Sviluppo. Vedrai che sono stati aggiunti due criteri al flusso di richieste del proxy API:
    • Verifica token di accesso OAuth v2.0: controlla la chiamata API per verificare che sia presente un token OAuth 2.0 valido.
    • Rimuovi autorizzazione intestazione: un criterio Assegna messaggio che rimuove il token di accesso dopo averlo selezionato, in modo che non venga passato al servizio di destinazione. Se il servizio di destinazione necessita del token di accesso OAuth 2.0, non puoi utilizzare questo criterio.
  2. Fai clic sull'icona Verify OAuth v2.0 Access Token (Verifica token di accesso OAuth v2.0) nel riquadro a destra e osserva il codice XML sottostante nell'editor di testo.

Editor proxy classico

  1. Nell'editor del proxy API, fai clic sulla scheda Sviluppo. Vedrai che sono stati aggiunti due criteri al flusso di richieste del proxy API:
    • Verifica token di accesso OAuth v2.0: controlla la chiamata API per verificare che sia presente un token OAuth 2.0 valido.
    • Rimuovi autorizzazione intestazione: un criterio Assegna messaggio che rimuove il token di accesso dopo averlo selezionato, in modo che non venga passato al servizio di destinazione. Se il servizio di destinazione necessita del token di accesso OAuth 2.0, non puoi utilizzare questo criterio.
  2. Fai clic sull'icona Verify OAuth v2.0 Access Token (Verifica token di accesso OAuth v2.0) nella visualizzazione del flusso e osserva il codice XML sottostante nel riquadro del codice.

    Verifica del codice del token di accesso OAuth v2.0

<OAuthV2 async="false" continueOnError="false" enabled="true" name="verify-oauth-v2-access-token">
    <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
    <Operation>VerifyAccessToken</Operation>
</OAuthV2>

Nota che <Operation> è VerifyAccessToken. L'operazione definisce cosa deve fare il criterio. In questo caso, verificherà la presenza di un token OAuth 2.0 valido nella richiesta.

Aggiungi un prodotto API

Per ottenere un token di accesso OAuth 2.0, devi creare tre entità Apigee: un prodotto API, uno sviluppatore e un'app sviluppatore. Innanzitutto, crea il prodotto API:

  1. Seleziona Pubblica > Prodotti API.
  2. Fai clic su +Crea.
  3. Inserisci i dettagli del prodotto API.
    Campo Descrizione
    Nome Nome interno del prodotto API. Non specificare caratteri speciali nel nome.
    Nota: non puoi modificare il nome dopo aver creato il prodotto API.
    Nome visualizzato Nome visualizzato del prodotto API. Il nome visualizzato viene utilizzato nell'interfaccia utente e puoi modificarlo in qualsiasi momento. Se non specificato, verrà utilizzato il valore Name (Nome). Questo campo viene compilato automaticamente utilizzando il valore Nome; puoi modificarne o eliminarne i contenuti. Il nome visualizzato può includere caratteri speciali.
    Descrizione Descrizione del prodotto API.
    Ambiente Ambienti a cui il prodotto API consentirà l'accesso. Seleziona l'ambiente in cui hai eseguito il deployment del proxy API.
    Accedi Seleziona Public (Pubbliche).
    Approva automaticamente le richieste di accesso Attiva l'approvazione automatica delle richieste di chiavi per questo prodotto API da qualsiasi app.
    Quota Ignora per questo tutorial.
    Ambiti OAuth 2.0 consentiti Ignora per questo tutorial.
  4. Nella sezione Operazioni, fai clic su Aggiungi un'operazione.
  5. Nel campo Proxy API, seleziona il proxy API appena creato.
  6. Nel campo Percorso, inserisci "/". Ignora gli altri campi.
  7. Fai clic su Salva per salvare l'operazione.
  8. Fai clic su Salva per salvare il prodotto API.

Aggiungi uno sviluppatore e un'app alla tua organizzazione

Successivamente, simulerai il flusso di lavoro di uno sviluppatore che si registra per utilizzare le tue API. Idealmente, gli sviluppatori dovrebbero registrare se stessi e le loro app tramite il tuo portale per gli sviluppatori. Tuttavia, in questo passaggio aggiungerai uno sviluppatore e un'app come amministratore.

Uno sviluppatore avrà una o più app che chiamano le tue API e ogni app riceverà una chiave e un segreto utente univoci. Questa chiave/segreta per app offre inoltre al provider API un controllo più granulare sull'accesso alle API e report di analisi più granulari sul traffico API, poiché Apigee sa a quale sviluppatore e app appartengono un determinato token OAuth 2.0.

Crea uno sviluppatore

Creiamo uno sviluppatore di nome Nigel Tufnel.

  1. Seleziona Pubblica > Sviluppatori nel menu.
  2. Fai clic su + Sviluppatore.
  3. Inserisci quanto segue nella finestra Nuovo sviluppatore:
    In questo campo Invio
    Nome Nigel
    Cognome Tufnel
    Nome utente nigel
    Email nigel@example.com
  4. Fai clic su Salva.

Registra un'app

Creiamo un'app per Nigel.

  1. Seleziona Pubblica > App.
  2. Fai clic su + App.
  3. Inserisci quanto segue nella finestra Nuova app:
    In questo campo fai questo
    Nome e Nome visualizzato Inserisci: nigel_app
    Developer Fai clic su Sviluppatore e seleziona: Nigel Tufnel (nigel@example.com)
    Callback URL (URL di callback) e Notes Lascia vuoto
  4. In Prodotti, fai clic su Aggiungi prodotto.
  5. Aggiungi il prodotto API appena creato.
  6. Fai clic su Crea.

Recuperare la chiave e il segreto utente

Ora riceverai la chiave utente e il segreto utente che verranno scambiati con un token di accesso OAuth 2.0.

  1. Assicurati che venga visualizzata la pagina nigel_app. In caso contrario, nella pagina delle app (Pubblica > App), fai clic su nigel_app.
  2. Nella pagina nigel_app, fai clic su Mostra nelle colonne Chiave e Secret. Tieni presente che la chiave/il secret è associato al prodotto API che hai creato in precedenza.

  3. Seleziona e copia la chiave e il secret. Incollali in un file di testo temporaneo. Le utilizzerai in un passaggio successivo, durante la quale chiami il proxy API che scambia queste credenziali con un token di accesso OAuth 2.0.

Prova a chiamare l'API per ottenere il tuo indirizzo IP (errore!)

Prova a chiamare il proxy API protetto che hai appena creato. Tieni presente che non trasmetti un token di accesso OAuth 2.0 nella chiamata.

dove YOUR ENV_GROUP_HOSTNAME è il nome host del gruppo di ambienti. Consulta Trovare il nome host del gruppo di ambienti.

Poiché il proxy API utilizza il criterio Verify OAuth v2.0 Access Token (Verifica token di accesso OAuth v2.0) che cerca un token OAuth 2.0 valido nella richiesta, la chiamata non dovrebbe riuscire e appare il seguente messaggio:

{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

In questo caso, l'errore è positivo. Significa che il tuo proxy API è molto più sicuro. Solo le app attendibili con un token di accesso OAuth 2.0 valido possono chiamare questa API.

Ottenere un token di accesso OAuth 2.0

Successivamente, utilizzerai la chiave e il secret copiati e incollati in un file di testo e li scambi con un token di accesso OAuth 2.0. Ora eseguirai una chiamata API al proxy di esempio API che hai importato, oauth, che genererà un token di accesso API.

Utilizzando la chiave e il secret, effettua la seguente chiamata cURL (tieni presente che il protocollo è https):

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
"https://YOUR ENV_GROUP_HOSTNAME/oauth/client_credential/accesstoken?grant_type=client_credentials" \
-d "client_id=CLIENT_KEY&client_secret=CLIENT_SECRET"

Tieni presente che se utilizzi un client come Postman per effettuare la chiamata, client_id e client_secret devono essere inseriti nel corpo della richiesta e devono essere x-www-form-urlencoded.

Dovresti ricevere una risposta simile alla seguente:

{
  "issued_at" : "1466025769306",
  "application_name" : "716bbe61-f14a-4d85-9b56-a62ff8e0d347",
  "scope" : "",
  "status" : "approved",
  "api_product_list" : "[helloworld_oauth2-Product]",
  "expires_in" : "3599", //--in seconds
  "developer.email" : "nigel@example.com",
  "token_type" : "BearerToken",
  "client_id" : "xNnREu1DNGfiwzQZ5HUN8IAUwZSW1GZW",
  "access_token" : "GTPY9VUHCqKVMRB0cHxnmAp0RXc0",
  "organization_name" : "myOrg",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

Hai ricevuto il tuo token di accesso OAuth 2.0. Copia il valore access_token (senza le virgolette) e incollalo nel file di testo. Potrai usarlo a breve.

Cosa è successo?

Ricordi in precedenza, quando hai esaminato quel "flusso condizionale" nel proxy oauth, quello che diceva se l'URI della risorsa è /accesstoken e il verbo di richiesta è POST, per eseguire il criterio OAuth 2.0 GenerateAccessTokenClient che genera un token di accesso? Il tuo comando cURL soddisfa queste condizioni, pertanto è stato eseguito il criterio OAuth 2.0. Ha verificato la tua chiave e il tuo segreto utente e li ha scambiati con un token OAuth 2.0 che scade dopo un'ora.

Chiamata all'API con un token di accesso (operazione riuscita)

Ora che disponi di un token di accesso, puoi utilizzarlo per chiamare il proxy API. Effettua la seguente chiamata cURL. Sostituisci il nome della tua organizzazione Apigee e il token di accesso.

curl https://YOUR ENV_GROUP_HOSTNAME/hellooauth2 -H "Authorization: Bearer TOKEN"

Ora dovresti ricevere una chiamata al proxy API che restituisce il tuo indirizzo IP. Ad esempio:

{"ip":"::ffff:192.168.14.136"}

Puoi ripetere la chiamata API per quasi un'ora, dopodiché scadrà il token di accesso. Per effettuare la chiamata dopo un'ora, devi generare un nuovo token di accesso seguendo i passaggi precedenti.

Complimenti! Hai creato un proxy API e lo hai protetto richiedendo l'inclusione nella chiamata di un token di accesso OAuth 2.0 valido.

Argomenti correlati