Proteggi un'API con OAuth

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

Cosa imparerai a fare

  • Scarica ed esegui il deployment di un proxy API di esempio.
  • Crea un proxy API protetto da OAuth.
  • Creare un prodotto, uno sviluppatore e un'app.
  • Scambia le credenziali per 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 che questi debbano divulgare nome utente e password.

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

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

diventa ad esempio:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Il token di accesso è una stringa casuale di caratteri ed è temporaneo (dovrebbe scadere dopo un periodo di tempo relativamente breve), quindi il suo passaggio per autenticare un utente in un flusso di lavoro dell'app è molto più sicuro rispetto alla trasmissione delle credenziali effettive.

La specifica OAuth 2.0 definisce diversi meccanismi, denominati "tipi di autorizzazione", per la distribuzione dei token di accesso per le app. Il tipo di autorizzazione più basilare definito da OAuth 2.0 è chiamato "credenziali client". In questo tipo di autorizzazione, i token di accesso OAuth vengono generati in cambio di credenziali client, che sono coppie chiave/segreto utente, come nell'esempio precedente.

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

  • Chiama il proxy API 1 per generare un token di accesso OAuth dalle credenziali del client. Questo problema viene gestito da un criterio OAuth 2.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 un criterio OAuth 2.0.

Che cosa ti serve

  • Un account Apigee Edge. Se non ne hai ancora uno, puoi registrarti con le istruzioni riportate nella pagina relativa alla 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 per la generazione di token

In questo passaggio, creerai il proxy API che genera un token di accesso OAuth da una chiave e un segreto utente inviati in una chiamata API. Apigee fornisce un proxy API di esempio che esegue questa operazione. Dovrai scaricare ed eseguire il deployment del proxy ora, per poi utilizzarlo in seguito nel tutorial. Puoi creare facilmente questo proxy API in autonomia. Questo passaggio di download e deployment è pensato per praticità e per mostrarti quanto è facile condividere i proxy che sono già stati creati.

  1. Scarica il file ZIP del proxy API di esempio "oauth" in qualsiasi directory del tuo file system.
  2. Vai ad https://apigee.com/edge e accedi.
  3. Seleziona Sviluppo > 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. Una volta completata la 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.

    Alla richiesta di conferma, fai clic su Esegui il deployment.
    Quando fai di nuovo clic sul menu a discesa Deployment, un'icona verde indica che è stato eseguito il deployment del proxy nell'ambiente di test.

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

Visualizzare il flusso e il criterio OAuth

Diamo un'occhiata più da vicino a ciò che contiene il proxy API.

  1. Nell'editor proxy API, fai clic sulla scheda Sviluppo. Nel riquadro di navigazione a sinistra, vedrai due criteri. 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 (denominato 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, 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.

    Nella visualizzazione Codice viene caricata 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 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 vari valori predefiniti, definisce l'azione del criterio. In questo caso, genererà un token di accesso.
    • Il token scadrà 1 ora (3600000 millisecondi) dopo essere stato generato.
    • In <SupportedGrantTypes>, l'elemento <GrantType> OAuth che dovrebbe essere utilizzato è client_credentials (scambiando una chiave e un secret utente con un token OAuth).
    • Il secondo elemento <GrantType> indica al criterio dove cercare il parametro del tipo di autorizzazione nella chiamata API, come richiesto dalla specifica OAuth 2.0. (lo vedrai in seguito nella chiamata API). Il tipo di autorizzazione 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 eseguire altre operazioni:

  • Crea il proxy API che vuoi proteggere con OAuth.
  • Crea qualche altro artefatto che genererà la chiave e il consumer secret da scambiare con un token di accesso.

Crea il proxy API protetto da OAuth

Informazioni sul "target fittizio"

Il servizio mocktarget è ospitato su Apigee e restituisce dati semplici. Infatti, puoi accedervi in un browser web. Fai clic di seguito per fare una prova:

http://mocktarget.apigee.net/ip

Il target restituisce ciò che dovresti vedere quando alla fine chiami questo proxy API.

Puoi anche premere http://mocktarget.apigee.net/help per vedere altre risorse dell'API disponibili nel mocktarget.

