Utilizzo di CORS

Cross-Origin Resource Sharing (CORS) è un protocollo basato sull'intestazione che consente a JavaScript di effettuare richieste per conto dell'utente per accedere alle risorse in un altro dominio. Configurare Cloud Gate in modo che abiliti CORS e applichi le impostazioni CORS per Cloud Gate in esecuzione nel gateway applicazioni o nei domini di identità IAM.

CORS aiuta a evitare che JavaScript (impiantato in un sito da aggressori, ad esempio utilizzando annunci pubblicitari) faccia richieste AJAX per tuo conto. Le richieste fraudolente di AJAX potrebbero prelevare denaro dalla tua banca o effettuare acquisti a tuo nome su un sito di shopping online. Queste richieste potrebbero avere esito positivo se si dispone attualmente di una sessione attiva con tali siti. CORS stabilisce che se un server non risponde con il set corretto di intestazioni di risposta, il browser non consente a JavaScript di visualizzare (o accedere) la risposta.

Una richiesta CORS viene attivata quando JavaScript tenta una richiesta HTTP a un'altra:
  • dominio - ad esempio, site1.oraclecloud.com chiama oracle.com
  • sottodominio: ad esempio, site1.oraclecloud.com chiama site7.oraclecloud.com
  • porta, ad esempio site1.oraclecloud.com chiama site1.oraclecloud.com:3030
  • protocollo - ad esempio, https://site1.oraclecloud.com chiama http://site1.oraclecloud.com

Una richiesta CORS è disponibile in due forme: una richiesta CORS semplice o una richiesta CORS preflight.

Richiesta CORS semplice

Viene eseguita una richiesta CORS semplice se la richiesta JavaScript per una risorsa in un altro dominio presenta le seguenti caratteristiche:
  • Il metodo è uno dei seguenti:
    • GET
    • POST
    • HEAD
  • Le intestazioni HTTP consentite che possono essere aggiunte manualmente alla richiesta CORS semplice sono:
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type
    • DPR
    • Downlink
    • Save-Data
    • Viewport-Width
    • Width
  • Il valore Content-Type, se impostato, deve essere:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

Richiesta CORS preflight

Se la richiesta JavaScript non soddisfa le caratteristiche di una richiesta CORS semplice, viene inviata una richiesta CORS preflight alla risorsa situata nell'altro dominio.

La richiesta CORS di preflight verifica se la richiesta effettiva può essere inviata a tale risorsa includendo intestazioni HTTP specifiche nella richiesta contenente i dati che hanno determinato l'attivazione del flusso di richieste di preflight. In altre parole, se la richiesta HTTP JavaScript specifica alcuni metodi o intestazioni nella richiesta HTTP che richiede una richiesta CORS Preflight, la richiesta CORS Preflight esegue una query sulla risorsa per tali metodi o intestazioni per verificare se la risorsa accetta tale richiesta cross-domain.

Proprietà e attributi di configurazione CORS di Cloud Gate

Nella tabella riportata di seguito vengono descritte le proprietà e gli attributi di configurazione CORS di Cloud Gate.
Proprietà CORS Descrizione
cloudGateCorsEnabled

Proprietà booleana per attivare il supporto CORS Cloud Gate per la tenancy. Questa impostazione deve essere configurata su: true.

L'abilitazione del flag cloudGateCorsEnabled nel file cloudGateCorsSettings attiva la funzione nel tenant e nei domini di Identity applicherà la lista delle origini consentite definita nel file cloudGateCorsAllowedOrigins e una lista globale delle origini consentite.

L'impostazione predefinita è false.

Best practice. Configurare cloudGateCorsAllowedOrigins contemporaneamente. Se questa è una proprietà lasciata vuota, tutte le richieste CORS non riescono.

cloudGateCorsAllowedOrigins

La proprietà è un array di stringhe che contiene l'elenco delle origini CORS consentite.

L'impostazione predefinita è un array vuoto.

Ogni richiesta CORS specifica l'origine o l'origine nell'intestazione della richiesta di origine. Il valore dell'intestazione di origine corrisponde a questo elenco.

Se viene trovata una corrispondenza con l'origine, Cloud Gate aggiunge alla risposta le intestazioni CORS appropriate.

Se l'origine non corrisponde, Cloud Gate non restituisce alcuna intestazione di risposta CORS, causando il rifiuto della risposta da parte del browser.

Valori CORS consentiti nel modello di inserimento:
  • Ingresso: * | <PROTOCOL>"://"<HOST><PORT>
  • <PROTOCOL>: * | http | https
  • <HOST>: [<DOMAIN>.]<DOMAIN>
  • <DOMAIN>: < any alphanumerical character, * and - >
    • Un valore <DOMAIN> non può iniziare o terminare con un valore '-'.
    • Qualsiasi <DOMAIN> può essere un carattere jolly. Il carattere jolly deve includere l'intero dominio. Ad esempio, www.*.com è valido, ma www.*racle.com non lo è.
    • Usare https://tools.ietf.org/html/rfc1123 come riferimento
  • <PORT>: <EMPTY> | ":" <PORT_VALUE>
  • <PORT_VALUE>: * | <numerical characters>. <PORT_VALUE> deve essere compreso nell'intervallo 1 - 65535.
