Utilisation de CORS

Cross-Origin Resource Sharing (CORS) est un protocole basé sur un en-tête qui permet à JavaScript de faire des demandes en votre nom pour accéder aux ressources d'un autre domaine. Configurez Cloud Gate de sorte qu'il active la spécification CORS et applique les paramètres CORS pour Cloud Gate s'exécutant dans les domaines d'identité de la passerelle d'application ou IAM.

CORS permet d'empêcher les personnes malveillantes JavaScript (planté dans un site par des attaquants, par exemple, en utilisant des publicités) de faire des demandes AJAX en votre nom. Les demandes frauduleuses d'AJAX peuvent retirer de l'argent de votre banque ou faire des achats en votre nom sur un site d'achat en ligne. Ces demandes pourraient réussir si vous avez actuellement une session active avec ces sites. CORS stipule que si un serveur ne répond pas avec le jeu correct d'en-têtes de réponse, le navigateur ne permet pas à JavaScript de voir (ou d'accéder) la réponse.

Une demande CORS est déclenchée lorsque JavaScript tente une demande HTTP vers une autre :
  • domaine - par exemple, site1.oraclecloud.com appelle oracle.com
  • sous-domaine - par exemple, site1.oraclecloud.com appelle site7.oraclecloud.com
  • port - par exemple, site1.oraclecloud.com appelle site1.oraclecloud.com:3030
  • protocole - par exemple, https://site1.oraclecloud.com appelle http://site1.oraclecloud.com

Une demande CORS se présente sous deux formes : une demande CORS simple ou une demande CORS de pré-vol.

Demande simple CORS

Une demande CORS simple est effectuée si la demande JavaScript pour une ressource d'un autre domaine présente les caractéristiques suivantes :
  • La méthode est l'une des suivantes :
    • GET
    • POST
    • HEAD
  • Les en-têtes HTTP autorisés qui peuvent être ajoutés manuellement à la demande CORS simple sont les suivants :
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type
    • DPR
    • Downlink
    • Save-Data
    • Viewport-Width
    • Width
  • La valeur Content-Type, si elle est définie, doit être :
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

Prévol de la demande CORS

Si la demande JavaScript ne répond pas aux caractéristiques d'une demande CORS simple, une demande CORS de pré-vol est envoyée à la ressource située dans l'autre domaine.

La demande CORS de pré-vol teste si la demande réelle peut être envoyée à cette ressource en incluant des en-têtes HTTP spécifiques dans la demande contenant les données qui ont entraîné le déclenchement du flux de demande de pré-vol. En d'autres termes, si la demande HTTP JavaScript a spécifié une méthode ou des en-têtes dans la demande HTTP qui nécessitaient une demande CORS de contrôle d'intégrité, la demande CORS de contrôle d'intégrité interroge la ressource pour cette méthode ou ces en-têtes afin de voir si la ressource accepte une telle demande interdomaine.

Propriétés et attributs de configuration de la spécification CORS Cloud Gate

Le tableau suivant décrit les propriétés et les attributs de configuration de la spécification CORS Cloud Gate.
Propriété CORS Description
cloudGateCorsEnabled

Propriété booléenne permettant d'activer la prise en charge de Cloud Gate CORS pour la location. Ce paramètre doit être configuré à : true.

L'activation de l'indicateur cloudGateCorsEnabled dans cloudGateCorsSettings active la fonction sur votre locataire et les domaines d'identité appliquera la liste des origines autorisées définies dans cloudGateCorsAllowedOrigins et une liste globale des origines autorisées.

La valeur par défaut est false.

Meilleure pratique. Configurez cloudGateCorsAllowedOrigins en même temps. Si cette propriété est laissée vide, toutes les demandes CORS échouent.

cloudGateCorsAllowedOrigins

La propriété est un tableau de chaînes qui contient la liste des origines CORS autorisées.

La valeur par défaut est un tableau vide.

Chaque demande CORS spécifie sa source ou son origine dans l'en-tête de demande d'origine. La valeur de l'en-tête d'origine correspond à cette liste.

Si l'origine est mise en correspondance, Cloud Gate ajoute les en-têtes CORS appropriés à sa réponse.

Si l'origine n'est pas mise en correspondance, Cloud Gate ne retourne aucun en-tête de réponse CORS, ce qui entraîne le rejet de la réponse par le navigateur.

