Aggiunta del supporto CORS alle distribuzioni API

Scopri come utilizzare un criterio di richiesta per aggiungere il supporto CORS alle distribuzioni API con Gateway API.

I browser Web in genere implementano un "criterio della stessa origine" per impedire al codice di effettuare richieste contro un'origine diversa da quella da cui è stato servito il codice. L'intenzione della politica della stessa origine è quella di fornire protezione da siti web dannosi. Tuttavia, il criterio same-origin può anche impedire interazioni legittime tra un server e client di un'origine nota e affidabile.

CORS (Cross-Origin Resource Sharing) è uno standard di condivisione cross-origin per semplificare i criteri same-origin consentendo al codice su una pagina Web di utilizzare un'API REST servita da un'origine diversa. Lo standard CORS utilizza intestazioni di richiesta HTTP aggiuntive e intestazioni di risposta per specificare le origini a cui è possibile accedere.

Lo standard CORS richiede inoltre che per alcuni metodi di richiesta HTTP la richiesta sia "pre-volo". Prima di inviare la richiesta effettiva, il browser Web invia una richiesta pre-volo al server per determinare se i metodi nella richiesta effettiva sono supportati. Il server risponde con i metodi che consentirà in una richiesta effettiva. Il browser Web invia la richiesta effettiva solo se la risposta del server indica che i metodi nella richiesta effettiva sono consentiti. Lo standard CORS consente inoltre ai server di comunicare ai client se le richieste possono includere credenziali (cookie, intestazioni di autorizzazione o certificati client TLS).

Per ulteriori informazioni su CORS, consulta le risorse disponibili online, incluse quelle provenienti da W3C e Mozilla.

Il servizio Gateway API consente di abilitare il supporto CORS nelle interfacce API distribuite nei gateway API. Quando si abilita il supporto CORS in una distribuzione API, le richieste pre-volo HTTP e le richieste effettive alla distribuzione API restituiscono una o più intestazioni di risposta CORS al client API. Impostare i valori dell'intestazione di risposta CORS nella specifica di distribuzione API.

Utilizzare i criteri di richiesta per aggiungere il supporto CORS alle API (vedere Aggiunta di criteri di richiesta e di risposta alle specifiche di distribuzione delle API). È possibile applicare un criterio di richiesta CORS a livello globale a tutti gli instradamenti in una specifica di distribuzione API o solo a determinati instradamenti.

È possibile aggiungere un criterio di richiesta CORS a una specifica di distribuzione API effettuando le operazioni riportate di seguito.

  • utilizzo di Console
  • modifica di un file JSON

Utilizzo della console per aggiungere i criteri di richiesta CORS

