Ajout de variables de contexte aux politiques et aux définitions d'élément dorsal HTTP
Découvrez comment utiliser des paramètres dans les appels d'API à l'aide des variables de contexte du service de passerelle d'API.
Les appels aux API déployées sur une passerelle d'API comprennent généralement les paramètres que vous voulez utiliser lors de la définition des spécifications de déploiement d'API suivantes :
- Politiques de demande et de réponse
- Éléments dorsaux HTTP et HTTPS
Pour vous permettre d'utiliser les paramètres inclus dans les appels d'API, le service de passerelle d'API enregistre les valeurs des types de paramètre suivants dans des 'tables de contexte' temporaires :
- Les paramètres de chemin que vous définissez dans la spécification de déploiement d'API sont enregistrés dans la table
request.path
. Voir Ajout de paramètres de chemin et de caractères génériques aux chemins de routage. - Les paramètres d'interrogation inclus dans l'appel à l'API sont enregistrés dans la table
request.query
. - Les paramètres d'en-tête inclus dans l'appel à l'API sont enregistrés dans la table
request.headers
. - Les paramètres d'authentification retournés par une fonction d'autorisation ou contenus dans un jeton Web JSON (JWT) sont enregistrés dans la table
request.auth
. Voir Passing Tokens to Authorizer Functions to Add Authentication and Authorization to API Deployments et Validating Tokens to Add Authentication and Authorization to API Deployments respectivement. - Les paramètres de certificat (une version encodée en Base64 du certificat présenté par un client d'API et validée lors d'une liaison mTLS) sont enregistrés dans la table
request.cert
. Voir Ajout de la prise en charge de mTLS aux déploiements d'API. - Le nom de l'hôte vers lequel une demande a été envoyée (extrait du champ d'en-tête
Host
de la demande) est enregistré dans la tablerequest.host
. Voir Ajout de l'authentification et de l'autorisation aux déploiements d'API et Sélection dynamique des éléments dorsaux du service de passerelle d'API en fonction des éléments de demande. - La partie principale du nom d'hôte vers lequel la demande initiale a été envoyée est enregistrée dans la table
request.subdomain
. Voir Ajout de plusieurs serveurs d'authentification au même déploiement d'API Sélection dynamique des éléments dorsaux du service de passerelle d'API en fonction des éléments de demande. - L'OCID d'un plan d'utilisation auquel le client d'API est abonné est enregistré dans la table
request.usage_plan
. Voir Sélection dynamique des éléments dorsaux de la passerelle d'API en fonction des éléments de demande. - Le corps de la demande est enregistré dans la table
request.body
(seulement pour les fonctions d'autorisation à plusieurs arguments). Voir Création d'une fonction d'autorisation sous plusieurs arguments (recommandée).
Chaque enregistrement dans une table de contexte est identifié par une clé unique.
Lorsque vous définissez des politiques de demande et de réponse ainsi que des éléments dorsaux HTTP et HTTPS, vous pouvez référencer la valeur d'un paramètre dans une table de contexte à l'aide d'une 'variable de contexte'. Une variable de contexte a le format <context-table-name>[<key>]
où :
<context-table-name>
est l'un des suivants :request.path
,request.query
,request.headers
,request.auth
,request.cert
ourequest.host
<key>
est l'un des éléments suivants :- Un nom de paramètre de chemin défini dans la spécification de déploiement d'API
- Un nom de paramètre d'interrogation inclus dans la demande à l'API
- Un nom d'en-tête inclus dans la demande à l'API
- un nom de paramètre d'authentification retourné par une fonction d'autorisation ou contenu dans un jeton Web JSON (JWT)
- le nom
[client_base64]
, représentant un certificat validé, encodé en Base64, présenté par un client d'API lors d'une liaison mTLS - la partie de fin du nom d'hôte à ignorer (lors de la capture de la partie principale du nom d'hôte à laquelle la demande initiale a été envoyée)
- le nom d'un hôte auquel la demande a été envoyée (extrait du champ d'en-tête
Host
dans la demande)
Pour inclure la variable de contexte dans une chaîne de la spécification de déploiement d'API (par exemple, dans la propriété d'URL d'une définition d'élément dorsal HTTP), utilisez le format ${<context-table-name>[<key>]}
.
Par exemple, la variable de contexte request.path[region]
de l'exemple ci-dessous retourne la valeur de l'enregistrement identifié par la clé region
de la table de contexte request.path
.
{
"routes": [
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}"
}
}
]
}
Notez ce qui suit :
-
Un seul enregistrement est créé dans la table de contexte pour chaque paramètre discret d'une demande HTTP. Si la demande HTTP comprend deux paramètres (ou plus) du même type et avec le même nom, la valeur de chaque paramètre ayant ce nom est enregistrée dans le même enregistrement de la table de contexte et est identifiée par la même clé. Cependant, seule la première valeur de l'enregistrement de table de contexte peut être remplacée à la place d'une variable de contexte. Lors de l'ajout d'une variable de contexte pour laquelle plusieurs valeurs peuvent exister dans l'enregistrement de la table de contexte et que vous voulez remplacer la première valeur de l'enregistrement de la table de contexte à la place de la variable de contexte, ajoutez la variable de contexte à la spécification de déploiement d'API au format
${<context-table-name>[<key>]}
. - Si une valeur de paramètre inclut des caractères spéciaux qui ont été encodés, l'encodage est conservé lorsque la valeur est enregistrée dans la table de contexte. Lorsque la valeur est remplacée pour une variable de contexte, la valeur encodée est remplacée à la place de la variable de contexte. Par exemple, si San José est inclus dans un paramètre d'interrogation comme
San+José
, la version encodée est la valeur qui sera remplacée à la place de la variable de contexte pour ce paramètre d'interrogation. - Si une clé de variable de contexte n'existe pas dans la table de contexte indiquée, une chaîne vide est remplacée à la place de la variable de contexte.
- Si une clé de variable de contexte contient un point, le point est traité comme tout autre caractère. Il n'est pas traité comme l'indicateur d'une relation parent-enfant entre les chaînes de chaque côté du point.
- Si un paramètre de chemin inclut un caractère générique (par exemple,
generic_welcome*
), le paramètre de chemin sans le caractère générique est utilisé comme clé. -
Vous pouvez inclure une variable de contexte en tant que segment de chemin dans la propriété URL d'une définition d'élément dorsal HTTP, mais pas en tant que paramètre d'interrogation. Par exemple :
-
Vous pouvez utiliser la variable de contexte
request.query[state]
en tant que segment de chemin dans la propriété URL, comme dans la définition d'élément dorsal HTTP valide suivante :{ "path": "/weather/{region}", "methods": ["GET"], "backend": { "type": "HTTP_BACKEND", "url": "https://api.weather.gov/${request.path[region]}/${request.query[state]}" } }
-
Vous ne pouvez pas utiliser la variable de contexte
request.query[state]
en tant que paramètre d'interrogation dans la propriété URL, comme dans la définition d'élément dorsal HTTP non valide suivante :{ "path": "/weather/{region}", "methods": ["GET"], "backend": { "type": "HTTP_BACKEND", "url": "https://api.weather.gov/${request.path[region]}?state=${request.query[state]}" } }
Si vous voulez transmettre une variable de contexte en tant que paramètre d'interrogation, utilisez une politique de demande de transformation de paramètre d'interrogation plutôt que d'inclure la variable de contexte en tant que paramètre d'interrogation dans la propriété d'URL (voir Ajout de politiques de demande de transformation de paramètre d'interrogation).
-
Exemples
Les exemples de cette section supposent la définition de déploiement d'API et la spécification de déploiement d'API de base suivantes dans un fichier JSON :
{
"displayName": "Marketing Deployment",
"gatewayId": "ocid1.apigateway.oc1..aaaaaaaab______hga",
"compartmentId": "ocid1.compartment.oc1..aaaaaaaa7______ysq",
"pathPrefix": "/marketing",
"specification": {
"routes": [
{
"path": "/weather",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov"
}
}
]
},
"freeformTags": {},
"definedTags": {}
}
Notez que ces exemples s'appliquent également lorsque vous définissez une spécification de déploiement d'API à l'aide des boîtes de dialogue de la console.
Exemple 1 : Paramètre de chemin d'interrogation dans une définition
Vous pouvez définir un paramètre de chemin dans la spécification de déploiement d'API, puis l'utiliser ailleurs dans la spécification de déploiement d'API en tant que variable de contexte.
Cet exemple crée un paramètre de chemin, region
, et l'utilise dans une variable de contexte request.path[region]
de la définition d'élément dorsal HTTP.
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}"
}
}
Dans cet exemple, une demande telle que https://<gateway-hostname>/marketing/weather/west
est résolue à https://api.weather.gov/west
.
Exemple 2 : Différents types de variable de contexte dans la même définition
Vous pouvez inclure différents types de variable de contexte dans la même définition de la spécification de déploiement d'API.
Cet exemple utilise les variables suivantes dans la définition d'élément dorsal HTTP :
- Une variable de contexte de paramètre de chemin,
request.path[region]
- Une variable de contexte de paramètre d'interrogation,
request.query[state]
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}/${request.query[state]}"
}
}
Dans cet exemple, une demande telle que https://<gateway-hostname>/marketing/weather/west?state=california
est résolue à https://api.weather.gov/west/california
.
Exemple 3 : Plusieurs variables de contexte du même type dans la même définition
Vous pouvez inclure le même type de variable de contexte plusieurs fois dans la même définition.
Cet exemple utilise les variables suivantes dans la définition d'élément dorsal HTTP :
- Une variable de contexte de paramètre de chemin,
request.path[region]
- Deux variables de contexte de paramètre d'interrogation,
request.query[state]
etrequest.query[city]
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}/${request.query[state]}/${request.query[city]}"
}
}
Dans cet exemple, une demande telle que https://<gateway-hostname>/marketing/weather/west?state=california&city=fremont
est résolue à https://api.weather.gov/west/california/fremont
.
Exemple 4 : Plusieurs valeurs pour le même paramètre
L'inclusion du même paramètre d'interrogation plusieurs fois dans une demande HTTP est souvent valide. Le service Passerelle d'API enregistre la valeur de chaque paramètre ayant le même nom dans le même enregistrement de la table de contexte. Cependant, dans la spécification de déploiement d'API, la plupart du temps une seule valeur peut être remplacée pour une variable de contexte. Dans ces situations, vous pouvez indiquer que seule la première valeur enregistrée dans la table de contextes pour une clé est remplacée à la place d'une variable de contexte en l'incluant entre ${...}
.
Par exemple, une demande valide telle que "https://<gateway-hostname>/marketing/weather/west?state=california&city=fremont&city=belmont"
comporte deux occurrences du paramètre d'interrogation city
. Lors de la réception de la demande HTTP, le service Passerelle d'API écrit les deux valeurs du paramètre d'interrogation city
(fremont
et belmont
) dans le même enregistrement de la table request.query
. Lorsque la définition d'un élément dorsal HTTP inclut ${request.query[city]}
, seule la première valeur de l'enregistrement est remplacée à la place de la variable de contexte.
Cet exemple utilise les variables suivantes dans la définition d'élément dorsal HTTP :
- Une variable de contexte de paramètre de chemin,
request.path[region]
- Deux variables de contexte de paramètre d'interrogation,
request.query[state]
etrequest.query[city]
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}/${request.query[state]}/${request.query[city]}"
}
}
Dans cet exemple, une demande telle que https://<gateway-hostname>/marketing/weather/west?state=california&city=fremont&city=belmont
est résolue à https://api.weather.gov/west/california/fremont
. Notez que seule la valeur fremont
(comme première valeur dans l'enregistrement de la table de contexte request.query
identifiée par la clé city
) est remplacée pour la variable de contexte request.query[city]
.
Exemple 5 : Valeur du paramètre incluant des caractères spéciaux encodés
Si une demande HTTP comprend des caractères spéciaux (par exemple, le caractère é, le caractère d'espacement) qui ont été encodés, la valeur est stockée dans la table de contexte sous sa forme encodée. Lors du remplacement de la valeur provenant de la table de contexte pour une variable de contexte, l'encodage est conservé.
Cet exemple utilise les variables suivantes dans la définition d'élément dorsal HTTP :
- Une variable de contexte de paramètre de chemin,
request.path[region]
- Une variable de contexte de paramètre d'interrogation,
request.query[city]
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}/${request.query[state]}/${request.query[city]}"
}
}
Dans cet exemple, une demande telle que https://<gateway-hostname>/marketing/weather/west?city=San+José
est résolue à https://api.weather.gov/west/california/San+José
.
Exemple 6 : Paramètres d'en-tête dans une définition
Vous pouvez inclure des valeurs transmises dans les en-têtes d'une demande en tant que variables de contexte dans une définition. Si la demande comprend un en-tête, la valeur de l'en-tête est stockée dans la table request.headers
et le nom de l'en-tête est utilisé comme clé.
Cet exemple utilise les variables suivantes dans la définition d'élément dorsal HTTP :
- Une variable de contexte de paramètre de chemin,
request.path[region]
- Une variable de contexte de paramètre d'en-tête,
request.headers[X-Api-Key]
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}/${request.headers[X-Api-Key]}"
}
}
Dans cet exemple, une demande telle que https://<gateway-hostname>/marketing/weather/west
inclut un en-tête X-Api-Key
avec la valeur abc123def456fhi789
. La demande est résolue à https://api.weather.gov/west/abc123def456fhi789
.
Exemple 7 : Paramètres d'authentification dans une définition
Vous pouvez inclure les valeurs retournées par une fonction d'autorisation ou contenues dans un jeton Web JSON (JWT) en tant que variables de contexte dans une définition :
- Une fonction d'autorisation valide le jeton transmis par un client d'API lors de l'appel du service Passerelle d'API. La fonction d'autorisation retourne une réponse comprenant des informations telles que la validité de l'autorisation, des informations sur l'utilisateur final, l'étendue d'accès et un certain nombre de revendications en paires clé-valeur. Selon le jeton d'autorisation, les informations peuvent être contenues dans le jeton, ou la fonction d'autorisation peut appeler les points d'extrémité fournis par le serveur d'autorisation pour valider le jeton et extraire des informations sur l'utilisateur final. Lorsque le service de passerelle d'API reçoit une paire clé-valeur de la fonction d'autorisation, il enregistre la paire clé-valeur dans la table
request.auth
en tant que paramètre d'authentification. - Un jeton Web JSON (JWT) peut éventuellement inclure une revendication personnalisée nommée
scope
, composée d'une paire clé-valeur. Une fois le jeton JWT validé, le service de passerelle d'API enregistre la paire clé-valeur dans la tablerequest.auth
en tant que paramètre d'authentification.Dans le cas du flux d'autorisation OpenID Connect, deux jetons nommés
id_token
(toujours codés JWT) etaccess_token
(peuvent être codés JWT) sont retournés. Le service de passerelle d'API enregistre les valeurs de jeton dans les variables de contexterequest.auth[id_token]
etrequest.auth[access_token]
, ainsi que les revendications personnalisées dans les variables de contexterequest.auth[id_token_claims][<claim-name>]
etrequest.auth[access_token_claims][<claim-name>]
, respectivement.
Dans cet exemple, la paire clé-valeur retournée par une fonction d'autorisation est utilisée en tant que variable de contexte du paramètre d'authentification request.auth[region]
dans la définition d'élément dorsal HTTP.
{
"requestPolicies": {
"authentication": {
"type": "CUSTOM_AUTHENTICATION",
"isAnonymousAccessAllowed": false,
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq",
"tokenHeader": "Authorization"
}
},
"routes": [
{
"path": "/weather",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.auth[region]}"
},
"requestPolicies": {
"authorization": {
"type": "ANY_OF",
"allowedScope": [ "weatherwatcher" ]
}
}
}
]
}
Supposons qu'une fonction d'autorisation ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq
valide le jeton transmis par un client d'API dans un appel au service Passerelle d'API. La fonction d'autorisation retourne une réponse au service Passerelle d'API qui inclut la région associée à l'utilisateur final en tant que paire clé-valeur ainsi que l'étendue d'accès de l'utilisateur final authentifié. Lorsque le service de passerelle d'API reçoit la paire clé- valeur, il l'économise dans la table request.auth
en tant que paramètre d'authentification.
Dans cet exemple, une demande comme https://<gateway-hostname>/marketing/weather
est effectuée par l'utilisateur final jdoe à l'aide d'un client d'API. La fonction d'autorisation valide le jeton transmis par le client d'API dans la demande, et détermine également que jdoe dispose de l'étendue d'accès "weatherwatcher"
. La fonction d'autorisation détermine que jdoe est associée à la région west. La fonction d'autorisation retourne l'étendue d'accès de jdoe au service de passerelle d'API, ainsi que la région associée à jdoe. Le service de passerelle d'API enregistre la région associée à jdoe en tant que paramètre d'authentification. La définition d'élément dorsal HTTP spécifie que les utilisateurs finaux ayant l'étendue d'accès "weatherwatcher"
ont accès à l'élément dorsal HTTP. Le service de passerelle d'API utilise la valeur de la variable de contexte du paramètre d'authentification request.auth[region]
dans la demande. La demande est résolue à https://api.weather.gov/west
.
Exemple 8 : Paramètre de certificat TLS dans une définition
Vous pouvez inclure une version encodée en Base64 du certificat TLS présenté par un client d'API lors de l'établissement d'une liaison mTLS en tant que variable de contexte dans une définition. La version encodée en Base64 du certificat TLS est stockée dans la table request.cert
, avec le nom client_base64
utilisé comme clé. Voir Ajout de la prise en charge de mTLS aux déploiements d'API.
Cet exemple utilise les variables suivantes dans la définition d'élément dorsal HTTP :
- la variable de contexte de certificat,
request.cert[client_base64]
{
"requestPolicies": {
"mutualTls":{
"isVerifiedCertificateRequired": true,
"allowedSans": ["api.weather.com"]
}
},
"routes": [
{
"path": "/weather",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov"
},
"requestPolicies": {
"headerTransformations": {
"setHeaders": {
"items":[
{
"name": "certificate-header",
"values": ["${request.cert[client_base64]}"]
}
]
}
}
}
}
]
}
Dans cet exemple, un en-tête nommé certificate-header
est ajouté à la demande et indique la valeur de la version encodée par Base64 du certificat TLS présentée par le client d'API lors de l'établissement d'une liaison mTLS avec la passerelle d'API.