Valeurs CORS autorisées dans le modèle d'entrée :
  • Entrée : * | <PROTOCOL>"://"<HOST><PORT>
  • <PROTOCOL>: * | http | https
  • <HOST>: [<DOMAIN>.]<DOMAIN>
  • <DOMAIN>: < any alphanumerical character, * and - >
    • Une valeur <DOMAIN> ne peut pas commencer ou se terminer par une valeur '-'.
    • Toute valeur <DOMAIN> peut être un caractère générique. Le caractère générique doit inclure l'ensemble du domaine. Par exemple, www.*.com est valide, mais www.*racle.com ne l'est pas.
    • Utiliser https://tools.ietf.org/html/rfc1123 comme référence
  • <PORT>: <EMPTY> | ":" <PORT_VALUE>
  • <PORT_VALUE> : * | <numerical characters>. <PORT_VALUE> doit être compris entre 1 et 65535.
Exemples :
  • Tout mettre en correspondance : *
  • Correspondance exacte : https://www.acme.com, https://www.acme.com:4443
  • Hôte/protocole exact, tout port : https://www.google.com:*
  • Hôte/port exact, tout protocole (HTTP ou HTTPS) : *://www.acme.com, *://www.acme.com:8080
  • Sous-domaine, protocole exact, aucun port : https://*.oraclecloud.com
  • Tout domaine, protocole exact, aucun port : https://*
cloudGateCorsAllowNullOrigin

Propriété booléenne pour la prise en charge des scénarios où le navigateur envoie une origine "nulle". Ce paramètre doit être configuré à : true.

La valeur par défaut est false.

Une origine "nulle" est envoyée si la demande CORS provient d'un fichier sur l'ordinateur d'un utilisateur ou si un serveur redirige vers un autre serveur en réponse à une demande CORS. Le navigateur transmet une origine "nulle" lorsqu'il considère l'origine "tachée". Pour augmenter la sécurité, par défaut, les origines "nulles" ne sont pas autorisées.

Certaines origines "nulles" sont valides. Les applications qui tirent parti du domaine d'identité OpenID Connect (OIDC) Browser Flow Login verront les origines "nulles" envoyées à leur(s) noeud(s) Cloud Gate. Lorsque Cloud Gate redirige vers le domaine d'identité, autorisez le point d'extrémité à démarrer la connexion au navigateur OIDC et lorsque le domaine d'identité redirige la demande vers Cloud Gate, l'origine sera "nulle".

cloudGateCorsMaxAge

Nombre entier qui spécifie le nombre de secondes pendant lesquelles le client (navigateur) peut mettre en mémoire cache une réponse CORS en mode Preflight.

cloudGateCorsExposedHeaders

La propriété est un tableau de chaînes qui répertorie les en-têtes de réponse qui peuvent être ajoutés à l'en-tête de réponse Access-Control-Expose-Headers.

La valeur par défaut est un tableau vide.

Configuration des paramètres CORS de Cloud Gate dans les domaines d'identité

Cloud Gate nécessite que vous configuriez les paramètres suivants dans les domaines d'identité pour la prise en charge du partage des ressources d'origine croisée (CORS).

Avant de commencer la configuration, assurez-vous d'avoir la bonne version de Cloud Gate. Les versions antérieures du module Cloud Gate ne prenaient pas en charge CORS. Il a été laissé aux applications protégées pour prendre en charge la spécification CORS. Si le paramètre isCorsAllowed dans le document de politique de niveau Web était configuré à true, Cloud Gate autoriserait les demandes CORS avant le vol vers les applications protégées.
Note

La version minimale requise de Cloud Gate est 21.1.2.

Utilisez le point d'extrémité /admin/v1/Settings/Settings pour configurer les paramètres CORS. La demande est une opération patch. Pour plus d'informations, voir Mettre à jour un paramètre.

  1. Utilisez cet exemple de données utiles comme modèle pour créer le corps de la demande. Enregistrez les données utiles dans un fichier, par exemple /tmp/cors-settings.json. Modifiez le fichier avec les détails du déploiement.
    Exemple de données utiles.
       {
       "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" ]
        }
        }]
       }
    Exemple de demande cURL.
       # $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. Effectuez l'une des opérations suivantes pour activer la prise en charge de la spécification CORS.
    • Redémarrez ou rechargez manuellement le serveur NGINX.
    • Attendez que la mémoire cache des paramètres CORS de Cloud Gate expire. Cela peut prendre jusqu'à une heure, par défaut.
  3. Voici les en-têtes de réponse CORS retournés par Cloud Gate en fonction de la demande 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

Flux de travail de demande CORS simple et pré-vol

Aperçu des flux de travail de demande de partage de ressources d'origine croisée (CORS).

