Utilizzo di CORS

CORS (Cross-Origin Resource Sharing) è un protocollo basato su 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 nei domini di Identity Gateway applicazioni o IAM.

CORS aiuta a evitare che il rogue JavaScript (piantato 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 in 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 semplice richiesta CORS o una richiesta CORS Preflight.

Richiesta CORS semplice

Una semplice richiesta CORS viene eseguita se la richiesta JavaScript a fronte di una risorsa in un altro dominio presenta le seguenti caratteristiche:
  • Il metodo è uno dei seguenti:
    • GET
    • POST
    • HEAD
  • Le intestazioni HTTP consentite che è possibile aggiungere 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 preliminare

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

La richiesta CORS 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 Preflight. In altre parole, se la richiesta HTTP JavaScript ha specificato alcuni metodi o intestazioni nella richiesta HTTP che richiedevano 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 tra domini.

Proprietà e attributi di configurazione CORS 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 in: true.

L'abilitazione del flag cloudGateCorsEnabled in cloudGateCorsSettings attiva la funzione nel tenant in uso e i domini di Identity applicheranno la lista delle origini consentite definita in 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 la lista 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 l'origine viene abbinata, Cloud Gate aggiunge le intestazioni CORS appropriate alla risposta.

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:
  • Voce: * | <PROTOCOL>"://"<HOST><PORT>
  • <PROTOCOL>: * | http | https
  • <HOST>: [<DOMAIN>.]<DOMAIN>
  • <DOMAIN>: < any alphanumerical character, * and - >
    • Un <DOMAIN> non può iniziare o terminare con un '-'.
    • Qualsiasi carattere <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 è.
    • Utilizzare 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 che supporta gli scenari in cui il browser invia un'origine "null". Questa impostazione deve essere configurata in: true.

L'impostazione predefinita è false.

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

Alcune origini "nulle" sono valide. Le applicazioni che utilizzano il login al flusso del browser OpenID Connect (OIDC) del dominio di Identity vedranno le origini "nulle" inviate ai rispettivi nodi Cloud Gate. Quando Cloud Gate si reindirizza all'endpoint di autorizzazione del dominio di Identity per avviare il login al browser OIDC e quando il dominio di Identity reindirizza la richiesta a Cloud Gate, l'origine sarà "null".

cloudGateCorsMaxAge

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

cloudGateCorsExposedHeaders

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

L'impostazione predefinita è un array vuoto.

Configurazione delle impostazioni CORS Cloud Gate nei domini di Identity

Cloud Gate richiede la configurazione delle impostazioni seguenti 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 hanno fornito 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 consentirebbe la verifica 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 Aggiornare 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, eseguire una delle operazioni riportate di seguito.
    • Riavviare o ricaricare manualmente il server NGINX.
    • Attendere la scadenza della cache delle impostazioni CORS di Cloud Gate. L'operazione può richiedere fino a un'ora, per impostazione predefinita.
  3. Di seguito sono riportate le intestazioni di risposta CORS restituite da Cloud Gate in base alla 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 di richiesta CORS semplici e in esecuzione anticipata

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

Flusso di lavoro semplice richiesta CORS

  1. La richiesta viene identificata come richiesta CORS dalla presenza dell'intestazione della richiesta di origine.
  2. Se necessario (ad esempio, scadenza della cache), le impostazioni CORS di Cloud Gate vengono scaricate dai domini di Identity in IAM.
  3. Cloud Gate elabora la richiesta, rifiutandola o consentendola al server applicazioni a monte.
  4. Prima che una risposta venga restituita, Cloud Gate applica CORS secondo quanto definito dalle impostazioni CORS di Cloud Gate.
    1. Cloud Gate verifica sempre che l'intestazione Vary Response 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 al valore dell'intestazione della richiesta di origine.
    5. L'intestazione di risposta Access-Control-Allow-Credentials viene aggiunta e configurata in true.
    6. Il valore Access-Control-Expose-Headers è configurato per l'intersezione tra il valore cloudGateCorsExposedHeaders e la lista di intestazioni restituite nella risposta.
    7. I valori Access-Control-Allow-Methods, Access-Control-Allow-Headers e Access-Control-Max-Age Response Headers vengono rimossi dalla risposta.
  5. Cloud Gate restituisce la risposta.
Nota

Cloud Gate sovrascrive le intestazioni Access-Control-Allow-Origin e Access-Control-Allow-Credentials Response se impostato dall'Application Server a monte.

Flusso di lavoro richiesta CORS preliminare

  1. La richiesta viene identificata come richiesta CORS dalla presenza dell'intestazione della richiesta di origine.
  2. Se necessario (ad esempio, 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 preliminare dal metodo OPTIONS e dall'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, la vecchia impostazione dei criteri livello Web isCorsAllowed viene ancora rispettata, subito dopo nell'elaborazione della richiesta.

  5. Prima che la risposta venga restituita da Cloud Gate, CORS viene applicato in base alle impostazioni CORS di Cloud Gate.
    1. Cloud Gate verifica sempre che l'intestazione Vary Response faccia parte della risposta e contenga l'intestazione "Origine". Ciò si verifica 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 al valore dell'intestazione della richiesta di origine.
    5. L'intestazione di risposta Access-Control-Allow-Credentials viene aggiunta e configurata in true.
    6. Se l'Application Server a monte non ha aggiunto l'intestazione di risposta Access-Control-Allow-Methods, Cloud Gate costruisce il valore nel modo seguente:
      • Se l'intestazione Consenti risposta è inclusa nella risposta, Cloud Gate utilizza il relativo valore.
      • Se l'intestazione della richiesta Access-Control-Request-Method viene trovata nella richiesta, Cloud Gate utilizza il relativo valore.
    7. Se l'Application Server a monte non ha aggiunto l'intestazione di risposta Access-Control-Allow-Headers, Cloud Gate utilizza il valore dell'intestazione di richiesta Access-Control-Request-Headers nella richiesta, se presente.
    8. Se cloudGateCorsMaxAge è configurato su un valore maggiore di zero, l'intestazione di risposta Access-Control-Max-Age viene aggiunta e configurata per il valore di durata massimo. Se il valore cloudGateCorsMaxAge è uguale o inferiore a zero, non viene eseguita alcuna azione per l'intestazione di risposta Access-Control-Max-Age.
    9. L'intestazione di risposta Access-Control-Expose-Headers viene rimossa. Non si applica alle risposte pre-volo.
  6. Cloud Gate restituisce la risposta.