Ajout de la prise en charge de la spécification CORS aux déploiements d'API

Découvrez comment utiliser une politique de demande pour ajouter la prise en charge de la spécification CORS aux déploiements d'API avec la passerelle d'API.

Les navigateurs Web mettent généralement en oeuvre une "politique d'origine identique" pour éviter que le code effectue des demandes par rapport à une origine différente de celle à partir de laquelle le code a été servi. La politique d'origine identique est destinée à fournir une protection contre les sites Web malveillants. Cependant, elle peut également empêcher des interactions légitimes entre un serveur et des clients d'une origine connue et approuvée.

La spécification CORS (Cross-Origin Resource Sharing) est une norme de partage d'origine croisée visant à assouplir la politique d'origine identique en autorisant le code d'une page Web à utiliser une API REST servie à partir d'une origine différente. La norme CORS utilise des en-têtes de demande HTTP et des en-têtes de réponse supplémentaires pour spécifier les origines auxquelles vous pouvez accéder.

La norme CORS nécessite également que certaines méthodes de demande HTTP envoient des demandes "préliminaires". Avant d'envoyer la demande réelle, le navigateur Web envoie une demande préliminaire au serveur pour déterminer si les méthodes de la demande réelle sont prises en charge. Le serveur répond avec les méthodes qu'il autorise dans une demande réelle. Le navigateur Web envoie uniquement la demande réelle si la réponse du serveur indique que les méthodes de la demande réelle sont autorisées. La norme CORS permet également aux serveurs d'aviser les clients si les demandes peuvent inclure des données d'identification (témoins, en-têtes d'autorisation ou certificats de client TLS).

Pour plus d'informations sur la spécification CORS, voir les ressources disponibles en ligne, notamment celles de W3C et Mozilla.

Le service Passerelle d'API permet la prise en charge de la spécification CORS dans les API que vous déployez sur les passerelles d'API. Lorsque vous activez la prise en charge de la spécification CORS dans un déploiement d'API, les demandes préliminaires HTTP et les demandes réelles au déploiement d'API retournent au moins un en-tête de réponse CORS au client d'API. Vous définissez les valeurs d'en-tête de réponse CORS dans la spécification de déploiement d'API.

Vous utilisez des politiques de demande pour ajouter la prise en charge de la spécification CORS aux API (voir Ajout de politiques de demande et de réponse aux spécifications de déploiement d'API). Vous pouvez appliquer une politique de demande CORS à toutes les routes d'une spécification de déploiement d'API ou uniquement à des routes particulières.

Vous pouvez ajouter une politique de demande CORS à une spécification de déploiement d'API comme suit :

  • En utilisant la console.
  • En modifiant un fichier JSON.

Utilisation de la console pour ajouter des politiques de demande CORS

Pour ajouter une politique de demande CORS à une spécification de déploiement d'API à l'aide de la console :

  1. Créez ou mettez à jour un déploiement d'API à l'aide de la console, sélectionnez l'option À partir de zéro et entrez les détails dans la page Informations de base.

    Pour plus d'informations, voir Déploiement d'une API sur une passerelle d'API en créant un déploiement d'API et Mise à jour d'une passerelle d'API.

  2. Dans la section Politiques de demande d'API de la page informations de base, sélectionnez le bouton Ajouter à côté du champ CORS et spécifiez les données suivantes :

    • Origines autorisées : Origine autorisée à accéder au déploiement d'API. Par exemple, https://oracle.com. Sélectionnez + Autre origine pour entrer une deuxième origine et les origines suivantes.
    • Méthodes autorisées : Une ou plusieurs méthodes autorisées dans la demande réelle au déploiement d'API. Par exemple, GET, PUT.
    • En-têtes autorisés : Facultativement, un en-tête HTTP autorisé dans la demande réelle au déploiement d'API. Par exemple, opc-request-id ou If-Match. Sélectionnez + Autre en-tête pour entrer un deuxième en-tête et les en-têtes suivants.
    • En-têtes exposés : Facultativement, un en-tête HTTP auquel les clients d'API peuvent accéder dans la réponse du déploiement d'API à une demande réelle. Par exemple, ETag ou opc-request-id. Sélectionnez + Autre en-tête pour entrer un deuxième en-tête et les en-têtes suivants.
    • Ancienneté maximum en secondes : Facultativement, un nombre entier indiquant pendant combien de temps (en secondes delta) les résultats d'une demande préliminaire peuvent être mis en mémoire cache par un navigateur. Si vous ne spécifiez pas de valeur, la valeur par défaut est 0.
    • Activer l'option d'autorisation des données d'identification : Indique si la demande réelle au déploiement d'API peut être effectuée à l'aide de données d'identification (témoins, en-têtes d'autorisation ou certificats de client TLS). Par défaut, cette option n'est pas sélectionnée.

    Pour découvrir comment les différents champs de la politique de demande CORS sont mappés dans les différents en-têtes de réponse CORS, voir Mappage d'une politique de demande CORS à une réponse CORS.

  3. Sélectionnez Appliquer les modifications.

  4. Sélectionnez Suivant pour spécifier les options d'authentification dans la page Authentification.

    Pour plus d'informations sur les options d'authentification, voir Ajout de l'authentification et de l'autorisation aux déploiements d'API.

  5. Sélectionnez Suivant pour entrer les détails des routes individuelles du déploiement d'API dans la page Routes. Pour spécifier les politiques de demande CORS qui s'appliquent à une route individuelle, sélectionnez Afficher les politiques de demande de route, sélectionnez le bouton Ajouter à côté de CORS, puis spécifiez les données suivantes :

    • Origines autorisées : Origine autorisée à accéder à la route. Par exemple, https://oracle.com. Sélectionnez + Autre origine pour entrer une deuxième origine et les origines suivantes.
    • Méthodes autorisées : Une ou plusieurs méthodes autorisées dans la demande réelle à la route. Par exemple, GET, PUT.
    • En-têtes autorisés : Facultativement, un en-tête HTTP autorisé dans la demande réelle à la route. Par exemple, opc-request-id ou If-Match. Sélectionnez + Autre en-tête pour entrer un deuxième en-tête et les en-têtes suivants.
    • En-têtes exposés : Facultativement, un en-tête HTTP auquel les clients d'API peuvent accéder dans la réponse du déploiement d'API à une demande réelle. Par exemple, ETag ou opc-request-id. Sélectionnez + Autre en-tête pour entrer un deuxième en-tête et les en-têtes suivants.
    • Ancienneté maximum en secondes : Facultativement, un nombre entier indiquant pendant combien de temps (en secondes delta) les résultats d'une demande préliminaire peuvent être mis en mémoire cache par un navigateur. Si vous ne spécifiez pas de valeur, la valeur par défaut est 0.
    • Activer l'option d'autorisation des données d'identification : Indique si la demande réelle à la route peut être effectuée à l'aide de données d'identification (témoins, en-têtes d'autorisation ou certificats de client TLS). Par défaut, cette option n'est pas sélectionnée.

    Pour découvrir comment les différents champs de la politique de demande CORS sont mappés dans les différents en-têtes de réponse CORS, voir Mappage d'une politique de demande CORS à une réponse CORS.

  6. Sélectionnez Appliquer les modifications, puis sélectionnez Suivant pour vérifier les détails que vous avez entrés pour le déploiement d'API et pour les routes individuelles.
  7. Sélectionnez Créer ou enregistrer les modifications pour créer ou mettre à jour le déploiement d'API.
  8. (Facultatif) Vérifiez que l'API a été déployée avec succès en l'appelant (voir Appel d'une API déployée sur une passerelle d'API).

Modification d'un fichier JSON pour ajouter des politiques de demande CORS

Pour ajouter une politique de demande CORS à une spécification de déploiement d'API dans un fichier JSON :

  1. Dans votre éditeur JSON préféré, modifiez la spécification de déploiement d'API existante à laquelle vous souhaitez ajouter la prise en charge de la spécification CORS ou créez une spécification de déploiement d'API (voir Création d'une spécification de déploiement d'API).

    Par exemple, la spécification de déploiement d'API de base suivante définit une simple fonction sans serveur Hello World du service des fonctions pour OCI en tant qu'élément dorsal unique :

    {
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }
  2. Pour spécifier une politique de demande CORS qui s'applique globalement à toutes les routes d'un déploiement d'API :

    1. Insérez une section requestPolicies avant la section routes, si elle n'existe pas déjà. Par exemple :

      {
        "requestPolicies": {},
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
    2. Ajoutez la politique cors suivante à la nouvelle section requestPolicies pour l'appliquer globalement à toutes les routes d'un déploiement d'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"
            }
          }
        ]
      }

      où :

      • "allowedOrigins": [<list-of-origins>] est une liste obligatoire séparée par des virgules contenant les origines qui sont autorisées à accéder au déploiement d'API. Par exemple, , "allowedOrigins": ["*", "https://oracle.com"].
      • "allowedMethods": [<list-of-methods>] est une liste facultative séparée par des virgules contenant les méthodes HTTP qui sont autorisées dans la demande réelle au déploiement d'API. Par exemple, "allowedMethods": ["*", "GET"].
      • "allowedHeaders": [<list-of-implicit-headers>] est une liste facultative séparée par des virgules contenant les en-têtes HTTP autorisés dans la demande réelle au déploiement d'API. Par exemple, "allowedHeaders": ["opc-request-id", "If-Match"].
      • "exposedHeaders": [<list-of-exposed-headers>] est une liste facultative séparée par des virgules contenant les en-têtes HTTP auxquels les clients d'API peuvent accéder dans la réponse du déploiement d'API à une demande réelle. Par exemple, "exposedHeaders": ["ETag", "opc-request-id"].
      • "isAllowCredentialsEnabled": <true|false> est true ou false, indiquant si la demande réelle au déploiement d'API peut être effectuée à l'aide de données d'identification (témoins, en-têtes d'autorisation ou certificats de client TLS). Si vous ne spécifiez pas de valeur, la valeur par défaut est false.
      • "maxAgeInSeconds": <seconds> est un nombre entier indiquant pendant combien de temps (en secondes delta) les résultats d'une demande préliminaire peuvent être mis en mémoire cache par un navigateur. Si vous ne spécifiez pas de valeur, la valeur par défaut est 0.

      Par exemple :

      {
        "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"
            }
          }
        ]
      }

      Pour découvrir comment les différents champs de la politique de demande CORS sont mappés dans les différents en-têtes de réponse CORS, voir Mappage d'une politique de demande CORS à une réponse CORS.

  3. Pour spécifier une politique de demande CORS qui s'applique à une route individuelle :

    1. Insérez une section requestPolicies après la section de l'élément dorsal pour la route à laquelle appliquer la politique. Par exemple :

      {
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            },
            "requestPolicies": {}
          }
        ]
      }
    2. Ajoutez la politique cors suivante à la nouvelle section requestPolicies pour l'appliquer à cette route particulière seulement :
      {
        "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>
              }
            }
          }
        ]
      }

      où :

      • "allowedOrigins": [<list-of-origins>] est une liste obligatoire séparée par des virgules contenant les origines qui sont autorisées à accéder au déploiement d'API. Par exemple, , "allowedOrigins": ["*", "https://oracle.com"].
      • "allowedMethods": [<list-of-methods>] est une liste facultative séparée par des virgules contenant les méthodes HTTP qui sont autorisées dans la demande réelle au déploiement d'API. Par exemple, "allowedMethods": ["*", "GET"].
      • "allowedHeaders": [<list-of-implicit-headers>] est une liste facultative séparée par des virgules contenant les en-têtes HTTP autorisés dans la demande réelle au déploiement d'API. Par exemple, "allowedHeaders": ["opc-request-id", "If-Match"].
      • "exposedHeaders": [<list-of-exposed-headers>] est une liste facultative séparée par des virgules contenant les en-têtes HTTP auxquels les clients d'API peuvent accéder dans la réponse du déploiement d'API à une demande réelle. Par exemple, "exposedHeaders": ["ETag", "opc-request-id"].
      • "isAllowCredentialsEnabled": <true|false> est true ou false, indiquant si la demande réelle au déploiement d'API peut être effectuée à l'aide de données d'identification (témoins, en-têtes d'autorisation ou certificats de client TLS). Si vous ne spécifiez pas de valeur, la valeur par défaut est false.
      • "maxAgeInSeconds": <seconds> est un nombre entier indiquant pendant combien de temps (en secondes delta) les résultats d'une demande préliminaire peuvent être mis en mémoire cache par un navigateur. Si vous ne spécifiez pas de valeur, la valeur par défaut est 0.

      Par exemple :

      {
        "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
              }
            }
          }
        ]
      }

      Pour découvrir comment les différents champs de la politique de demande CORS sont mappés dans les différents en-têtes de réponse CORS, voir Mappage d'une politique de demande CORS à une réponse CORS.

  4. Enregistrez le fichier JSON contenant la spécification de déploiement d'API.
  5. Utilisez comme suit la spécification de déploiement d'API lorsque vous créez ou mettez à jour un déploiement d'API :

    • En spécifiant le fichier JSON dans la console lorsque vous sélectionnez l'option Charger une API existante.
    • En spécifiant le fichier JSON dans une demande à l'API REST du service Passerelle d'API.

    Pour plus d'informations, voir Déploiement d'une API sur une passerelle d'API en créant un déploiement d'API et Mise à jour d'une passerelle d'API.

  6. (Facultatif) Vérifiez que l'API a été déployée avec succès en l'appelant (voir Appel d'une API déployée sur une passerelle d'API).