Esempi:
  • Abbina tutto: *
  • Corrispondenza esatta: https://www.acme.com, https://www.acme.com:4443
  • Host/protocollo esatto, qualsiasi porta: https://www.google.com:*
  • Host/porta esatti, qualsiasi protocollo (HTTP o HTTPS): *://www.acme.com, *://www.acme.com:8080
  • Sottodominio, protocollo esatto, nessuna porta: https://*.oraclecloud.com
  • Qualsiasi dominio, protocollo esatto, nessuna porta: https://*
cloudGateCorsAllowNullOrigin

Proprietà booleana per supportare gli scenari in cui il browser invia un'origine "nulla". Questa impostazione deve essere configurata su: true.

L'impostazione predefinita è false.

Viene inviata un'origine "nulla" se la richiesta CORS proviene da un file sul computer di un utente o se un server reindirizza a un altro server in risposta a una richiesta CORS. Il browser passa un'origine "nulla" quando considera l'origine "tainted". Per aumentare la sicurezza, per impostazione predefinita, non sono consentite origini "nulle".

Alcune origini "nulle" sono valide. Le applicazioni che utilizzano il login al flusso del browser OpenID Connect (OIDC) del dominio di Identity visualizzeranno origini "nulle" inviate ai rispettivi nodi Cloud Gate. Quando Cloud Gate effettua il reindirizzamento al dominio di Identity, autorizza l'endpoint ad avviare il login del browser OIDC e quando il dominio di Identity reindirizza la richiesta a Cloud Gate, l'origine sarà "nulla".

cloudGateCorsMaxAge

Numero intero che specifica il numero di secondi in cui il client (browser) può inserire nella cache una risposta CORS di preflight.

cloudGateCorsExposedHeaders

La proprietà è un array di stringhe che elenca le intestazioni di risposta che possono essere aggiunte all'intestazione di risposta Access-Control-Expose-Headers.

L'impostazione predefinita è un array vuoto.

Configurazione delle impostazioni CORS di Cloud Gate nei domini di Identity

Cloud Gate richiede di configurare le seguenti impostazioni nei domini di Identity per il supporto CORS (Cross-Origin Resource Sharing).

Prima di avviare la configurazione, assicurarsi di disporre della versione corretta di Cloud Gate. Le versioni precedenti del modulo Cloud Gate non fornivano supporto per CORS. È stato lasciato alle applicazioni protette per supportare CORS. Se l'impostazione isCorsAllowed nel documento Criterio livello Web è stata configurata su true, Cloud Gate consente l'esecuzione preliminare delle richieste CORS alle applicazioni protette.
Nota

La versione minima richiesta di Cloud Gate è la 21.1.2.

Utilizzare l'endpoint /admin/v1/Settings/Settings per configurare le impostazioni CORS. La richiesta è un'operazione patch. Per ulteriori informazioni, vedere Aggiorna un'impostazione.

  1. Utilizzare questo payload di esempio come modello per creare il corpo della richiesta. Salvare il payload in un file, ad esempio /tmp/cors-settings.json. Modificare il file con i dettagli di distribuzione.
    Payload di esempio.
       {
       "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
       "Operations": [{
        "op": "replace",
        "path": "cloudGateCorsSettings",
        "value": {
        "cloudGateCorsEnabled": true,
        "cloudGateCorsAllowNullOrigin": true,
        "cloudGateCorsAllowedOrigins": [ "https://app.my-server.com:8080", "https://*:*" ],
        "cloudGateCorsMaxAge: 60,
        "cloudGateCorsExposedHeaders": [ "x-custom-header", "x-my-app-header" ]
        }
        }]
       }
    Richiesta cURL di esempio.
       # $AT is a previously generated Admin Access Token.
       # https://<IdentityDomainID>.identity.oraclecloud.com is an example URL 
       $ curl -X PATCH -H "Content-Type: application/scim+json" -H "Accept: application/json" -H "Authorization: Bearer $AT" "https://<domainURL>/admin/v1/Settings/Settings" --data @"/tmp/cors-settings.json"
  2. Per abilitare il supporto CORS, procedere come segue.
    • Riavviare o ricaricare manualmente il server NGINX.
    • Attendere la scadenza della cache delle impostazioni CORS di Cloud Gate. Per impostazione predefinita, questa operazione può richiedere fino a un'ora.
  3. Di seguito sono riportate le intestazioni di risposta CORS restituite da Cloud Gate a seconda della richiesta CORS.
    • Access-Control-Allow-Origin
    • Access-Control-Allow-Methods
    • Access-Control-Allow-Headers
    • Access-Control-Allow-Credentials
    • Access-Control-Max-Age
    • Access-Control-Expose-Headers

Flussi di lavoro delle richieste CORS semplici e preflight

Panoramica dei flussi di lavoro delle richieste CORS (Cross-Origin Resource Sharing).

