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

Découvrez comment utiliser une stratégie de demande pour ajouter la prise en charge CORS aux déploiements d'API à l'aide d'API Gateway.

Les navigateurs Web implémentent généralement une stratégie de même origine pour empêcher le code d'effectuer des demandes par rapport à une autre origine que celle à partir de laquelle il a été traité. L'objectif de cette stratégie est de fournir une protection contre les sites Web malveillants. Cependant, cette stratégie de même origine peut également bloquer des interactions légitimes entre un serveur et des clients d'une origine connue et sécurisée.

La spécification CORS (Cross-Origin Resource Sharing) est une norme de partage inter-origine qui permet d'assouplir la stratégie de même origine en autorisant le code sur une page Web à utiliser une API REST traitée à partir d'une autre origine. La norme CORS utilise des en-têtes de demande HTTP et des en-têtes de réponse supplémentaires pour indiquer les origines auxquelles il est possible d'accéder.

Pour certaines méthodes de demande HTTP, la norme CORS exige également que la demande soit prévérifiée. Avant d'envoyer la demande réelle, le navigateur Web envoie une demande de prévérification au serveur afin de déterminer si les méthodes dans la demande réelle sont prises en charge. Le serveur répond en envoyant 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 dans la demande réelle sont autorisées. La norme CORS permet également aux serveurs d'indiquer aux clients si les demandes peuvent inclure des informations d'identification (cookies, en-têtes d'autorisation ou certificats client TLS).

Pour plus d'informations sur la spécification CORS, reportez-vous aux ressources disponibles en ligne, dont celles de W3C et Mozilla.

Le service API Gateway vous permet d'activer la prise en charge CORS dans les API que vous déployez vers des passerelles d'API. Lorsque vous activez la prise en charge CORS dans un déploiement d'API, les demandes HTTP de prévérification et les demandes HTTP réelles destinées au déploiement d'API renvoient des en-têtes de réponse CORS au client d'API. Vous pouvez définir les valeurs d'en-tête de réponse CORS dans la spécification de déploiement d'API.

