Règle CORS

Cette page s'applique à Apigee et à Apigee hybrid.

Consultez la documentation d'Apigee Edge.

icône de la règle

Objet

Le partage de ressources entre origines (CORS) est un mécanisme standard qui permet aux appels XMLHttpRequest (XHR) exécutés sur une page Web d'interagir avec des ressources extérieures au domaine d'origine. CORS est une solution couramment mise en œuvre à la règle de même origine appliquée par tous les navigateurs.

Par exemple, si vous effectuez un appel XHR à l'API Twitter à partir de code JavaScript exécuté dans votre navigateur, l'appel échoue. En effet, le domaine qui diffuse la page vers votre navigateur est différent du domaine diffusant l'API Twitter. CORS offre une solution à ce problème en autorisant des serveurs à accepter explicitement le partage de ressources entre origines multiples.

Cette règle CORS permet aux clients Apigee de définir des règles CORS pour les API utilisées par les applications Web.

Cette règle est une règle standard qui peut être déployée sur n'importe quel type d'environnement. Tous les utilisateurs n'ont pas besoin de connaître les types de règles et d'environnements. Pour en savoir plus sur les types de règles et la disponibilité avec chaque type d'environnement, consultez la section Types de règles.

Élément <CORS>

Définit la règle CORS.

Valeur par défaut Consultez l'onglet Règles par défaut ci-dessous.
Obligatoire ? Obligatoire
Type Objet complexe
Élément parent ND
Éléments enfants <AllowCredentials>
<AllowHeaders>
<AllowMethods>
<AllowOrigins>
<DisplayName>
<ExposeHeaders>
<GeneratePreflightResponse>
<IgnoreUnresolvedVariables>
<MaxAge>

L'élément <CORS> utilise la syntaxe suivante :

Syntaxe

L'élément <CORS> utilise la syntaxe suivante :


<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <DisplayName>DISPLAY_NAME</DisplayName>
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
  <AllowMethods>[GET, PUT, POST, DELETE, ...|*]</AllowMethods>
  <AllowHeaders>[origin, x-requested-with, accept, content-type, ...]</AllowHeaders>
  <ExposeHeaders>[X-CUSTOM-HEADER-A, X-CUSTOM-HEADER-B, ... | *]</ExposeHeaders>
  <MaxAge>[integer|-1]</MaxAge>
  <AllowCredentials>[false|true]</AllowCredentials>
  <GeneratePreflightResponse>[false|true]</GeneratePreflightResponse>
  <IgnoreUnresolvedVariables>[false|true]</IgnoreUnresolvedVariables>
</CORS>

Stratégie par défaut

L'exemple suivant montre les paramètres par défaut lorsque vous ajoutez la règle CORS à votre flux dans l'interface utilisateur Edge :

<CORS continueOnError="false" enabled="true" name="add-cors">
    <DisplayName>Add CORS</DisplayName>
    <AllowOrigins>{request.header.origin}</AllowOrigins>
    <AllowMethods>GET, PUT, POST, DELETE</AllowMethods>
    <AllowHeaders>origin, x-requested-with, accept, content-type</AllowHeaders>
    <ExposeHeaders>*</ExposeHeaders>
    <MaxAge>3628800</MaxAge>
    <AllowCredentials>false</AllowCredentials>
    <GeneratePreflightResponse>true</GeneratePreflightResponse>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</CORS>

Lorsque vous insérez une nouvelle règle CORS dans l'interface utilisateur d'Apigee, le modèle contient des bouchons pour toutes les opérations possibles. En règle générale, vous devez sélectionner les opérations que vous souhaitez effectuer avec cette règle et supprimer le reste des éléments enfants. Par exemple, si vous souhaitez spécifier les méthodes HTTP autorisées à accéder à la ressource, utilisez l'élément <AllowMethods> et supprimez les autres éléments enfants de la règle pour la rendre plus lisible.

Cet élément possède les attributs suivants qui sont communs à toutes les règles :

Attribut Par défaut Obligatoire ? Description
name ND Obligatoire