Flusso di lavoro richiesta CORS semplice

  1. La richiesta viene identificata come richiesta CORS dalla presenza dell'intestazione della richiesta di origine.
  2. Se necessario, ad esempio la scadenza della cache, le impostazioni CORS di Cloud Gate vengono scaricate dai domini di Identity in IAM.
  3. Cloud Gate elabora la richiesta, rifiutando la richiesta o consentendo l'accesso al server applicazioni a monte.
  4. Prima che venga restituita una risposta, Cloud Gate applica CORS come definito dalle impostazioni CORS di Cloud Gate.
    1. Cloud Gate garantisce sempre che l'intestazione della risposta varia faccia parte della risposta e contenga l'intestazione "Origine". Ciò si verifica anche per le richieste non CORS.
    2. Se cloudGateCorsEnabled è false, l'elaborazione viene interrotta qui. La Risposta viene restituita così com'è.
    3. Cloud Gate verifica che l'origine sia consentita utilizzando la lista configurata di origini consentite.

      Se l'origine non è consentita, tutte le intestazioni di risposta CORS supportate vengono eliminate dalla risposta e l'elaborazione termina.

    4. L'intestazione della risposta Access-Control-Allow-Origin viene aggiunta e configurata in base al valore dell'intestazione della richiesta di origine.
    5. L'intestazione della risposta Access-Control-Allow-Credentials viene aggiunta e configurata in true.
    6. Access-Control-Expose-Headers è configurato per l'intersezione tra il valore cloudGateCorsExposedHeaders e l'elenco delle intestazioni restituite nella risposta.
    7. Access-Control-Allow-Methods, Access-Control-Allow-Headers e Access-Control-Max-Age Response Headers vengono rimossi dalla risposta.
  5. Cloud Gate restituisce la sua risposta.
Nota

Cloud Gate sovrascrive le intestazioni Access-Control-Allow-Origin e Access-Control-Allow-Credentials Response se impostate dal server applicazioni a monte.

Flusso di lavoro richiesta CORS preflight

  1. La richiesta viene identificata come richiesta CORS dalla presenza dell'intestazione della richiesta di origine.
  2. Se necessario, ad esempio la scadenza della cache, le impostazioni CORS di Cloud Gate vengono scaricate dai domini di Identity in IAM.
  3. La richiesta viene identificata come richiesta CORS Preflight mediante il metodo OPTIONS e l'intestazione della richiesta Access-Control-Request-Method, oltre all'intestazione della richiesta di origine.
  4. Se cloudGateCorsEnabled è true, la richiesta può passare al server applicazioni a monte per consentire alle applicazioni di implementare CORS.

    Se cloudGateCorsEnabled è false, l'impostazione precedente del criterio livello Web isCorsAllowed viene ancora rispettata, poco dopo nell'elaborazione della richiesta.

  5. Prima che la risposta venga restituita da Cloud Gate, CORS viene applicato come definito dalle impostazioni CORS di Cloud Gate.
    1. Cloud Gate garantisce sempre che l'intestazione della risposta varia faccia parte della risposta e contenga l'intestazione "Origine". Ciò avviene anche per le richieste nonCORS.
    2. Se cloudGateCorsEnabled è false, l'elaborazione viene interrotta qui. La Risposta viene restituita così com'è.
    3. Cloud Gate verifica che l'origine sia consentita utilizzando la lista configurata di origini consentite.

      Se l'origine non è consentita, tutte le intestazioni di risposta CORS supportate vengono eliminate dalla risposta e l'elaborazione termina.

    4. L'intestazione della risposta Access-Control-Allow-Origin viene aggiunta e configurata in base al valore dell'intestazione della richiesta di origine.
    5. L'intestazione della risposta Access-Control-Allow-Credentials viene aggiunta e configurata in true.
    6. Se l'Application Server a monte non ha aggiunto l'intestazione della risposta Access-Control-Allow-Methods, Cloud Gate ne costruisce il valore come indicato di seguito.
      • Se l'intestazione Consenti risposta è inclusa nella risposta, Cloud Gate ne utilizza il valore.
      • Se l'intestazione della richiesta Access-Control-Request-Method viene trovata nella richiesta, Cloud Gate ne utilizza il valore.
    7. Se l'Application Server a monte non ha aggiunto l'intestazione della risposta Access-Control-Allow-Headers, Cloud Gate utilizza il valore dell'intestazione della richiesta Access-Control-Request-Headers nella richiesta, se presente.
    8. Se cloudGateCorsMaxAge è configurato su un valore maggiore di zero, l'intestazione della risposta Access-Control-Max-Age viene aggiunta e configurata sul valore dell'età massima. Se il valore cloudGateCorsMaxAge è minore o uguale a zero, non viene eseguita alcuna azione per l'intestazione della risposta Access-Control-Max-Age.
    9. L'intestazione della risposta Access-Control-Expose-Headers è stata rimossa. Non si applica alle risposte pre-volo.
  6. Cloud Gate restituisce la sua risposta.