Flux de travail de demande CORS simple

  1. La demande est identifiée en tant que demande CORS par la présence de l'en-tête de demande d'origine.
  2. Si nécessaire (par exemple, expiration de la mémoire cache), les paramètres CORS de Cloud Gate sont téléchargés à partir des domaines d'identité dans IAM.
  3. Cloud Gate traite la demande - soit en rejetant la demande, soit en la laissant passer au serveur d'applications en amont.
  4. Avant qu'une réponse ne soit retournée, Cloud Gate applique la spécification CORS telle que définie par les paramètres Cloud Gate CORS.
    1. Cloud Gate s'assure toujours que l'en-tête de réponse variable fait partie de la réponse - et contient l'en-tête "Origine". Cela se produit même pour les demandes non CORS.
    2. Si cloudGateCorsEnabled a la valeur false, le traitement s'arrête ici. La réponse est renvoyée telle quelle.
    3. Cloud Gate vérifie que l'origine est autorisée - à l'aide de la liste configurée d'origines autorisées.

      Si l'origine n'est pas autorisée, tous les en-têtes de réponse CORS pris en charge sont supprimés de la réponse et le traitement prend fin.

    4. L'en-tête de réponse Access-Control-Allow-Origin est ajouté et configuré à la valeur de l'en-tête de demande d'origine.
    5. L'en-tête de réponse Access-Control-Allow-Credentials est ajouté et configuré à true.
    6. Access-Control-Expose-Headers est configuré à l'intersection entre la valeur cloudGateCorsExposedHeaders et la liste des en-têtes retournés dans la réponse.
    7. Les valeurs Access-Control-Allow-Methods, Access-Control-Allow-Headers et Access-Control-Max-Age Response Headers sont supprimées de la réponse.
  5. Cloud Gate retourne sa réponse.
Note

Cloud Gate remplace les en-têtes Access-Control-Allow-Origin et Access-Control-Allow-Credentials Response s'il est défini par le serveur d'applications en amont.

Flux de travail de demande CORS de pré-vol

  1. La demande est identifiée en tant que demande CORS par la présence de l'en-tête de demande d'origine.
  2. Si nécessaire (par exemple, expiration de la mémoire cache), les paramètres CORS de Cloud Gate sont téléchargés à partir des domaines d'identité dans IAM.
  3. La demande est identifiée en tant que demande CORS de pré-vol par la méthode OPTIONS et l'en-tête de demande Access-Control-Request-Method, en plus de l'en-tête de demande d'origine.
  4. Si cloudGateCorsEnabled a la valeur true, la demande est autorisée à passer par le serveur d'applications en amont - pour permettre aux applications de mettre en oeuvre CORS.

    Si cloudGateCorsEnabled a la valeur false, l'ancien paramètre de politique de niveau Web isCorsAllowed est toujours respecté, juste plus tard dans le traitement de la demande.

  5. Avant que la réponse ne soit retournée par Cloud Gate, la spécification CORS est appliquée conformément aux paramètres Cloud Gate CORS.
    1. Cloud Gate garantit toujours que l'en-tête de réponse variable fait partie de la réponse et contient l'en-tête d'origine. Cela se produit même pour les demandes nonCORS.
    2. Si cloudGateCorsEnabled a la valeur false, le traitement s'arrête ici. La réponse est renvoyée telle quelle.
    3. Cloud Gate vérifie que l'origine est autorisée - à l'aide de la liste configurée d'origines autorisées.

      Si l'origine n'est pas autorisée, tous les en-têtes de réponse CORS pris en charge sont supprimés de la réponse et le traitement prend fin.

    4. L'en-tête de réponse Access-Control-Allow-Origin est ajouté et configuré à la valeur de l'en-tête de demande d'origine.
    5. L'en-tête de réponse Access-Control-Allow-Credentials est ajouté et configuré à true.
    6. Si le serveur d'applications en amont n'a pas ajouté l'en-tête de réponse Access-Control-Allow-Methods, Cloud Gate construit sa valeur comme suit :
      • Si l'en-tête Autoriser la réponse est inclus dans la réponse, Cloud Gate utilise sa valeur.
      • Si l'en-tête de demande Access-Control-Request-Method se trouve dans la demande, Cloud Gate utilise sa valeur.
    7. Si le serveur d'applications en amont n'a pas ajouté l'en-tête de réponse Access-Control-Allow-Headers, Cloud Gate utilise la valeur de l'en-tête de demande Access-Control-Request-Headers dans la demande si elle est présente.
    8. Si cloudGateCorsMaxAge est configuré à une valeur supérieure à zéro, l'en-tête de réponse Access-Control-Max-Age est ajouté et configuré à la valeur d'ancienneté maximale. Si la valeur cloudGateCorsMaxAge est égale ou inférieure à zéro, aucune action n'est entreprise pour l'en-tête de réponse Access-Control-Max-Age.
    9. L'en-tête de réponse Access-Control-Expose-Headers est supprimé. Il ne s'applique pas aux réponses de pré-vol.
  6. Cloud Gate retourne sa réponse.