Ajout de variables de contexte aux stratégies et aux définitions de back-end HTTP
Découvrez comment utiliser les paramètres dans les appels d'API à l'aide des variables de contexte API Gateway.
Les appels aux API déployées sur une passerelle d'API incluent généralement les paramètres à utiliser lors de la définition des éléments suivants dans les spécifications de déploiement d'API :
- stratégies de demande et de réponse,
- back-ends HTTP et HTTPS.
Pour vous permettre d'utiliser les paramètres inclus dans les appels d'API, le service API Gateway enregistre les valeurs des types de paramètre suivants dans des tables de contexte temporaires :
- Les paramètres de chemin définis dans la spécification de déploiement d'API sont enregistrés dans les enregistrements de la table
request.path
. Reportez-vous à Adding Path Parameters and Wildcards to Route Paths. - Les paramètres de requête inclus dans l'appel vers l'API sont enregistrés dans les enregistrements de la table
request.query
. - Les paramètres d'en-tête inclus dans l'appel vers l'API sont enregistrés dans les enregistrements de la table
request.headers
. - Les paramètres d'authentification renvoyés par une fonction d'autorisation ou contenus dans un jeton Web JSON (JWT) sont enregistrés dans les enregistrements de la table
request.auth
. Reportez-vous à Transmission de jetons aux fonctions d'autorisation pour ajouter l'authentification et l'autorisation aux déploiements d'API et à Validation de jetons pour ajouter l'authentification et l'autorisation aux déploiements d'API, respectivement. - Les paramètres de certificat (version codée en Base64 du certificat présenté par un client d'API et validé lors d'une procédure d'établissement de liaison mTLS) sont enregistrés dans les enregistrements de la table
request.cert
. Reportez-vous à Ajout de la prise en charge de mTLS aux déploiements d'API. - Le nom de l'hôte auquel une demande a été envoyée (extrait du champ d'en-tête
Host
de la demande) est enregistré dans la tablerequest.host
. Reportez-vous à Ajout de l'authentification et de l'autorisation aux déploiements d'API et à Sélection dynamique des back-ends de passerelle d'API en fonction des éléments de demande. - La partie principale du nom d'hôte auquel la demande d'origine a été envoyée est enregistrée dans la table
request.subdomain
. Reportez-vous à Ajout de plusieurs serveurs d'authentification au même déploiement d'API Sélection dynamique de back-ends de passerelle d'API en fonction d'é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
. Reportez-vous à Sélection dynamique de back-ends de passerelle d'API sur des éléments de demande. - Le corps de la demande est enregistré dans la table
request.body
(uniquement pour une utilisation par des fonctions d'autorisation à arguments multiples). Reportez-vous à Création d'une fonction d'autorisation à plusieurs arguments (recommandé).
Chaque enregistrement dans une table de contexte est identifié par une clé unique.
Lors de la définition des stratégies de demande et de réponse ainsi que des back-ends 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 se présente au format <context-table-name>[<key>]
, où :
<context-table-name>
est l'un des éléments suivants :request.path
,request.query
,request.headers
,request.auth
,request.cert
ourequest.host
<key>
correspond à l'une des valeurs suivantes :- un nom de paramètre de chemin défini dans la spécification de déploiement d'API,
- un nom de paramètre de requête inclus dans la demande adressée à l'API,
- un nom d'en-tête inclus dans la demande adressée à l'API.
- un nom de paramètre d'authentification renvoyé par une fonction d'autorisation ou contenu dans un jeton JWT
- le nom
[client_base64]
, représentant un certificat validé, encodé Base64, présenté par un client d'API lors d'une liaison mTLS - la dernière partie du nom d'hôte à ignorer (lors de la capture de la première partie du nom d'hôte à laquelle la demande d'origine 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é url d'une définition de back-end HTTP), utilisez le format ${<context-table-name>[<key>]}
.
Par exemple, la variable de contexte request.path[region]
dans l'exemple ci-dessous renvoie la valeur de l'enregistrement identifié par la clé region
dans la table de contexte request.path
.
{
"routes": [
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}"
}
}
]
}
Tenez compte des points suivants :
-
Un seul enregistrement est créé dans la table de contexte pour chaque paramètre discret d'une demande HTTP. Si la demande HTTP inclut deux paramètres (ou plus) du même type et portant 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é. Toutefois, seule la première valeur de l'enregistrement de la table de contexte peut servir à remplacer une variable de contexte. Lorsque vous ajoutez une variable de contexte pour laquelle plusieurs valeurs peuvent exister dans l'enregistrement de table de contexte et que vous voulez utiliser 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 remplace une variable de contexte, la valeur encodée est utilisée à la place de la variable de contexte. Par exemple, si San José est inclus dans un paramètre de requête sous la forme
San+José
, la version encodée est la valeur qui remplacera la variable de contexte pour ce paramètre de requête. - Si la table de contexte indiquée ne contient aucune variable de contexte, cette dernière est remplacée par une chaîne vide.
- Si une clé de variable de contexte contient un point, celui-ci est traité comme n'importe quel autre caractère. Il n'est pas traité comme un indicateur d'une relation parent-enfant entre l'une ou l'autre des parties de la chaîne.
- Si un paramètre de chemin inclut un caractère générique (par exemple,
generic_welcome*
), le paramètre de chemin sans caractère générique est utilisé en guise de clé. -
Vous pouvez inclure une variable de contexte en tant que segment de chemin dans la propriété d'URL d'une définition de back-end HTTP, mais pas en tant que paramètre de requête. Par exemple :
-
Vous pouvez utiliser la variable de contexte
request.query[state]
comme segment de chemin dans la propriété d'URL, comme indiqué dans la définition de back-end 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]
comme paramètre de requête dans la propriété d'URL, comme indiqué dans la définition de back-end 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 de requête, utilisez une stratégie de demande de transformation de paramètre de requête plutôt que d'inclure la variable de contexte en tant que paramètre de requête dans la propriété d'URL (reportez-vous à Ajout de stratégies de demande de transformation de paramètre de requête).
-
Exemples
Les exemples de cette section utilisent 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": {}
}
Ces exemples s'appliquent 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 de requête 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 celle-ci 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]
dans la définition du back-end 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 en 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 au sein de la spécification de déploiement d'API.
Cet exemple utilise les éléments suivants dans la définition du back-end HTTP :
- une variable de contexte de paramètre de chemin :
request.path[region]
, - une variable de contexte de paramètre de requête :
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 en 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 éléments suivants dans la définition du back-end HTTP :
- une variable de contexte de paramètre de chemin :
request.path[region]
, - deux variables de contexte de paramètre de requête :
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 en https://api.weather.gov/west/california/fremont
.
Exemple 4 : plusieurs valeurs pour le même paramètre
Une demande HTTP peut souvent inclure plusieurs fois le même paramètre de requête. Le service API Gateway enregistre la valeur de chaque paramètre portant le même nom dans le même enregistrement de la table de contexte. Toutefois, la spécification de déploiement d'API est un cas habituel où une seule valeur peut servir à remplacer une variable de contexte. Dans ce type de situation, vous pouvez indiquer que seule la première valeur enregistrée dans la table de contexte d'une clé doit servir à remplacer la variable de contexte en plaçant la variable de contexte entre accolades ${...}
.
Par exemple, une demande valide telle que "https://<gateway-hostname>/marketing/weather/west?state=california&city=fremont&city=belmont"
compte deux occurrences du paramètre de requête city
. Lors de la réception de la demande HTTP, le service API Gateway écrit les deux valeurs du paramètre de requête city
(fremont
et belmont
) dans le même enregistrement de la table request.query
. Lorsque la définition d'un backend HTTP inclut ${request.query[city]}
, seule la première valeur de l'enregistrement remplacera la variable de contexte.
Cet exemple utilise les éléments suivants dans la définition du back-end HTTP :
- une variable de contexte de paramètre de chemin :
request.path[region]
, - deux variables de contexte de paramètre de requête :
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 est https://api.weather.gov/west/california/fremont
. Seule la valeur fremont
(en tant que première valeur de l'enregistrement de la table de contexte request.query
identifié par la clé city
) remplace la variable de contexte request.query[city]
.
Exemple 5 :valeur de paramètre comprenant des caractères spéciaux encodés
Si une demande HTTP inclut des caractères spéciaux (par exemple, le caractère é ou l'espace) qui ont été encodés, la valeur est stockée dans la table de contexte sous sa forme encodée. Lorsque la valeur de la table de contexte remplace une variable de contexte, le codage est conservé.
Cet exemple utilise les éléments suivants dans la définition du back-end HTTP :
- une variable de contexte de paramètre de chemin :
request.path[region]
, - une variable de contexte de paramètre de requête :
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 en https://api.weather.gov/west/california/San+José
.
Exemple 6 : paramètres d'en-tête dans une définition
Vous pouvez inclure les valeurs transmises dans les en-têtes d'une demande en tant que variables de contexte dans une définition. Si la demande inclut un en-tête, la valeur de cet 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 éléments suivants dans la définition du back-end 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 en https://api.weather.gov/west/abc123def456fhi789
.
Exemple 7 : paramètres d'authentification dans une définition
Vous pouvez inclure des valeurs renvoyées par une fonction d'autorisation ou contenues dans un jeton 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 API Gateway. La fonction d'autorisation renvoie une réponse qui inclut des informations telles que la validité de l'autorisation, des informations sur l'utilisateur final, la portée d'accès et un certain nombre de demandes dans des paires clé-valeur. Selon le jeton d'autorisation, les informations peuvent être contenues dans le jeton, ou la fonction d'autorisation peut appeler les adresses fournies par le serveur d'autorisation pour valider le jeton et extraire les informations relatives à l'utilisateur final. Lorsque le service API Gateway reçoit une paire clé-valeur de la fonction d'autorisation, il enregistre cette paire dans la table
request.auth
en tant que paramètre d'authentification. - Un jeton JWT peut éventuellement inclure une demande personnalisée nommée
scope
, qui se compose d'une paire clé-valeur. Une fois le jeton JWT validé, le service API Gateway 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 encodés par JWT) etaccess_token
(peut être encodés par JWT) sont renvoyés. Le service API Gateway enregistre les valeurs de jeton dans les variables de contexterequest.auth[id_token]
etrequest.auth[access_token]
, ainsi que les demandes personnalisées dans les variables de contexterequest.auth[id_token_claims][<claim-name>]
etrequest.auth[access_token_claims][<claim-name>]
, respectivement.
Cet exemple utilise la paire clé-valeur renvoyée par une fonction d'autorisation en tant que variable de contexte de paramètre d'authentification request.auth[region]
dans la définition de back-end 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 API Gateway. La fonction d'autorisation renvoie une réponse au service API Gateway qui inclut la région associée à l'utilisateur final en tant que paire clé-valeur, ainsi que la portée d'accès de l'utilisateur final authentifié. Lorsque le service API Gateway reçoit la paire valeur-clé, il l'enregistre 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 possède la portée d'accès "weatherwatcher"
. La fonction d'autorisation identifie que jdoe est associé à la région west. La fonction d'autorisation renvoie la portée d'accès de jdoe au service API Gateway, ainsi que la région associée à jdoe. Le service API Gateway enregistre la région associée à jdoe en tant que paramètre d'authentification. La définition de back-end HTTP indique que les utilisateurs finals disposant de la portée d'accès "weatherwatcher"
sont autorisés à accéder au back-end HTTP. Le service API Gateway utilise la valeur de la variable de contexte de paramètre d'authentification request.auth[region]
dans la demande. La demande est résolue en https://api.weather.gov/west
.
Exemple 8 : paramètre de certificat TLS dans une définition
Vous pouvez inclure une version codée en Base64 du certificat TLS présenté par un client d'API lors d'un établissement de liaison mTLS en tant que variable de contexte dans une définition. La version codée en Base64 du certificat TLS est stockée dans la table request.cert
, avec le nom client_base64
utilisé comme clé. Reportez-vous à Ajout de la prise en charge de mTLS aux déploiements d'API.
Cet exemple utilise les éléments suivants dans la définition du back-end 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, en fonction de la valeur de la version codée Base64 du certificat TLS présentée par le client d'API lors de l'établissement de liaison mTLS avec la passerelle d'API.