Cette page s'applique à Apigee et à Apigee hybrid.
Consultez la documentation d'Apigee Edge.
Quoi
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. 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 | N/A |
É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 Vous pouvez également utiliser l'élément |
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. |
Obligatoire ? | Facultatif |
Type | Booléen |
Élément parent |
<CORS>
|
Éléments enfants | Aucun |
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 |
Obligatoire ? | 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
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 |
Obligatoire ? | 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 | N/A |
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 | N/A |
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 | Aucun |
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. |
Obligatoire ? | 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 |
Obligatoire ? | Facultatif |
Type | Booléen |
Élément parent |
<CORS>
|
Éléments enfants | Aucun |
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 |
Obligatoire ? | Facultatif |
Type | Booléen |
Élément parent |
<CORS>
|
Éléments enfants | Aucun |
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 |
Obligatoire ? | Facultatif |
Type | Entier |
Élément parent |
<CORS>
|
Éléments enfants | Aucun |
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 s'exécute, 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 :
ou |
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.
Propriété | 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 :
|
Requête de proxy |