Mappage d'une politique de demande CORS à une réponse CORS

Les différents champs d'une politique de demande CORS sont mappés à différents en-têtes de réponse CORS comme montré dans le tableau :

Champ Est mappé à un en-tête de réponse CORS Inclus dans la réponse à la demande préliminaire Inclus dans la réponse à la demande réelle Notes
allowed Origins Access-Control-Allow-Origin Oui Oui

Obligatoire? : Oui

Type de données : Chaîne[]

Valeur par défaut : s.o.

Sert à retourner une liste séparée par des virgules contenant les origines qui sont autorisées à accéder au déploiement d'API.

Une seule origine est autorisée par la spécification CORS. Ainsi, s'il existe plusieurs origines, l'origine du client doit être vérifiée dynamiquement par rapport à la liste des valeurs autorisées. Les valeurs "*" et "null" sont autorisées.

allowed Methods Access-Control-Allow-Methods Oui Non

Obligatoire? : Non

Type de données : Chaîne[]

Valeur par défaut : Liste vide

Sert à retourner une liste séparée par des virgules contenant les méthodes HTTP qui sont autorisées dans la demande réelle au déploiement d'API.

La valeur par défaut Access-Control-Allow-Methods consiste à autoriser toutes les méthodes simples, même dans les demandes préliminaires.