Ora creerai il proxy API che vuoi proteggere. Questa è la chiamata API che restituisce qualcosa che vuoi. In questo caso, il proxy API chiama il servizio fittizio di Apigee per restituire il tuo indirizzo IP. Tuttavia, sarà visibile solo se passi un token di accesso OAuth valido con la tua chiamata API.

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

  1. Seleziona Sviluppo > Proxy API nella barra di navigazione a sinistra.
  2. Fai clic su + Proxy.
    Pulsante Crea proxy
  3. Nella procedura guidata Crea un proxy, seleziona Inverti proxy (più comune) e fai clic su Avanti.
  4. Configura il proxy con i seguenti metodi:
    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

    Questo definisce l'URL di destinazione che Apigee Edge richiama su una richiesta al proxy API.

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

Visualizza le norme

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

  1. Nell'editor 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 assicurarsi che sia presente un token OAuth valido.
    • Remove Header Authorization: un criterio di AssegnaMessage che rimuove il token di accesso dopo averlo controllato, in modo che non venga trasmesso al servizio di destinazione. Se il servizio di destinazione necessita del token di accesso OAuth, non devi 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 controlla il codice XML riportato sotto 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 l'azione prevista dal criterio. In questo caso, verifica la presenza di un token OAuth valido nella richiesta.

Aggiungi un prodotto API

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

  1. Seleziona Pubblica > Prodotti API.
  2. Fai clic su +Prodotto API.
  3. Inserisci i dettagli del prodotto per il 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. Ad esempio, helloworld_oauth2-Product
    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 Nome. Questo campo viene compilato automaticamente utilizzando il valore Nome e puoi modificarne o eliminarne i contenuti. Il nome visualizzato può includere caratteri speciali. Ad esempio, helloworld_oauth2-Product.
    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. 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 appena creato.
  5. Nel campo Percorso, inserisci "/". Ignora gli altri campi.
  6. Fai clic su Salva.

Aggiungi uno sviluppatore e un'app alla tua organizzazione

Ora simulerai il flusso di lavoro di uno sviluppatore che si registra per utilizzare le tue API. Idealmente, gli sviluppatori devono registrare se stessi e le loro app tramite il tuo portale per 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 riceve una chiave utente e un consumer secret univoci. Questa chiave/secret-per-app offre inoltre a te, il provider API, un controllo più granulare sull'accesso alle API e report di analisi più granulari sul traffico API, perché Edge sa quale sviluppatore e app appartengono a quale token OAuth.

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 New Developer (Nuovo sviluppatore):
    In questo campo Inserisci
    Nome Nigel
    Cognome Tufnel
    Nome utente nigel
    Email nigel@example.com
  4. Fai clic su Crea.

Registra un'app

Creiamo un'app per Nicola.

  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)
    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.

Recupero della chiave e del segreto utente

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

  1. Assicurati che sia 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. Nota che la chiave/il secret sono associati a "helloworld_oauth2-Product" che è stato creato automaticamente in precedenza.

  3. Seleziona e copia la chiave e il secret. Incollali in un file di testo temporaneo. Le utilizzerai in un passaggio successivo, dove chiami il proxy API che scambierà queste credenziali per un token di accesso OAuth.

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

Tanto per iniziare, prova a chiamare il proxy API protetto che dovrebbe restituire il tuo indirizzo IP. Esegui il comando cURL seguente in una finestra del terminale, sostituendo il nome dell'organizzazione Edge. La parola test nell'URL è l'ambiente di test della tua organizzazione, ovvero quello in cui hai eseguito il deployment dei proxy. Il percorso base del proxy è /hellooauth2, lo stesso percorso base specificato al momento della 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 non dovrebbe riuscire con il seguente messaggio:

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

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

Ottenere un token di accesso OAuth

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

Utilizzando la chiave e il secret, effettua la seguente chiamata cURL (tieni presente che il protocollo è https), sostituendo il nome dell'organizzazione Edge, la chiave e il secret, 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, client_id e client_secret vanno 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. Copia il valore access_token (senza virgolette) e incollalo nel file di testo. Potrai utilizzarlo subito.

Che cos'è appena successo?

Ricordi che in precedenza, quando controllavi il flusso condizionale nel proxy oauth, quello che indicava se l'URI della risorsa è /accesstoken e il verbo della richiesta è POST, per eseguire il criterio OAuth GenerateAccessTokenClient che genera un token di accesso? Il comando cURL soddisfa queste condizioni, quindi è stato eseguito il criterio OAuth. Ha verificato la tua chiave e il segreto utente, scambiandoli con un token OAuth che scade dopo 1 ora.

Chiama l'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 dell'organizzazione Edge e il token di accesso.

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

Ora 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 circa un'ora, dopodiché il token di accesso scadrà. Per effettuare la chiamata dopo un'ora, dovrai generare un nuovo token di accesso utilizzando i passaggi precedenti.

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

Argomenti correlati