Vous pouvez utiliser des stratégies de demande pour ajouter la prise en charge CORS aux API (reportez-vous à Ajout de stratégies de demande et de réponse aux spécifications de déploiement d'API). Vous pouvez appliquer une stratégie de demande CORS de façon globale à tous les routages dans une spécification de déploiement d'API ou uniquement à des routages en particulier.

Vous pouvez ajouter une stratégie de demande CORS à une spécification de déploiement d'API :

  • utilisant la console,
  • modifiant un fichier JSON.

Utilisation de la console pour ajouter des stratégies de demande CORS

Pour ajouter une stratégie de demande CORS à une spécification de déploiement d'API à l'aide de la console, procédez comme suit :

  1. Créez ou mettez à jour un déploiement d'API à l'aide de la console, sélectionnez l'option Entièrement nouveau, puis saisissez les détails sur la page Informations de base.

    Pour plus d'informations, reportez-vous à 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 Stratégies de demande d'API de la page Informations de base, sélectionnez le bouton Ajouter en regard de CORS et indiquez les informations 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 la deuxième origine et les suivantes.
    • Méthodes autorisées : méthodes autorisées dans la demande réelle adressée au déploiement d'API. Par exemple, GET, PUT.
    • En-têtes autorisés : (facultatif) en-tête HTTP autorisé dans la demande réelle adressée au déploiement d'API. Par exemple, opc-request-id ou If-Match. Sélectionnez + Autre en-tête pour entrer le deuxième en-tête et les suivants.
    • En-têtes exposés : (facultatif) 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 le deuxième en-tête et les suivants.
    • Durée maximale de conservation en secondes : (facultatif) valeur entière indiquant la durée (en delta-secondes) de mise en cache des résultats d'une demande de prévérification par un navigateur. Si vous ne spécifiez aucune valeur, la valeur par défaut est 0.
    • Activer l'autorisation des informations d'identification : indique si la demande réelle au déploiement d'API peut être réalisée à l'aide des informations d'identification (cookies, en-têtes d'autorisation ou certificats client TLS). Par défaut, cette option n'est pas sélectionnée.

    Pour savoir comment les différents champs de la stratégie de demande CORS sont mis en correspondance avec les différents en-têtes de réponse CORS, reportez-vous à Méthode de mise en correspondance d'une stratégie de demande CORS avec une réponse CORS.

  3. Sélectionnez Appliquer les modifications.

  4. Sélectionnez Suivant pour indiquer les options d'authentification sur la page Authentification.

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

  5. Sélectionnez Suivant pour saisir les détails de chaque routage dans le déploiement d'API sur la page Routages. Pour spécifier des stratégies de demande CORS qui s'appliquent à un routage spécifique, sélectionnez Afficher les stratégies de demande de routage, cliquez sur le bouton Ajouter en regard de CORS, puis indiquez les informations suivantes :

    • Origines autorisées : origine autorisée à accéder au routage. Par exemple, https://oracle.com. Sélectionnez + Autre origine pour entrer la deuxième origine et les suivantes.
    • Méthodes autorisées : méthodes autorisées dans la demande réelle adressée au routage. Par exemple, GET, PUT.
    • En-têtes autorisés : (facultatif) en-tête HTTP autorisé dans la demande adressée au routage. Par exemple, opc-request-id ou If-Match. Sélectionnez + Autre en-tête pour entrer le deuxième en-tête et les suivants.
    • En-têtes exposés : (facultatif) 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 le deuxième en-tête et les suivants.
    • Durée maximale de conservation en secondes : (facultatif) valeur entière indiquant la durée (en delta-secondes) de mise en cache des résultats d'une demande de prévérification par un navigateur. Si vous ne spécifiez aucune valeur, la valeur par défaut est 0.
    • Activer l'autorisation des informations d'identification : indique si la demande réelle au routage peut être réalisée à l'aide des informations d'identification (cookies, en-têtes d'autorisation ou certificats client TLS). Par défaut, cette option n'est pas sélectionnée.

    Pour savoir comment les différents champs de la stratégie de demande CORS sont mis en correspondance avec les différents en-têtes de réponse CORS, reportez-vous à Méthode de mise en correspondance d'une stratégie de demande CORS avec une réponse CORS.

  6. Sélectionnez Appliquer les modifications, puis Suivant afin de vérifier les détails saisis pour le déploiement d'API et les routages.
  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 en l'appelant (reportez-vous à Appel d'une API déployée sur une passerelle d'API).

Modification d'un fichier JSON pour ajouter des stratégies de demande CORS

Pour ajouter une stratégie de demande CORS à une spécification de déploiement d'API dans un fichier JSON, procédez comme suit :

  1. A l'aide de l'éditeur JSON de votre choix, modifiez la spécification de déploiement d'API existante à laquelle vous voulez ajouter la prise en charge CORS ou créez une spécification de déploiement d'API (reportez-vous à 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 fonction simple sans serveur Hello World dans OCI Functions en tant que back-end unique :

    {
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }
  2. Pour spécifier une stratégie de demande CORS qui s'applique de façon globale à tous les routages d'un déploiement d'API, procédez comme suit :

    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 stratégie cors suivante à la nouvelle section requestPolicies pour l'appliquer de façon globale à tous les routages dans un déploiement 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 la liste requise des origines, séparées par des virgules, autorisées à accéder au déploiement d'API. Par exemple, , "allowedOrigins": ["*", "https://oracle.com"]
      • "allowedMethods": [<list-of-methods>] est la liste facultative des méthodes HTTP, séparées par des virgules, autorisées dans la demande réelle adressée au déploiement d'API. Par exemple, "allowedMethods": ["*", "GET"]
      • "allowedHeaders": [<list-of-implicit-headers>] est la liste facultative des en-têtes HTTP, séparés par des virgules, autorisés dans la demande réelle adressée au déploiement d'API. Par exemple, "allowedHeaders": ["opc-request-id", "If-Match"]
      • "exposedHeaders": [<list-of-exposed-headers>] est la liste facultative des en-têtes HTTP, séparés par des virgules, 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> prend la valeur true ou false pour indiquer si la demande réelle adressée au déploiement d'API peut être réalisée à l'aide des informations d'identification (cookies, en-têtes d'autorisation ou certificats client TLS). Si cette valeur n'est pas renseignée, la valeur par défaut est false.
      • "maxAgeInSeconds": <seconds> est une valeur entière indiquant la durée (en delta-secondes) de mise en cache des résultats d'une demande de prévérification par un navigateur. Si cette valeur n'est pas renseignée, 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 savoir comment les différents champs de la stratégie de demande CORS sont mis en correspondance avec les différents en-têtes de réponse CORS, reportez-vous à Méthode de mise en correspondance d'une stratégie de demande CORS avec une réponse CORS.

  3. Pour spécifier une stratégie de demande CORS qui s'applique à un routage, procédez comme suit :

    1. Insérez une section requestPolicies après la section back-end du routage auquel appliquer la stratégie. Par exemple :

      {
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            },
            "requestPolicies": {}
          }
        ]
      }
    2. Ajoutez la stratégie cors suivante à la nouvelle section requestPolicies pour l'appliquer uniquement à ce routage en particulier :
      {
        "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 la liste requise des origines, séparées par des virgules, autorisées à accéder au déploiement d'API. Par exemple, , "allowedOrigins": ["*", "https://oracle.com"]
      • "allowedMethods": [<list-of-methods>] est la liste facultative des méthodes HTTP, séparées par des virgules, autorisées dans la demande réelle adressée au déploiement d'API. Par exemple, "allowedMethods": ["*", "GET"]
      • "allowedHeaders": [<list-of-implicit-headers>] est la liste facultative des en-têtes HTTP, séparés par des virgules, autorisés dans la demande réelle adressée au déploiement d'API. Par exemple, "allowedHeaders": ["opc-request-id", "If-Match"]
      • "exposedHeaders": [<list-of-exposed-headers>] est la liste facultative des en-têtes HTTP, séparés par des virgules, 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> prend la valeur true ou false pour indiquer si la demande réelle adressée au déploiement d'API peut être réalisée à l'aide des informations d'identification (cookies, en-têtes d'autorisation ou certificats client TLS). Si cette valeur n'est pas renseignée, la valeur par défaut est false.
      • "maxAgeInSeconds": <seconds> est une valeur entière indiquant la durée (en delta-secondes) de mise en cache des résultats d'une demande de prévérification par un navigateur. Si cette valeur n'est pas renseignée, 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 savoir comment les différents champs de la stratégie de demande CORS sont mis en correspondance avec les différents en-têtes de réponse CORS, reportez-vous à Méthode de mise en correspondance d'une stratégie de demande CORS avec une réponse CORS.

  4. Enregistrez le fichier JSON qui contient la spécification de déploiement d'API.
  5. Utilisez 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 Télécharger une API existante,
    • spécifiant le fichier JSON dans une demande adressée à l'API REST d'API Gateway.

    Pour plus d'informations, reportez-vous à 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 en l'appelant (reportez-vous à Appel d'une API déployée sur une passerelle d'API).