Nom interne de la règle. La valeur de l'attribut name peut contenir des lettres, des chiffres, des espaces, des tirets, des traits de soulignement et des points. Cette valeur ne peut pas dépasser 255 caractères.

Vous pouvez également utiliser l'élément <DisplayName> pour ajouter un libellé à la règle dans l'éditeur de proxy de l'interface utilisateur de gestion avec un nom différent, en langage naturel.

continueOnError faux Facultatif Définissez sur false pour afficher une erreur en cas d'échec d'une règle. Il s'agit du comportement attendu pour la plupart des règles. Définissez sur true pour que l'exécution du flux se poursuive même après l'échec d'une règle. Voir aussi :
enabled true Facultatif Définissez sur true pour appliquer la règle. Définissez sur false pour désactiver la règle. La règle ne sera pas appliquée même si elle reste associée à un flux.
async   faux Obsolète Cet attribut est obsolète.

Chacun des éléments enfants est décrit dans les sections ci-après.

Exemples

Des exemples sont fournis pour tous les éléments enfants des sections suivantes.

Référence d'élément enfant

Cette section décrit les éléments enfants de <CORS>.

<AllowCredentials>

Indique si l'appelant est autorisé à envoyer la requête réelle (et non la version préliminaire) à l'aide d'identifiants. Se traduit en un en-tête Access-Control-Allow-Credentials.

Valeur par défaut Si aucune valeur n'est spécifiée, Access-Control-Allow-Credentials n'est pas défini.
Requis ? Facultatif
Type Booléen
Élément parent <CORS>
Éléments enfants Aucune

L'élément <AllowCredentials> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
  <AllowCredentials>[false|true]</AllowCredentials>
</CORS>
      

Exemple

Cet exemple définit l'en-tête Access-Control-Allow-Credentials sur false. Autrement dit, l'appelant n'est pas autorisé à envoyer la requête réelle (et non la version préliminaire) à l'aide d'identifiants.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <AllowCredentials>false</AllowCredentials>
</CORS>

<AllowHeaders>

Liste des en-têtes HTTP pouvant être utilisés pour demander la ressource. Sérialisée dans l'en-tête Access-Control-Allow-Headers.

Valeur par défaut Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers
Requis ? Facultatif
Type Chaîne, compatible avec les modèles de message*
Élément parent <CORS>
Éléments enfants Aucun

*Pour en savoir plus, consultez la page Qu'est-ce qu'un modèle de message ?

L'élément <AllowHeaders> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
  <AllowHeaders>[origin, x-requested-with, accept, content-type, ...]</AllowHeaders>
</CORS>

Exemple

Exemple CORS AllowOrigins

Cet exemple spécifie les en-têtes HTTP pouvant être utilisés pour demander la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <AllowHeaders>origin, x-requested-with, accept, content-type</AllowHeaders>
</CORS>

<AllowMethods>

Liste des méthodes HTTP autorisées à accéder à la ressource. Le contenu est sérialisé dans l'en-tête Access-Control-Allow-Methods.

Valeur par défaut GET, POST, HEAD, OPTIONS
Requis ? Facultatif
Type Chaîne, compatible avec les modèles de message*
Élément parent <CORS>
Éléments enfants Aucun

*Pour en savoir plus, consultez la page Qu'est-ce qu'un modèle de message ?

L'élément <AllowMethods> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
  <AllowMethods>[GET, PUT, POST, DELETE, ...|*]</AllowMethods>
</CORS>

Exemple :
Liste

Cet exemple spécifie les méthodes HTTP autorisées à accéder à la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <AllowMethods>GET, PUT, POST, DELETE</AllowMethods>
</CORS>

Exemple :
Caractère générique

Cet exemple spécifie que toutes les méthodes HTTP sont autorisées à accéder à la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <AllowMethods>*</AllowMethods>
</CORS>

<AllowOrigins>

Liste des origines autorisées à accéder à la ressource. Utilisez un astérisque (*) pour autoriser l'accès à une ressource depuis n'importe quelle origine. Sinon, fournissez une liste d'autorisation contenant des origines séparées par des virgules. En cas de correspondance, la valeur Access-Control-Allow-Origin sortante est définie sur l'origine fournie par le client.

