Proteggi un'API con OAuth

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Cosa imparerai a fare

  • Scarica e implementa un proxy API di esempio.
  • Crea un proxy API protetto da OAuth.
  • Crea un prodotto, uno sviluppatore e un'app.
  • Scambia le credenziali con un token di accesso OAuth.
  • Chiama un'API con un token di accesso.

Questo tutorial mostra come proteggere un'API con OAuth 2.0.

OAuth è un protocollo di autorizzazione che consente alle app di accedere alle informazioni per conto degli utenti senza richiedere loro di divulgare il nome utente e la password.

Con OAuth, le credenziali di sicurezza (come nome utente/password o chiave/secret) vengono scambiate con un token di accesso. Ad esempio:

joe:joes_password (username:password) o
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (key:secret)

diventa qualcosa del tipo:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Il token di accesso è una stringa casuale di caratteri ed è temporaneo (deve scadere dopo un periodo di tempo relativamente breve), quindi passarlo per autenticare un utente in un flusso di lavoro dell'app è molto più sicuro che passare le credenziali effettive.

La specifica OAuth 2.0 definisce diversi meccanismi, chiamati "tipi di concessione", per distribuire i token di accesso per le app. Il tipo di concessione più semplice definito da OAuth 2.0 è chiamato "credenziali client". In questo tipo di concessione, i token di accesso OAuth vengono generati in cambio delle credenziali client, ovvero coppie di chiave utente/secret utente, come nell'esempio precedente.

Il tipo di concessione delle credenziali client in Edge viene implementato utilizzando criteri nei proxy API. Un tipico flusso OAuth prevede due passaggi:

  • Chiama il proxy API 1 per generare un token di accesso OAuth dalle credenziali client. A questo scopo, viene utilizzata una norma OAuth v2.0 sul proxy API.
  • Chiama il proxy API 2 per inviare il token di accesso OAuth in una chiamata API. Il proxy API verifica il token di accesso utilizzando una policy OAuth v2.0.

Che cosa ti serve

  • Un account Apigee Edge. Se non ne hai ancora uno, puoi registrarti seguendo le istruzioni in Creazione di un account Apigee Edge.
  • cURL installato sulla tua macchina per effettuare chiamate API dalla riga di comando.

Scarica ed esegui il deployment di un proxy API che genera token