Per aggiungere un criterio di richiesta CORS a una specifica di distribuzione API utilizzando la console, procedere come segue.

  1. Creare o aggiornare una distribuzione API utilizzando la console, selezionare l'opzione Da zero e immettere i dettagli nella pagina Informazioni di base.

    Per ulteriori informazioni, vedere Distribuzione di un'interfaccia API in un gateway API mediante la creazione di una distribuzione API e Aggiornamento di un gateway API o di una distribuzione API.

  2. Nella sezione Criteri di richiesta API della pagina Informazioni di base, fare clic sul pulsante Aggiungi accanto a CORS e specificare:

    • Origini consentite: un'origine che può accedere alla distribuzione API. Ad esempio, https://oracle.com. Fare clic su + Altra origine per immettere la seconda e le origini successive.
    • Metodi consentiti: uno o più metodi consentiti nella richiesta effettiva alla distribuzione dell'API. Ad esempio, GET, PUT.
    • Intestazioni consentite: facoltativamente, un'intestazione HTTP consentita nella richiesta effettiva alla distribuzione dell'API. Ad esempio, opc-request-id o If-Match. Fare clic su + Altra intestazione per immettere la seconda e le successive intestazioni.
    • Intestazioni visualizzate: facoltativamente, un'intestazione HTTP a cui i client API possono accedere nella risposta della distribuzione API a una richiesta effettiva. Ad esempio, ETag o opc-request-id. Fare clic su + Altra intestazione per immettere la seconda e le successive intestazioni.
    • Età massima in secondi: facoltativamente, un valore intero che indica per quanto tempo (in secondi delta) i risultati di una richiesta preliminare possono essere inseriti nella cache da un browser. Se non si specifica un valore, l'impostazione predefinita è 0.
    • Abilita credenziali consentite: indica se la richiesta effettiva alla distribuzione dell'API può essere effettuata utilizzando le credenziali (cookie, intestazioni di autorizzazione o certificati client TLS). Per impostazione predefinita, questa opzione non è selezionata.

    Per informazioni su come i diversi campi del criterio di richiesta CORS vengono mappati su intestazioni di risposta CORS diverse, vedere Modalità di mapping di un criterio di richiesta CORS a una risposta CORS.

  3. Fare clic su Applica modifiche.

  4. Fare clic su Avanti per specificare le opzioni di autenticazione nella pagina Autenticazione.

    Per ulteriori informazioni sulle opzioni di autenticazione, vedere Aggiunta di autenticazione e autorizzazione alle distribuzioni API.

  5. Fare clic su Avanti per immettere i dettagli relativi ai singoli instradamenti nella distribuzione API nella pagina Instradamenti. Per specificare i criteri di richiesta CORS applicabili a un singolo instradamento, fare clic su Mostra criteri richiesta di instradamento, fare clic sul pulsante Aggiungi accanto a CORS e specificare quanto segue.

    • Origini consentite: un'origine che può accedere all'instradamento. Ad esempio, https://oracle.com. Fare clic su + Altra origine per immettere la seconda e le origini successive.
    • Metodi consentiti: uno o più metodi consentiti nella richiesta effettiva all'instradamento. Ad esempio, GET, PUT.
    • Intestazioni consentite: facoltativamente, un'intestazione HTTP consentita nella richiesta effettiva all'instradamento. Ad esempio, opc-request-id o If-Match. Fare clic su + Altra intestazione per immettere la seconda e le successive intestazioni.
    • Intestazioni visualizzate: facoltativamente, un'intestazione HTTP a cui i client API possono accedere nella risposta della distribuzione API a una richiesta effettiva. Ad esempio, ETag o opc-request-id. Fare clic su + Altra intestazione per immettere la seconda e le successive intestazioni.
    • Età massima in secondi: facoltativamente, un valore intero che indica per quanto tempo (in secondi delta) i risultati di una richiesta preliminare possono essere inseriti nella cache da un browser. Se non si specifica un valore, l'impostazione predefinita è 0.
    • Abilita credenziali consentite: indica se la richiesta effettiva all'instradamento può essere effettuata utilizzando le credenziali (cookie, intestazioni di autorizzazione o certificati client TLS). Per impostazione predefinita, questa opzione non è selezionata.

    Per informazioni su come i diversi campi del criterio di richiesta CORS vengono mappati su intestazioni di risposta CORS diverse, vedere Modalità di mapping di un criterio di richiesta CORS a una risposta CORS.

  6. Fare clic su Applica modifiche, quindi su Avanti per esaminare i dettagli immessi per la distribuzione dell'API e per i singoli instradamenti.
  7. Fare clic su Crea o su Salva modifiche per creare o aggiornare la distribuzione API.
  8. (Facoltativo) Confermare che l'interfaccia API sia stata distribuita correttamente chiamandola (vedere Chiamata di un'interfaccia API distribuita in un gateway API).

Modifica di un file JSON per aggiungere criteri di richiesta CORS