Valeur par défaut ND
Obligatoire ? Obligatoire
Type Chaîne, compatible avec les modèles de message*
Élément parent <CORS>
Éléments enfants Aucun

*Pour en savoir plus, consultez la page Qu'est-ce qu'un modèle de message ?

L'élément <AllowOrigins> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
</CORS>

Exemple :
URL unique

Cet exemple spécifie une seule origine d'URL autorisée à accéder à la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>https://www.w3.org</AllowOrigins>
</CORS>

Exemple :
URL multiples

Cet exemple spécifie plusieurs origines autorisées à accéder à la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>https://www.w3.org, https://www.apache.org</AllowOrigins>
</CORS>

Exemple :
Variable de contexte

Cet exemple spécifie une variable de contexte qui représente une ou plusieurs origines autorisées à accéder à la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{origins.list}</AllowOrigins>
</CORS>

Exemple :
Variable de flux

Cet exemple spécifie une variable de flux représentant une origine autorisée à accéder à la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
</CORS>

Exemple :
Caractère générique

Cet exemple indique que toutes les origines sont autorisées à accéder à la ressource.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>*</AllowOrigins>
</CORS>

<DisplayName>

Utilisez-le, en plus de l'attribut name, pour appliquer un libellé à la règle dans l'éditeur de proxys de l'interface de gestion en utilisant un nom différent et plus naturel.

L'élément <DisplayName> est commun à toutes les règles.

Valeur par défaut ND
Obligatoire ? Facultatif. Si vous omettez <DisplayName>, la valeur de l'attribut name de la règle est utilisée.
Type Chaîne
Élément parent <PolicyElement>
Éléments enfants Aucune

L'élément <DisplayName> utilise la syntaxe suivante :

Syntaxe

<PolicyElement>
  <DisplayName>POLICY_DISPLAY_NAME</DisplayName>
  ...
</PolicyElement>

Exemple

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

L'élément <DisplayName> ne comporte aucun attribut ni élément enfant.

<ExposeHeaders>

Liste des en-têtes HTTP auxquels les navigateurs sont autorisés à accéder ou astérisque (*) pour autoriser tous les en-têtes HTTP. Sérialisé dans l'en-tête Access-Control-Expose-Headers.

Valeur par défaut Si aucune valeur n'est spécifiée, Access-Control-Expose-Headers n'est pas défini. Pas défaut, les en-têtes non simples ne sont pas exposés.
Requis ? Facultatif
Type Chaîne, compatible avec les modèles de message*
Élément parent <CORS>
Éléments enfants Aucun

*Pour en savoir plus, consultez la page Qu'est-ce qu'un modèle de message ?

L'élément <ExposeHeaders> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
  <ExposeHeaders>[X-CUSTOM-HEADER-A, X-CUSTOM-HEADER-B, ... | *]</ExposeHeaders>
</CORS>

Exemple

Cet exemple indique que les navigateurs sont autorisés à accéder à tous les en-têtes HTTP.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <ExposeHeaders>*</ExposeHeaders>
</CORS>

<GeneratePreflightResponse>

Indiquez si la stratégie doit générer puis renvoyer la réponse CORS préliminaire. Si la valeur est false, aucune réponse n'est envoyée. Au lieu de cela, les variables de flux suivantes sont renseignées :

  • cross_origin_resource_sharing.allow.credentials
  • cross_origin_resource_sharing.allow.headers
  • cross_origin_resource_sharing.allow.methods
  • cross_origin_resource_sharing.allow.origin
  • cross_origin_resource_sharing.allow.origins.list
  • cross_origin_resource_sharing.expose.headers
  • cross_origin_resource_sharing.max.age
  • cross_origin_resource_sharing.preflight.accepted
  • cross_origin_resource_sharing.request.headers
  • cross_origin_resource_sharing.request.method
  • cross_origin_resource_sharing.request.origin
  • cross_origin_resource_sharing.request.type