Méthode de mise en correspondance d'une stratégie de demande CORS avec une réponse CORS

Les différents champs dans une stratégie de demande CORS sont mis en correspondance avec les différents en-têtes de réponse CORS comme indiqué dans le tableau suivant :

Champ Mis en correspondance avec l'en-tête de réponse CORS Inclus dans la réponse à la demande de prévérification Inclus dans la réponse à la demande réelle Remarques
allowed Origins Access-Control-Allow-Origin Oui Oui

Requis ? : oui

Type de données : chaîne[]

Valeur par défaut : N/A

Permet de renvoyer la liste des origines, séparées par des virgules, autorisées à accéder au déploiement d'API.

Une seule origine est autorisée par la spécification CORS. Par conséquent, en cas d'origines multiples, l'origine du client doit être vérifiée de façon dynamique par rapport à la liste des valeurs autorisées. Les valeurs "*" et "null" sont autorisées.

allowed Methods Access-Control-Allow-Methods Oui Non

Requis ? : non

Type de données : chaîne[]

Valeur par défaut : liste vide

Permet de renvoyer la liste des méthodes HTTP, séparées par des virgules, autorisées dans la demande réelle adressée au déploiement d'API.

La valeur par défaut de l'option Access-Control-Allow-Methods autorise toutes les méthodes simples, y compris dans les demandes de prévérification.

allowed Headers Access-Control-Allow-Headers Oui Non

Requis ? : non

Type de données : chaîne[]

Valeur par défaut : liste vide

Permet de renvoyer la liste des en-têtes HTTP, séparés par des virgules, autorisés dans la demande réelle adressée au déploiement d'API.

exposed Headers Access-Control-Expose-Headers Non Oui

Requis ? : non

Type de données : chaîne[]

Valeur par défaut : liste vide

Permet de renvoyer la liste des en-têtes HTTP, séparés par des virgules, auxquels les clients peuvent accéder dans la réponse du déploiement d'API à une demande réelle. La liste des en-têtes HTTP vient s'ajouter à la liste des en-têtes de réponse autorisés par CORS.

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

Requis ? : non

Type de données : valeur booléenne

Valeur par défaut : false

Permet de renvoyer true or false pour indiquer si la demande réelle au déploiement d'API peut être réalisée à l'aide des informations d'identification (cookies, en-têtes d'autorisation ou certificats client TLS).

Pour autoriser les demandes réalisées avec des informations d'identification, définissez isAllowCredentialsEnabled sur true.

maxAge InSeconds Access-Control-Max-Age Oui Non Requis ? : non

Type de données : nombre entier

Par défaut : 0

Permet d'indiquer la durée (en delta-secondes) de mise en cache des résultats d'une demande de prévérification par un navigateur. Ignoré si défini sur 0.