allowed Headers Access-Control-Allow-Headers Oui Non

Obligatoire? : Non

Type de données : Chaîne[]

Valeur par défaut : Liste vide

Sert à retourner une liste séparée par des virgules contenant les en-têtes HTTP qui sont autorisés dans la demande réelle au déploiement d'API.

exposed Headers Access-Control-Expose-Headers Non Oui

Obligatoire? : Non

Type de données : Chaîne[]

Valeur par défaut : Liste vide

Sert à retourner une liste séparée par des virgules contenant les en-têtes HTTP auxquels les clients peuvent accéder dans la réponse du déploiement d'API à une demande réelle. Cette liste d'en-têtes HTTP s'ajoute aux en-têtes de réponse CORS figurant dans la liste des en-têtes approuvés.

isAllow Credentials Enabled Access-Control-Allow-Credentials Oui Oui

Obligatoire? : Non

Type de données : Booléen

Valeur par défaut : false

Sert à retourner true ou false, indiquant si la demande réelle au déploiement d'API peut être effectuée à l'aide de données d'identification (témoins, en-têtes d'autorisation ou certificats de client TLS).

Pour autoriser l'exécution des demandes avec des données d'identification, réglez isAllowCredentialsEnabled à true.

maxAge InSeconds Access-Control-Max-Age Oui Non Obligatoire? : Non

Type de données : Nombre entier

Par défaut : 0

Sert à indiquer pendant combien de temps (en secondes delta) les résultat d'une demande préliminaire peuvent être mis en mémoire cache par un navigateur. Ignoré si la valeur est réglée à 0.