Kontextabhängige Variablen zu Policys und HTTP-Backend-Definitionen hinzufügen
Erfahren Sie, wie Sie Parameter in API-Aufrufen mit API-Gateway-Kontextvariablen verwenden.
Aufrufe an APIs, die in einem API-Gateway bereitgestellt sind, umfassen in der Regel Parameter, die Sie bei der Definition der folgenden Elemente in API-Deployment-Spezifikationen verwenden sollten:
- Anforderungs-Policys und Antwort-Policys
- HTTP- und HTTPS-Backends
Damit Sie Parameter verwenden können, die in API-Aufrufen enthalten sind, speichert der API Gateway-Service die Werte der folgenden Parametertypen in temporären "Kontexttabellen":
- Pfadparameter, die Sie in der API-Deployment-Spezifikation definieren, werden in Datensätzen in der
request.path
-Tabelle gespeichert. Siehe Pfadparameter und Platzhalter zu Routenpfaden hinzufügen. - Abfrageparameter, die im Aufruf an die API enthalten sind, werden in Datensätzen in der
request.query
-Tabelle gespeichert. - Headerparameter, die im Aufruf an die API enthalten sind, werden in Datensätzen in der
request.headers
-Tabelle gespeichert. - Authentifizierungsparameter, die von einer Autorisiererfunktion zurückgegeben oder in einem JSON-Web-Token (JWT) enthalten sind, werden in Datensätzen in der Tabelle
request.auth
gespeichert. Siehe Token an Autorisiererfunktionen zum Hinzufügen von Authentifizierung und Autorisierung zu API-Deployments übergeben und Token zum Hinzufügen von Authentifizierung und Autorisierung zu API-Deployments validieren. - Zertifikatsparameter (eine Base64-codierte Version des Zertifikats, das von einem API-Client vorgelegt und während eines mTLS-Handshakes erfolgreich validiert wurde) werden in Datensätzen in der Tabelle
request.cert
gespeichert. Siehe mTLS-Support zu API-Deployments hinzufügen. - Der Name des Hosts, an den eine Anforderung gesendet wurde (aus dem Headerfeld
Host
in der Anforderung extrahiert) wird in der Tabellerequest.host
gespeichert. Siehe Authentifizierung und Autorisierung zu API-Deployments hinzufügen und API-Gateway-Backends basierend auf Anforderungselementen dynamisch auswählen. - Der führende Teil des Hostnamens, an den die ursprüngliche Anforderung gesendet wurde, wird in der Tabelle
request.subdomain
gespeichert. Siehe Mehrere Authentifizierungsserver zu demselben API-Deployment hinzufügen API-Gateway-Backends basierend auf Anforderungselementen dynamisch auswählen. - Die OCID eines Nutzungsplans, den der API-Client abonniert hat, wird in der Tabelle
request.usage_plan
gespeichert. Weitere Informationen finden Sie unter API-Gateway-Backends auf Basis von Anforderungselementen auswählen. - Der Hauptteil der Anforderung wird in der Tabelle
request.body
gespeichert (nur zur Verwendung durch Autorisiererfunktionen mit mehreren Argumenten). Siehe Funktion für Autorisierer mit mehreren Dokumenten erstellen (empfohlen).
Jeder Datensatz in einer Kontexttabelle wird durch einen eindeutigen Schlüssel identifiziert.
Beim Definieren von Anforderungs- und Antwort-Policys sowie von HTTP- und HTTPS-Backends können Sie den Wert eines Parameters in einer Kontexttabelle mit einer "kontextabhängigen Variablen" referenzieren. Eine kontextabhängige Variable hat das Format <context-table-name>[<key>]
. Dabei gilt:
<context-table-name>
ist eine der Optionenrequest.path
,request.query
,request.headers
,request.auth
,request.cert
oderrequest.host
<key>
ist eines der folgenden Elemente:- Ein Pfadparametername, der in der API-Deployment-Spezifikation definiert ist
- Ein Abfrageparametername, der in der Anforderung an die API enthalten ist
- Ein Headername, der in der Anforderung an die API enthalten ist
- Ein Authentifizierungsparametername, der von einer Autorisiererfunktion zurückgegeben wird oder in einem JWT-Token enthalten ist
- Der Name
[client_base64]
, der ein erfolgreich validiertes, Base64-codiertes Zertifikat darstellt, das von einem API-Client während eines mTLS-Handshakes präsentiert wird - den abschließenden Teil des zu ignorierenden Hostnamens (bei der Erfassung des führenden Teils des Hostnamens, an den die ursprüngliche Anforderung gesendet wurde)
- Name eines Hosts, an den die Anforderung gesendet wurde (aus dem Headerfeld
Host
in der Anforderung extrahiert)
Wenn die kontextabhängige Variable innerhalb einer Zeichenfolge in der API-Deployment-Spezifikation enthalten sein soll (z.B. in der URL-Eigenschaft einer HTTP-Backend-Definition), verwenden Sie das Format ${<context-table-name>[<key>]}
.
Beispiel: Die kontextabhängige Variable request.path[region]
im nachfolgenden Beispiel gibt den Wert des Datensatzes zurück, der durch den region
-Schlüssel in der request.path
-Kontexttabelle identifiziert wird.
{
"routes": [
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}"
}
}
]
}
Beachten Sie dabei Folgendes:
-
In der Kontexttabelle wird ein einzelner Datensatz für jeden diskreten Parameter in einer HTTP-Anforderung erstellt. Wenn die HTTP-Anforderung zwei (oder mehr) Parameter desselben Typs und mit demselben Namen enthält, wird der Wert jedes Parameters mit diesem Namen im selben Datensatz in der Kontexttabelle gespeichert und durch denselben Schlüssel identifiziert. Es kann jedoch anstelle einer kontextabhängigen Variablen nur der erste Wert im Kontexttabellendatensatz ersetzt werden. Wenn Sie eine kontextabhängige Variable hinzufügen, für die mehrere Werte im Kontexttabellendatensatz vorhanden sein können, und anstelle der kontextabhängigen Variablen der erste Wert im Kontexttabellendatensatz ersetzt werden soll, fügen Sie die kontextabhängige Variable der API-Deployment-Spezifikation im Format
${<context-table-name>[<key>]}
hinzu. - Wenn ein Parameterwert Sonderzeichen enthält, die codiert wurden, wird die Codierung beibehalten, wenn der Wert in der Kontexttabelle gespeichert wird. Wenn der Wert durch eine kontextabhängige Variable ersetzt wird, wird anstelle der kontextabhängigen Variablen der codierte Wert ersetzt. Beispiel: Wenn San José in einem Abfrageparameter als
San+José
enthalten ist, wird anstelle der kontextabhängigen Variablen die codierte Version durch diesen Abfrageparameter ersetzt. - Wenn in der angegebenen Kontexttabelle kein Schlüssel einer kontextabhängigen Variablen vorhanden ist, wird anstelle der kontextabhängigen Variablen eine leere Zeichenfolge ersetzt.
- Wenn der Schlüssel einer kontextabhängigen Variablen einen Punkt enthält, wird der Punkt als beliebiges anderes Zeichen behandelt. Er wird nicht als Indikator einer hierarchischen Beziehung zwischen den Zeichenfolgen auf beiden Seiten behandelt.
- Wenn ein Pfadparameter einen Platzhalter enthält (z.B.
generic_welcome*
), wird der Pfadparameter ohne Platzhalter als Schlüssel verwendet. -
Sie können eine Kontextvariable als Pfadsegment in die URL-Eigenschaft einer HTTP-Backend-Definition aufnehmen, jedoch nicht als Abfrageparameter. Beispiel:
-
Sie können die Kontextvariable
request.query[state]
als Pfadsegment in der URL-Eigenschaft verwenden, wie in der folgenden gültigen HTTP-Backend-Definition dargestellt:{ "path": "/weather/{region}", "methods": ["GET"], "backend": { "type": "HTTP_BACKEND", "url": "https://api.weather.gov/${request.path[region]}/${request.query[state]}" } }
-
Sie können die Kontextvariable
request.query[state]
nicht als Abfrageparameter in der URL-Eigenschaft verwenden, wie in der folgenden ungültigen HTTP-Backend-Definition dargestellt:{ "path": "/weather/{region}", "methods": ["GET"], "backend": { "type": "HTTP_BACKEND", "url": "https://api.weather.gov/${request.path[region]}?state=${request.query[state]}" } }
Wenn Sie eine Kontextvariable als Abfrageparameter übergeben möchten, verwenden Sie eine Abfrageparameter-Transformationsanforderungs-Policy, anstatt die Kontextvariable als Abfrageparameter in die URL-Eigenschaft aufzunehmen (siehe Abfrageparameter-Transformationsanforderungs-Policys hinzufügen).
-
Beispiele
In den Beispielen in diesem Abschnitt wird von der folgenden API-Deployment-Definition und grundlegenden API-Deployment-Spezifikation in einer JSON-Datei ausgegangen:
{
"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": {}
}
Beachten Sie, dass diese Beispiele auch gelten, wenn Sie eine API-Deployment-Spezifikation mit Dialogfeldern in der Konsole definieren.
Beispiel 1: Abfragepfadparameter in einer Definition
Sie können einen Pfadparameter in der API-Deployment-Spezifikation definieren und ihn dann an anderer Stelle in der API-Deployment-Spezifikation als Kontextvariable verwenden.
In diesem Beispiel wird der Pfadparameter region
erstellt und in der kontextabhängigen Variablen request.path[region]
in der HTTP-Backend-Definition verwendet.
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}"
}
}
In diesem Beispiel wird eine Anforderung wie https://<gateway-hostname>/marketing/weather/west
zu https://api.weather.gov/west
aufgelöst.
Beispiel 2: Unterschiedliche Typen von kontextabhängigen Variablen in derselben Definition
Sie können verschiedene Typen von kontextabhängigen Variablen in dieselbe Definition in der API-Deployment-Spezifikation aufnehmen.
In diesem Beispiel wird Folgendes in der HTTP-Backend-Definition verwendet:
- Die kontextabhängige Variable eines Pfadparameters,
request.path[region]
- Die kontextabhängige Variable eines Abfrageparameters,
request.query[state]
{
"path": "/weather/{region}",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov/${request.path[region]}/${request.query[state]}"
}
}
In diesem Beispiel wird eine Anforderung wie https://<gateway-hostname>/marketing/weather/west?state=california
zu https://api.weather.gov/west/california
aufgelöst.
Beispiel 3: Mehrere kontextvariablen desselben Typs in derselben Definition
Sie können Kontextvariablen desselben Typs mehrmals in dieselbe Definition aufnehmen.
In diesem Beispiel wird Folgendes in der HTTP-Backend-Definition verwendet:
- Die kontextabhängige Variable eines Pfadparameters,
request.path[region]
- Zwei kontextabhängige Variablen eines Abfrageparameters,
request.query[state]
undrequest.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]}"
}
}
In diesem Beispiel wird eine Anforderung wie https://<gateway-hostname>/marketing/weather/west?state=california&city=fremont
zu https://api.weather.gov/west/california/fremont
aufgelöst.
Beispiel 4: Mehrere Werte für denselben Parameter
Eine HTTP-Anforderung kann oftmals denselben Abfrageparameter mehrmals enthalten. Der API-Gateway-Service speichert den Wert jedes Parameters mit demselben Namen im selben Datensatz in der Kontexttabelle. In der API-Deployment-Spezifikation ist es jedoch normalerweise so, dass nur ein einzelner Wert durch eine kontextabhängige Variable ersetzt werden kann. In diesen Fällen können Sie angeben, dass anstelle einer kontextabhängigen Variablen nur der erste in der Kontexttabelle für einen Schlüssel erfasste Wert ersetzt werden soll, indem Sie die kontextabhängige Variable in ${...}
einschließen.
Beispiel: Eine gültige Anforderung wie "https://<gateway-hostname>/marketing/weather/west?state=california&city=fremont&city=belmont"
enthält zwei Vorkommen des Abfrageparameters city
. Bei Empfang der HTTP-Anforderung schreibt der API-Gateway-Service beide Werte des Abfrageparameters city
(fremont
und belmont
) in denselben Datensatz in der request.query
-Tabelle. Wenn die Definition eines HTTP-Backends ${request.query[city]}
enthält, wird anstelle der kontextabhängigen Variablen nur der erste Wert im Datensatz ersetzt.
In diesem Beispiel wird Folgendes in der HTTP-Backend-Definition verwendet:
- Die kontextabhängige Variable eines Pfadparameters,
request.path[region]
- Zwei kontextabhängige Variablen eines Abfrageparameters,
request.query[state]
undrequest.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]}"
}
}
In diesem Beispiel wird eine Anforderung wie https://<gateway-hostname>/marketing/weather/west?state=california&city=fremont&city=belmont
zu https://api.weather.gov/west/california/fremont
aufgelöst. Beachten Sie, dass nur fremont
(als erster Wert im request.query
-Kontexttabellendatensatz, der durch den city
-Schlüssel identifiziert wird) durch die kontextabhängige Variable request.query[city]
ersetzt wird.
Beispiel 5: Parameterwert enthält codierte Sonderzeichen
Wenn eine HTTP-Anforderung Sonderzeichen (z.B. das Zeichen é oder ein Leerzeichen) enthält, die codiert wurden, wird der Wert in seiner codierten Form in der Kontexttabelle gespeichert. Wenn der Wert aus der Kontexttabelle durch eine Kontextvariable ersetzt wird, wird die Codierung beibehalten.
In diesem Beispiel wird Folgendes in der HTTP-Backend-Definition verwendet:
- Die kontextabhängige Variable eines Pfadparameters,
request.path[region]
- Die kontextabhängige Variable eines Abfrageparameters,
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]}"
}
}
In diesem Beispiel wird eine Anforderung wie https://<gateway-hostname>/marketing/weather/west?city=San+José
zu https://api.weather.gov/west/california/San+José
aufgelöst.
Beispiel 6: Headerparameter in einer Definition
Sie können Werte, die in den Headern einer Anforderung übergeben werden, als kontextabhängige Variablen in eine Definition aufnehmen. Wenn die Anforderung einen Header enthält, wird der Wert des Headers in der request.headers
-Tabelle gespeichert, und der Name des Headers wird als Schlüssel verwendet.
In diesem Beispiel wird Folgendes in der HTTP-Backend-Definition verwendet:
- Die kontextabhängige Variable eines Pfadparameters,
request.path[region]
- Die kontextabhängige Variable eines Headerparameters,
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]}"
}
}
In diesem Beispiel enthielt eine Anforderung wie https://<gateway-hostname>/marketing/weather/west
einen X-Api-Key
-Header mit dem Wert abc123def456fhi789
. Die Anforderung wird zu https://api.weather.gov/west/abc123def456fhi789
aufgelöst.
Beispiel 7: Authentifizierungsparameter in einer Definition
Sie können Werte, die von einer Autorisiererfunktion zurückgegeben werden oder in einem JWT-Token enthalten sind, als kontextabhängige Variablen in eine Definition aufnehmen:
- Eine Autorisiererfunktion validiert das Token, das ein API-Client beim Aufrufen des API Gateway-Service übergeben hat. Die Autorisiererfunktion gibt eine Antwort zurück, die Informationen wie die Gültigkeit der Autorisierung, Informationen zum Endbenutzer, Zugriffsgeltungsbereich und eine Reihe von Claims in Schlüssel/Wert-Paaren enthält. Je nach Autorisierungstoken können die Informationen im Token enthalten sein, oder die Autorisiererfunktion ruft Endpunkte auf, die vom Autorisierungsserver zur Validierung des Tokens und zum Abrufen von Informationen zum Endbenutzer bereitgestellt werden. Wenn der API Gateway-Service ein Schlüssel/Wert-Paar von der Autorisiererfunktion empfängt, wird das Schlüssel/Wert-Paar in der Tabelle
request.auth
als Authentifizierungsparameter gespeichert. - Ein JWT-Token kann optional einen benutzerdefinierten Claim namens
scope
enthalten, der aus einem Schlüssel/Wert-Paar besteht. Nach der Validierung des JWT-Tokens speichert der API Gateway-Service das Schlüssel-Wert-Paket als Authentifizierungsparameter in der Tabellerequest.auth
.Im Fall des OpenID Connect-Autorisierungsflusses werden zwei Token mit dem Namen
id_token
(immer JWT-codiert) undaccess_token
(kann JWT-codiert sein) zurückgegeben. Der API Gateway-Service speichert die Tokenwerte in den Kontextvariablenrequest.auth[id_token]
undrequest.auth[access_token]
sowie benutzerdefinierte Claims in den Kontextvariablenrequest.auth[id_token_claims][<claim-name>]
bzw.request.auth[access_token_claims][<claim-name>]
.
In diesem Beispiel wird das Schlüssel/Wert-Paar verwendet, das von einer Autorisiererfunktion als Kontextvariable request.auth[region]
des Authentifizierungsparameters in der HTTP-Backend-Definition zurückgegeben wird.
{
"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" ]
}
}
}
]
}
Angenommen, die Autorisiererfunktion ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq
validiert das Token, das ein API-Client in einem Aufruf an den API Gateway-Service übergeben hat. Die Autorisiererfunktion gibt eine Antwort an den API Gateway-Service zurück, die die mit dem Endbenutzer verknüpfte Region als Schlüssel/Wert-Paar und den Zugriffsgeltungsbereich des authentifizierten Endbenutzers enthält. Wenn der API Gateway-Service das Schlüssel/Wert-Paar empfängt, wird das Schlüssel/Wert-Paar in der Tabelle request.auth
als Authentifizierungsparameter gespeichert.
In diesem Beispiel wird eine Anforderung wie https://<gateway-hostname>/marketing/weather
von einem Endbenutzer namens "jdoe" mit einem API-Client gesendet. Die Autorisiererfunktion validiert das Token, das der API-Client in der Anforderung übergeben hat, und bestimmt auch, dass der Benutzer "jdoe" den Zugriffsgeltungsbereich "weatherwatcher"
hat. Die Autorisiererfunktion identifiziert, dass der Benutzer "jdoe" mit der Region "west" verknüpft ist. Die Autorisiererfunktion gibt den Zugriffsgeltungsbereich des Benutzers "jdoe" an den API Gateway-Service zurück. Außerdem gibt sie die dem Benutzer "jdoe" zugeordnete Region zurück. Der API Gateway-Service speichert die dem Benutzer "jdoe" zugeordnete Region als Authentifizierungsparameter. Die HTTP-Backend-Definition gibt an, dass Endbenutzer mit dem Zugriffsgeltungsbereich "weatherwatcher"
auf das HTTP-Backend zugreifen dürfen. Der API Gateway-Service verwendet den Wert der Kontextvariablen request.auth[region]
des Authentifizierungsparameters in der Anforderung. Die Anforderung wird zu https://api.weather.gov/west
aufgelöst.
Beispiel 8: TLS-Zertifikatsparameter in einer Definition
Sie können eine Base64-codierte Version des TLS-Zertifikats aufnehmen, die von einem API-Client während eines mTLS-Handshakes als Kontextvariable in einer Definition dargestellt wird. Die Base64-codierte Version des TLS-Zertifikats wird in der Tabelle request.cert
gespeichert, wobei der Name client_base64
als Schlüssel verwendet wird. Siehe mTLS-Support zu API-Deployments hinzufügen.
In diesem Beispiel wird Folgendes in der HTTP-Backend-Definition verwendet:
- die Zertifikatskontextvariable,
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]}"]
}
]
}
}
}
}
]
}
In diesem Beispiel wird der Anforderung ein Header mit dem Namen certificate-header
hinzugefügt, und der Wert der Base64-codierten Version des TLS-Zertifikats wird vom API-Client beim mTLS-Handshake mit dem API-Gateway angezeigt.