Valeur par défaut true
Requis ? Facultatif
Type Booléen
Élément parent <CORS>
Éléments enfants Aucune

L'élément <GeneratePreflightResponse> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <GeneratePreflightResponse>[false|true]</GeneratePreflightResponse>
  <GeneratePreflightResponse>[false|true]</GeneratePreflightResponse>
</CORS>

Exemple

Cet exemple indique que la règle doit générer et renvoyer la réponse CORS préliminaire.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <GeneratePreflightResponse>true</GeneratePreflightResponse>
</CORS>

<IgnoreUnresolvedVariables>

Détermine si le traitement s'arrête lorsqu'une variable non résolue est rencontrée. Définissez la valeur sur true pour ignorer les variables non résolues et poursuivre le traitement, sinon false.

Valeur par défaut true
Requis ? Facultatif
Type Booléen
Élément parent <CORS>
Éléments enfants Aucune

L'élément <IgnoreUnresolvedVariables> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
  <IgnoreUnresolvedVariables>[false|true]</IgnoreUnresolvedVariables>
</CORS>

Exemple

Cet exemple indique que le traitement se poursuit lorsqu'une variable non résolue est rencontrée.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</CORS>

<MaxAge>

Permet de spécifier la durée (en secondes) de mise en cache des résultats d'une requête préliminaire. Une valeur -1 renseigne l'en-tête Access-Control-Max-Age avec une valeur de -1, ce qui désactive la mise en cache et nécessite une vérification préliminaire des OPTIONS pour tous les appels. Ce paramètre est défini dans la spécification Access-Control-Max-Age.

Valeur par défaut 1800
Requis ? Facultatif
Type Entier
Élément parent <CORS>
Éléments enfants Aucune

L'élément <MaxAge> utilise la syntaxe suivante :

Syntaxe

<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME">
  <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins>
  <MaxAge>[integer|-1]</MaxAge>
</CORS>

Exemple :
Cache

Cet exemple indique que les résultats d'une requête préliminaire peuvent être mis en cache pendant 3628800 secondes.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <MaxAge>3628800</MaxAge>
</CORS>

Exemple :
Aucun cache

Cet exemple indique que les résultats d'une requête préliminaire ne peuvent pas être mis en cache.

<CORS continueOnError="false" enabled="true" name="add-cors">
  <AllowOrigins>{request.header.origin}</AllowOrigins>
  <MaxAge>-1</MaxAge>
</CORS>

Remarques sur l'utilisation

Requêtes OPTIONS

Lorsqu'une requête OPTIONS est reçue et traitée par la règle CORS, l'exécution du flux du proxy est transférée directement vers le PreFlow de réponse du proxy, en ignorant entièrement les flux de requête et continue l'exécution à partir de là. Il n'est pas nécessaire de créer une condition pour ignorer la requête OPTIONS dans le flux de requête du proxy.

Lors des appels suivants, lorsque la règle CORS est exécutée, si le MaxAge défini dans la règle n'a pas expiré, le flux se poursuit normalement. Lors du flux de réponse final juste avant "Response Sent to Client", une étape d'exécution spéciale de CORS "CORSResponseOrErrorFlowExecution" définit les en-têtes de réponse CORS Access-Control-Allow-Credentials, Access-Control-Allow-Origin et Access-Control-Expose-Headers) pour renvoyer une réponse validée par CORS.

Codes d'erreur

Cette section décrit les codes d'erreur et les messages d'erreur renvoyés et les variables d'erreur définies par Apigee lorsque cette règle déclenche une erreur. Ces informations sont importantes si vous développez des règles de défaillance afin de gérer les pannes. Pour en savoir plus, consultez les pages Ce que vous devez savoir à propos des erreurs liées aux règles et Gérer les pannes.

Erreurs d'exécution

Ces erreurs peuvent se produire lors de l'exécution de la règle.

Code d'erreur État HTTP Cause
steps.cors.UnresolvedVariable 500 Cette erreur se produit si une variable spécifiée dans la règle CORS est :
  • est hors de portée (non disponible dans le flux spécifique où la règle est exécutée)
  • ou

  • impossible à résoudre (non définie)