Per aggiungere un criterio di richiesta CORS a una specifica di distribuzione API in un file JSON, effettuare le operazioni riportate di seguito.

  1. Utilizzando l'editor JSON preferito, modificare la specifica di distribuzione API esistente alla quale si desidera aggiungere il supporto CORS o creare una nuova specifica di distribuzione API (vedere Creazione di una specifica di distribuzione API).

    Ad esempio, la seguente specifica di distribuzione API di base definisce una semplice funzione serverless Hello World in Funzioni OCI come un singolo backend:

    {
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }
  2. Per specificare un criterio di richiesta CORS che si applica a livello globale a tutti gli instradamenti in una distribuzione API, effettuare le operazioni riportate di seguito.

    1. Se non esiste già, inserire una sezione requestPolicies prima della sezione routes. Ad esempio:

      {
        "requestPolicies": {},
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
    2. Aggiungere il seguente criterio cors alla nuova sezione requestPolicies da applicare a livello globale a tutti gli instradamenti in una distribuzione API:

      {
        "requestPolicies": {
          "cors":{
            "allowedOrigins": [<list-of-origins>],
            "allowedMethods": [<list-of-methods>],
            "allowedHeaders": [<list-of-implicit-headers>],
            "exposedHeaders": [<list-of-exposed-headers>],
            "isAllowCredentialsEnabled": <true|false>,
            "maxAgeInSeconds": <seconds>
          }
        },
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }

      dove:

      • "allowedOrigins": [<list-of-origins>] è una lista di origini obbligatoria separata da virgole e consentita per l'accesso alla distribuzione API. Ad esempio, "allowedOrigins": ["*", "https://oracle.com"]
      • "allowedMethods": [<list-of-methods>] è una lista facoltativa separata da virgole di metodi HTTP consentiti nella richiesta effettiva alla distribuzione dell'API. Ad esempio, "allowedMethods": ["*", "GET"]
      • "allowedHeaders": [<list-of-implicit-headers>] è una lista facoltativa separata da virgole di intestazioni HTTP consentite nella richiesta effettiva alla distribuzione dell'API. Ad esempio, "allowedHeaders": ["opc-request-id", "If-Match"]
      • "exposedHeaders": [<list-of-exposed-headers>] è una lista facoltativa di intestazioni HTTP separate da virgole a cui i client API possono accedere nella risposta della distribuzione API a una richiesta effettiva. Ad esempio, "exposedHeaders": ["ETag", "opc-request-id"]
      • "isAllowCredentialsEnabled": <true|false> è true o false, a indicare se la richiesta effettiva alla distribuzione dell'API può essere effettuata utilizzando le credenziali (cookie, intestazioni di autorizzazione o certificati client TLS). Se non viene specificato, il valore predefinito è false.
      • "maxAgeInSeconds": <seconds> è un valore intero che indica per quanto tempo (in secondi delta) i risultati di una richiesta preliminare possono essere inseriti nella cache da un browser. Se non viene specificato, il valore predefinito è 0.

      Ad esempio:

      {
        "requestPolicies": {
          "cors":{
            "allowedOrigins": ["*", "https://oracle.com"],
            "allowedMethods": ["*", "GET"],
            "allowedHeaders": [],
            "exposedHeaders": [],
            "isAllowCredentialsEnabled": false,
            "maxAgeInSeconds": 3000
          }
        },
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }

      Per informazioni su come i diversi campi del criterio di richiesta CORS vengono mappati su intestazioni di risposta CORS diverse, vedere Modalità di mapping di un criterio di richiesta CORS a una risposta CORS.

  3. Per specificare un criterio di richiesta CORS che si applica a un singolo instradamento:

    1. Inserire una sezione requestPolicies dopo la sezione backend per l'instradamento a cui si desidera applicare il criterio. Ad esempio:

      {
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            },
            "requestPolicies": {}
          }
        ]
      }
    2. Aggiungere il seguente criterio cors alla nuova sezione requestPolicies da applicare solo a questo instradamento specifico:
      {
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            },
            "requestPolicies": {
              "cors":{
                 "allowedOrigins": [<list-of-origins>],
                 "allowedMethods": [<list-of-methods>],
                 "allowedHeaders": [<list-of-implicit-headers>],
                 "exposedHeaders": [<list-of-exposed-headers>],
                 "isAllowCredentialsEnabled": <true|false>,
                 "maxAgeInSeconds": <seconds>
              }
            }
          }
        ]
      }

      dove:

      • "allowedOrigins": [<list-of-origins>] è una lista di origini obbligatoria separata da virgole e consentita per l'accesso alla distribuzione API. Ad esempio, "allowedOrigins": ["*", "https://oracle.com"]
      • "allowedMethods": [<list-of-methods>] è una lista facoltativa separata da virgole di metodi HTTP consentiti nella richiesta effettiva alla distribuzione dell'API. Ad esempio, "allowedMethods": ["*", "GET"]
      • "allowedHeaders": [<list-of-implicit-headers>] è una lista facoltativa separata da virgole di intestazioni HTTP consentite nella richiesta effettiva alla distribuzione dell'API. Ad esempio, "allowedHeaders": ["opc-request-id", "If-Match"]
      • "exposedHeaders": [<list-of-exposed-headers>] è una lista facoltativa di intestazioni HTTP separate da virgole a cui i client API possono accedere nella risposta della distribuzione API a una richiesta effettiva. Ad esempio, "exposedHeaders": ["ETag", "opc-request-id"]
      • "isAllowCredentialsEnabled": <true|false> è true o false, a indicare se la richiesta effettiva alla distribuzione dell'API può essere effettuata utilizzando le credenziali (cookie, intestazioni di autorizzazione o certificati client TLS). Se non viene specificato, il valore predefinito è false.
      • "maxAgeInSeconds": <seconds> è un valore intero che indica per quanto tempo (in secondi delta) i risultati di una richiesta preliminare possono essere inseriti nella cache da un browser. Se non viene specificato, il valore predefinito è 0.

      Ad esempio:

      {
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            },
            "requestPolicies": {
              "cors":{
                 "allowedOrigins": ["*", "https://oracle.com"],
                 "allowedMethods": ["*", "GET"],
                 "allowedHeaders": [],
                 "exposedHeaders": [],
                 "isAllowCredentialsEnabled": false,
                 "maxAgeInSeconds": 3000
              }
            }
          }
        ]
      }

      Per informazioni su come i diversi campi del criterio di richiesta CORS vengono mappati su intestazioni di risposta CORS diverse, vedere Modalità di mapping di un criterio di richiesta CORS a una risposta CORS.

  4. Salvare il file JSON contenente la specifica di distribuzione API.
  5. Utilizzare la specifica di distribuzione API quando si crea o si aggiorna una distribuzione API nei modi riportati di seguito.

    • specificando il file JSON nella console quando si seleziona l'opzione Carica un'interfaccia API esistente
    • specificando il file JSON in una richiesta all'API REST del gateway API

    Per ulteriori informazioni, vedere Distribuzione di un'interfaccia API in un gateway API mediante la creazione di una distribuzione API e Aggiornamento di un gateway API o di una distribuzione API.

  6. (Facoltativo) Confermare che l'interfaccia API sia stata distribuita correttamente chiamandola (vedere Chiamata di un'interfaccia API distribuita in un gateway API).

