Utiliser CORS

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

CORS aide à empêcher JavaScript (planté sur 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 pourraient retirer de l'argent de votre banque ou effectuer des achats à votre nom sur un site d'achat en ligne. Ces demandes peuvent aboutir si vous avez actuellement une session active avec ces sites. CORS stipule que si un serveur ne répond pas avec le bon jeu 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 autre demande HTTP :
  • domain - par exemple, site1.oraclecloud.com appelle oracle.com
  • subdomain - 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 CORS simple

Une demande CORS simple est exécutée si la demande JavaScript sur 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é-voler 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é des méthodes/en-têtes dans la demande HTTP qui nécessitaient une demande CORS de pré-vérification, la demande CORS de pré-vérification interroge la ressource pour ces méthodes/en-têtes afin de voir si la ressource accepte une telle demande interdomaine.

Propriétés et attributs de configuration CORS Cloud Gate

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

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

L'activation de l'indicateur cloudGateCorsEnabled dans cloudGateCorsSettings active la fonctionnalité sur le locataire et les domaines d'identité appliquent la liste des origines autorisées définie dans cloudGateCorsAllowedOrigins et une liste globale des origines autorisées.

La valeur par défaut est false.

Meilleures pratiques 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.

Par défaut, ce champ est vide.

Chaque demande CORS indique 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 ne correspond pas, Cloud Gate ne renvoie 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 de saisie :
  • 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 -.
    • N'importe quelle 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 correspond : *
  • 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, protocole quelconque (HTTP ou HTTPS) : *://www.acme.com, *://www.acme.com:8080
  • Sous-domaine, protocole exact, pas de port : https://*.oraclecloud.com
  • Tout domaine, protocole exact, pas de port : https://*
cloudGateCorsAllowNullOrigin

Propriété booléenne permettant de prendre en charge les scénarios dans lesquels le navigateur envoie une origine "null". Ce paramètre doit être configuré sur : true.

La valeur par défaut est false.

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

Certaines origines "null" sont valides. Les applications qui tirent parti de la connexion au flux de navigateur OpenID Connect (OIDC) du domaine d'identité verront les origines "NULL" envoyées à leurs noeuds Cloud Gate. Lorsque Cloud Gate est redirigé vers l'adresse d'autorisation du domaine d'identité pour démarrer la connexion du navigateur OIDC et que le domaine d'identité redirige la demande vers Cloud Gate, l'origine est NULL.

cloudGateCorsMaxAge

Nombre entier qui spécifie le nombre de secondes pendant lesquelles le client (navigateur) peut mettre en cache une réponse CORS de pré-vérification.

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.

Par défaut, ce champ est vide.

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

Cloud Gate exige que vous configuriez les paramètres suivants dans les domaines d'identité pour la prise en charge de CORS (Cross-Origin Resource Sharing).

Avant de commencer la configuration, assurez-vous que vous disposez de la version correcte 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 CORS. Si le paramètre isCorsAllowed du document de stratégie de niveau Web était configuré sur true, Cloud Gate autoriserait le pré-vol des demandes CORS vers les applications protégées.
Remarque

La version minimale de Cloud Gate requise est la version 21.1.2.

Utilisez l'adresse /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 charge utile comme modèle pour créer le corps de la demande. Enregistrez la charge utile dans un fichier, par exemple, /tmp/cors-settings.json. Modifiez le fichier avec les détails de déploiement.
    Exemple de charge utile.
       {
       "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 CORS.
    • Redémarrez ou rechargez manuellement le serveur NGINX.
    • Attendez que le cache des paramètres CORS de Cloud Gate expire. Cette opération peut prendre jusqu'à une heure par défaut.
  3. Voici les en-têtes de réponse CORS renvoyé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

Workflows de demande CORS simples et de pré-vérification

Présentation des workflows de demande CORS (Cross-Origin Resource Sharing).

Workflow de demande CORS simple

  1. La requête est identifiée en tant que requête CORS par la présence de l'en-tête de requête d'origine.
  2. Si nécessaire (par exemple, expiration du cache), les paramètres CORS Cloud Gate sont téléchargés à partir des domaines d'identité dans IAM.
  3. Cloud Gate traite la demande, soit en la rejetant, soit en l'autorisant jusqu'au serveur d'applications en amont.
  4. Avant qu'une réponse ne soit renvoyée, Cloud Gate applique CORS comme défini par les paramètres CORS de Cloud Gate.
    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 "Origine". Cela se produit même pour les demandes non-CORS.
    2. Si cloudGateCorsEnabled est 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 des 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 se termine.

    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é dans true.
    6. La valeur Access-Control-Expose-Headers est configurée à l'intersection entre la valeur cloudGateCorsExposedHeaders et la liste des en-têtes renvoyés dans la réponse.
    7. Les éléments Access-Control-Allow-Methods, Access-Control-Allow-Headers et Access-Control-Max-Age Response Headers sont supprimés de la réponse.
  5. Cloud Gate renvoie sa réponse.
Remarque

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

Pré-voler le workflow de demande CORS

  1. La requête est identifiée en tant que requête CORS par la présence de l'en-tête de requête d'origine.
  2. Si nécessaire (par exemple, expiration du cache), les paramètres CORS 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 au serveur d'applications en amont pour permettre aux applications d'implémenter CORS.

    Si cloudGateCorsEnabled est défini sur false, l'ancien paramètre de stratégie de niveau Web isCorsAllowed est toujours respecté, tout juste après le traitement de la demande.

  5. Avant que la réponse ne soit renvoyée à partir de Cloud Gate, CORS est appliqué tel que défini par les paramètres CORS de Cloud Gate.
    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 "Origine". Cela se produit même pour les demandes nonCORS.
    2. Si cloudGateCorsEnabled est 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 des 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 se termine.

    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é dans 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 est trouvé 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 la valeur cloudGateCorsMaxAge est configurée sur une valeur supérieure à zéro, l'en-tête de réponse Access-Control-Max-Age est ajouté et configuré sur la valeur d'ancienneté maximale. Si la valeur cloudGateCorsMaxAge est inférieure ou égale à 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 enlevé. Elle ne s'applique pas aux réponses de pré-vol.
  6. Cloud Gate renvoie sa réponse.