In questo passaggio, creerai il proxy API che genera un token di accesso OAuth da una chiave utente e un segreto utente inviati in una chiamata API. Apigee fornisce un proxy API di esempio che lo fa. Ora scaricherai e implementerai il proxy, che utilizzerai più avanti nel tutorial. (Puoi creare facilmente questo proxy API da solo. Questo passaggio di download e implementazione è per comodità e per mostrarti quanto sia facile condividere i proxy già creati.

  1. Scarica il file ZIP del proxy API di esempio "oauth" in qualsiasi directory del file system.
  2. Vai all'indirizzo https://apigee.com/edge e accedi.
  3. Seleziona Sviluppa > Proxy API nella barra di navigazione a sinistra.
  4. Fai clic su + Proxy.
    Pulsante Crea proxy
  5. Nella procedura guidata Crea proxy, fai clic su 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. Nella pagina Panoramica dell'editor proxy API, fai clic sul menu a discesa Deployment e seleziona test. Questo è l'ambiente di test della tua organizzazione.

    Al prompt di conferma, fai clic su Implementa.
    Quando fai di nuovo clic sul menu a discesa Deployment, un'icona verde indica che il proxy è stato implementato nell'ambiente di test.

Complimenti! Hai scaricato ed eseguito correttamente il deployment di un proxy API per la generazione di token di accesso nella tua organizzazione Edge.

Visualizza il flusso e le norme OAuth

Diamo un'occhiata più da vicino ai contenuti del proxy API.

  1. Nell'editor proxy API, fai clic sulla scheda Sviluppa. Nel riquadro Navigator a sinistra, vedrai due policy. Vedrai anche due flussi POST nella sezione Proxy Endpoints.
  2. Fai clic su AccessTokenClientCredential in Proxy Endpoints.

    Nella visualizzazione del codice XML, vedrai un Flow chiamato 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 è un passaggio di elaborazione in un proxy API. In questo caso, il flusso viene attivato quando viene soddisfatta una determinata condizione (si chiama flusso condizionale). La condizione, definita nell'elemento <Condition>, indica che se la chiamata al proxy API viene effettuata alla risorsa /accesstoken e il verbo della richiesta è POST, esegui il criterio GenerateAccessTokenClient, che genera il token di accesso.

  3. Ora vediamo il criterio che attiverà il flusso condizionale. Fai clic sull'icona del criterio GenerateAccessTokenClient nel diagramma di flusso.

    La seguente configurazione XML viene caricata nella visualizzazione del codice:

    <OAuthV2 name="GenerateAccessTokenClient">
        <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
        <Operation>GenerateAccessToken</Operation>
        <!-- This is in millseconds, 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 quanto segue:

    • <Operation>, che può essere uno dei diversi valori predefiniti, definisce cosa farà la policy. In questo caso, genererà un token di accesso.
    • Il token scadrà 1 ora (3600000 millisecondi) dopo essere stato generato.
    • In <SupportedGrantTypes>, l'<GrantType> OAuth che dovrebbe essere utilizzato è client_credentials (scambio di una chiave utente e di un secret con un token OAuth).
    • Il secondo elemento <GrantType> indica alla policy dove cercare nella chiamata API il parametro del tipo di concessione, come richiesto dalla specifica OAuth 2.0. Lo vedrai 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. Prima, però, devi fare altre cose:

  • Crea il proxy API che vuoi proteggere con OAuth.
  • Crea altri artefatti che genereranno la chiave utente e il secret consumer che devi scambiare con un token di accesso.

Crea il proxy API protetto da OAuth

Informazioni su "mocktarget"

Il servizio mocktarget è ospitato su Apigee e restituisce dati semplici. Infatti, puoi accedervi in un browser web. Per provarlo, fai clic su quanto segue:

http://mocktarget.apigee.net/ip

La destinazione restituisce ciò che dovresti vedere quando chiami questo proxy API.

Puoi anche visitare la pagina http://mocktarget.apigee.net/help per visualizzare altre risorse API disponibili in mocktarget.

Ora creerai il proxy API che vuoi proteggere. Questa è la chiamata API che restituisce qualcosa che ti interessa. In questo caso, il proxy API chiamerà il servizio mocktarget di Apigee per restituire il tuo indirizzo IP. Tuttavia, potrai visualizzarlo solo se passi un token di accesso OAuth valido con la chiamata API.

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

  1. Seleziona Sviluppa > Proxy API nella barra di navigazione a sinistra.
  2. Fai clic su + Proxy.
    Pulsante Crea proxy
  3. Nella procedura guidata Crea un proxy, seleziona Proxy inverso (il più comune) e fai clic su Avanti.
  4. Configura il proxy con quanto segue:
    In questo campo Fai questo
    Nome proxy Inserisci: helloworld_oauth2
    Project Base Path

    Cambia con: /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 Edge richiama in una richiesta al proxy API.

    Descrizione Inserisci: hello world protected by OAuth
  5. Fai clic su Avanti.
  6. Nella pagina Policy comuni:
    In questo campo Fai questo
    Sicurezza: autorizzazione Seleziona OAuth 2.0.
  7. Fai clic su Avanti.
  8. Nella pagina Virtual Hosts (Host virtuali), fai clic su Avanti.
  9. Nella pagina Build, verifica che sia selezionato l'ambiente test e fai clic su Crea e implementa.
  10. Nella pagina Riepilogo, viene visualizzata una conferma che il nuovo proxy API è stato creato correttamente e che è stato eseguito il deployment nell'ambiente di test.
  11. Fai clic su Modifica proxy per visualizzare la pagina Panoramica del proxy API.
    Tieni presente che questa volta il proxy API viene implementato automaticamente. Fai clic sul menu a discesa Deployment per assicurarti che accanto all'ambiente "test" sia presente un punto verde di deployment.

Visualizzare le norme

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

  1. Nell'editor proxy API, fai clic sulla scheda Sviluppa. Vedrai che sono state aggiunte due policy al flusso di richieste del proxy API:
    • Verifica token di accesso OAuth v2.0: controlla la chiamata API per assicurarsi che sia presente un token OAuth valido.
    • Remove Header Authorization: una policy AssignMessage che rimuove il token di accesso dopo che è stato controllato, in modo che non venga passato al servizio di destinazione. (Se il servizio di destinazione richiedesse il token di accesso OAuth, non utilizzeresti questo criterio).
  2. Fai clic sull'icona Verifica token di accesso OAuth v2.0 nella visualizzazione del flusso e guarda il codice XML sottostante nel riquadro del codice.

    <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 valido nella richiesta.

Aggiungere un prodotto API

Per aggiungere un prodotto API utilizzando l'interfaccia utente Apigee:

  1. Seleziona Pubblica > Prodotti API.
  2. Fai clic su + Prodotto API.
  3. Inserisci i dettagli del prodotto per il tuo prodotto API.
    Campo Descrizione
    Nome Nome interno del prodotto API. Non specificare caratteri speciali nel nome.
    Nota:non puoi modificare il nome una volta creato il prodotto API. Ad esempio, helloworld_oauth2-Product
    Nome visualizzato Nome visualizzato per il prodotto API. Il nome visualizzato viene utilizzato nella UI e puoi modificarlo in qualsiasi momento. Se non specificato, verrà utilizzato il valore Nome. Questo campo viene compilato automaticamente utilizzando il valore Nome. Puoi modificare o eliminare i contenuti. Il nome visualizzato può includere caratteri speciali. Ad esempio, helloworld_oauth2-Product.
    Descrizione Descrizione del prodotto API.
    Ambiente Gli ambienti a cui il prodotto API consentirà l'accesso. Seleziona l'ambiente in cui hai eseguito il deployment del proxy API. Ad esempio, test.
    Accesso Seleziona Pubblico.
    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 consentiti Ignora per questo tutorial.
  4. Nel campo Proxy API, seleziona il proxy API che hai appena creato.
  5. Nel campo Percorso, inserisci "/". Ignora gli altri campi.
  6. Fai clic su Salva.

Aggiungere 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 registrano se stessi e le loro app tramite il tuo portale per sviluppatori. In questo passaggio, invece, aggiungerai uno sviluppatore e un'app come amministratore.

Uno sviluppatore avrà una o più app che chiamano le tue API e ogni app riceve una chiave utente e un secret consumer unici. Questa chiave/secret per app offre anche a te, il fornitore di API, un controllo più granulare sull'accesso alle tue API e report di analisi più granulari sul traffico API, perché Edge sa a quale token OAuth appartengono lo sviluppatore e l'app.

Creare uno sviluppatore

Creiamo uno sviluppatore di nome Nigel Tufnel.

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

Registra un'app

Creiamo un'app per Norberto.

  1. Seleziona Pubblica > App.
  2. Fai clic su + App.
  3. Nella finestra Nuova app, inserisci quanto segue:
    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 Note Lascia vuoto
  4. In Prodotti, fai clic su Aggiungi prodotto.
  5. Seleziona helloworld_oauth2-Product.
  6. Fai clic su Crea.

Ottieni la chiave utente e il secret consumer

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

  1. Assicurati che venga visualizzata la pagina nigel_app. In caso contrario, nella pagina 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 sono associati a "helloworld_oauth2-Product" creato automaticamente in precedenza.

  3. Seleziona e copia la chiave e il secret. Incollali in un file di testo temporaneo. Li utilizzerai in un passaggio successivo, in cui chiamerai il proxy API che scambierà queste credenziali con un token di accesso OAuth.

Prova a chiamare l'API per ottenere il tuo indirizzo IP (operazione non riuscita)

Per divertimento, prova a chiamare il proxy API protetto che dovrebbe restituire il tuo indirizzo IP. Esegui il seguente comando cURL in una finestra del terminale, sostituendo il nome dell'organizzazione Edge. La parola test nell'URL è l'ambiente di test della tua organizzazione, quello in cui hai eseguito il deployment dei proxy. Il percorso base del proxy è /hellooauth2, lo stesso percorso base specificato durante la creazione del proxy. Tieni presente che non stai passando un token di accesso OAuth nella chiamata.

curl https://ORG_NAME-test.apigee.net/hellooauth2

Poiché il proxy API ha il criterio Verifica token di accesso OAuth v2.0 che verifica la presenza di un token OAuth valido nella richiesta, la chiamata dovrebbe non riuscire con il seguente messaggio:

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

In questo caso, l'errore è un bene. Ciò significa che il proxy API è molto più sicuro. Solo le app attendibili con un token di accesso OAuth valido possono chiamare correttamente questa API.

Ottenere un token di accesso OAuth

Ora arriviamo alla parte più interessante. Stai per utilizzare la chiave e il secret che hai copiato e incollato in un file di testo e scambiarli con un token di accesso OAuth. Ora effettuerai una chiamata API al proxy di esempio dell'API che hai importato, oauth, che genererà un token di accesso API.

Utilizzando la chiave e il segreto, effettua la seguente chiamata cURL (tieni presente che il protocollo è https), sostituendo il nome dell'organizzazione Edge, la chiave e il segreto dove indicato:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
"https://ORG_NAME-test.apigee.net/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, i parametri client_id e client_secret vanno inseriti nel corpo della richiesta e devono essere x-www-form-urlencoded.

Dovresti ricevere una risposta simile a questa:

{
  "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 ottenuto il token di accesso OAuth. Copia il valore access_token (senza virgolette) e incollalo nel file di testo. Lo utilizzerai tra poco.

Che cosa è successo?

Ricordi quando hai esaminato il flusso condizionale nel proxy oauth, quello che diceva che se l'URI della risorsa è /accesstoken e il verbo della richiesta è POST, esegui la policy GenerateAccessTokenClient OAuth che genera un token di accesso? Il tuo comando cURL soddisfaceva queste condizioni, pertanto è stata eseguita la norma OAuth. Ha verificato la chiave utente e il secret utente e li ha scambiati con un token OAuth che scade dopo 1 ora.

Chiama l'API con un token di accesso (operazione riuscita).

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

curl https://ORG_NAME-test.apigee.net/hellooauth2 -H "Authorization: Bearer TOKEN"

A questo punto, dovresti ricevere una chiamata riuscita 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é il token di accesso scadrà. Per effettuare la chiamata dopo un'ora, dovrai generare un nuovo token di accesso seguendo i passaggi precedenti.

Complimenti! Hai creato un proxy API e lo hai protetto richiedendo che nella chiamata sia incluso un token di accesso OAuth valido.

Argomenti correlati