Modalità di mapping di un criterio di richiesta CORS a una risposta CORS

I diversi campi di una mappa dei criteri di richiesta CORS su intestazioni di risposta CORS diverse, come illustrato nella tabella:

Campo Mappa a intestazione risposta CORS Incluso in risposta a richiesta pre-volo Incluso in risposta a richiesta effettiva Note
allowed Origins Accesso-Control-Consenti-Origine

Obbligatorio?:

Tipo di dati: stringa[]

Valore predefinito: n/a

Utilizzato per restituire una lista separata da virgole di origini che possono accedere alla distribuzione API.

La specifica CORS consente una sola origine, pertanto in caso di origini multiple l'origine client deve essere controllata dinamicamente in base all'elenco dei valori consentiti. I valori "*" e "null" sono consentiti.

allowed Methods metodi consentiti per controllo dell'accesso No

Obbligatorio?: no

Tipo di dati: stringa[]

Valore predefinito: lista vuota

Utilizzato per restituire alla distribuzione API una lista separata da virgole di metodi HTTP consentiti nella richiesta effettiva.

Il valore predefinito di Access-Control-Allow-Methods è quello di consentire attraverso tutti i metodi semplici, anche sulle richieste di preflight.

allowed Headers Intestazioni consentite per controllo dell'accesso No

Obbligatorio?: no

Tipo di dati: stringa[]

Valore predefinito: lista vuota

Utilizzato per restituire alla distribuzione dell'API una lista separata da virgole di intestazioni HTTP consentite nella richiesta effettiva.

exposed Headers Access-Control-Expose-Headers No

Obbligatorio?: no

Tipo di dati: stringa[]

Valore predefinito: lista vuota

Utilizzato per restituire una lista separata da virgole di intestazioni HTTP a cui i client possono accedere nella risposta della distribuzione API a una richiesta effettiva. Questa lista di intestazioni HTTP si aggiunge alle intestazioni di risposta CORS-safelisted.

isAllow Credentials Enabled Credenziali consentite per controllo dell'accesso

Obbligatorio?: no

Tipo di dati: booleano

Valore predefinito: false

Utilizzato per restituire true o false, indicando se la richiesta effettiva alla distribuzione dell'API può essere effettuata utilizzando le credenziali (cookie, intestazioni di autorizzazione o certificati client TLS)

Per consentire l'esecuzione di richieste con credenziali, impostare isAllowCredentialsEnabled su true.

maxAge InSeconds Età massima controllo dell'accesso No Obbligatorio?: no

Tipo di dati: numero intero

Impostazione predefinita: 0

Utilizzato per indicare per quanto tempo (in secondi delta) i risultati di una richiesta preliminare possono essere inseriti nella cache da un browser. Ignorato se impostato su 0.