Erreurs de déploiement

Ces erreurs peuvent se produire lorsque vous déployez un proxy contenant cette règle.

Nom de l'erreur Cause
InvalidMaxAge MaxAge n'est pas un nombre
MissingAllowOrigins AllowOrigins n'est pas spécifié
InvalidHTTPMethods L'une des méthodes de AllowMethods n'est pas valide
AllowHeadersSizeTooLarge La taille de la chaîne dans AllowHeaders est trop importante.
ExposeHeadersSizeTooLarge La taille de la chaîne dans ExposeHeaders est trop importante.

Variables de panne

Ces variables sont définies lorsque cette règle déclenche une erreur au moment de l'exécution. Pour en savoir plus, consultez la section Ce que vous devez savoir sur les erreurs liées aux règles.

Variables Lieu Exemple
fault.name = "FAULT_NAME" FAULT_NAME est le nom de l'erreur, tel qu'indiqué dans le tableau Erreurs d'exécution ci-dessus. Le nom d'erreur est la dernière partie du code d'erreur. fault.name Matches "UnresolveVariable"
cors.POLICY_NAME.failed POLICY_NAME est le nom spécifié par l'utilisateur de la règle qui a provoqué l'erreur. cors.AddCORS.failed = true

Exemple de réponse d'erreur

{
   "fault":{
      "detail":{
         "errorcode":"steps.cors.UnresolvedVariable"
      },
      "faultstring":"CORS[AddCORS]: unable to resolve variable wrong.var"
   }
}

Exemple de règle de défaillance

<FaultRule name="Add CORS Fault">
    <Step>
        <Name>Add-CORSCustomUnresolvedVariableErrorResponse</Name>
        <Condition>(fault.name Matches "UnresolvedVariable") </Condition>
    </Step>
    <Condition>(cors.Add-CORS.failed = true) </Condition>
</FaultRule>

Variables de flux

Un objet CorsFlowInfo FlowInfo sera ajouté et pourra être suivi.

Valeur Type Lecture/Écriture Description Début du champ d'application
cross_origin_resource_sharing.allow.credentials Booléen Lecture/Écriture Valeur de <AllowCredentials> Requête de proxy
cross_origin_resource_sharing.allow.headers Chaîne Lecture/Écriture Valeur de <AllowHeaders> Requête de proxy
cross_origin_resource_sharing.allow.methods Chaîne Lecture/Écriture Valeur de <AllowMethods> Requête de proxy
cross_origin_resource_sharing.allow.origin Chaîne Lecture/Écriture L'origine de la requête qui est autorisée. Elle est vide si elle ne figure pas dans la liste d'autorisation. Requête de proxy
cross_origin_resource_sharing.allow.origins.list Chaîne Lecture/Écriture Valeur de <AllowOrigins> Requête de proxy
cross_origin_resource_sharing.expose.headers Chaîne Lecture/Écriture Valeur de <ExposeHeaders> Requête de proxy
cross_origin_resource_sharing.max.age Entier Lecture/Écriture Valeur de <MaxAge> Requête de proxy
cross_origin_resource_sharing.preflight.accepted Booléen Lecture/Écriture Indique si la requête de pré-vérification est acceptée Requête de proxy
cross_origin_resource_sharing.request.headers Chaîne Lecture/Écriture Valeur de l'en-tête de requête Access-Control-Request-Headers Requête de proxy
cross_origin_resource_sharing.request.method Chaîne Lecture/Écriture Valeur de l'en-tête de requête Access-Control-Request-Method Requête de proxy
cross_origin_resource_sharing.request.origin Chaîne Lecture/Écriture Même chose que pour request.header.origin Requête de proxy
cross_origin_resource_sharing.request.type Chaîne Lecture/Écriture

Type de requête CORS. Valeurs possibles :

  • ACTUAL : une requête qui n'est pas une requête de pré-vérification.
  • PRE_FLIGHT : une requête de pré-vérification.
Requête de proxy