Comprendre la modélisation de chemin d'accès
Dans API Gateway, il est possible d'acheminer les requêtes entrantes en fonction de la modélisation de chemin d'accès. La modélisation de chemin d'accès comporte trois composants principaux :
- Correspondance exacte
- Correspondance avec un seul caractère générique
- Correspondance de caractères génériques doubles
Les sections suivantes décrivent chacun de ces composants et leur fonctionnement dans le contexte d'API Gateway.
Mot clé exact
Un chemin modélisé sans segment générique simple ou double (*
ou **
) est converti en correspondance exacte de chemin d'accès.
Par exemple, la spécification OpenAPI de votre configuration d'API de passerelle peut contenir une section semblable à celle-ci :
...
paths:
/shelves:
get:
summary: List shelves
...
Dans cet exemple, la passerelle n'accepte que les requêtes adressées à /shelves
et aucun autre chemin d'accès.
Mise en correspondance de caractères génériques uniques
Si un chemin modélisé contient une variable, un segment générique unique (par exemple, {var}
ou {var=*}
), ou les deux, la passerelle autorise les requêtes entrantes qui respectent les conditions suivantes :
- Les requêtes ne contiennent pas de barre oblique (
/
) supplémentaire, ce qui signifie que la variable ne correspond qu'à un seul segment de chemin d'accès. - Les requêtes contiennent au moins un caractère.
- Les requêtes peuvent contenir une barre oblique finale supplémentaire si elle est présente à la fin du chemin d'accès.
Par exemple, la spécification OpenAPI de votre configuration d'API de passerelle peut contenir une section semblable à celle-ci :
...
paths:
/shelves/{shelf}/books/{book}: # Equivalent to /shelves/{shelf=*}/books/{book=*}
get:
summary: Retrieve a book
...
Dans cet exemple, la passerelle accepte les requêtes correspondant à l'expression régulière suivante :
^/shelves/[^/]+/books/[^/]+/?$
Mise en correspondance de caractères génériques doubles
Si un chemin modélisé contient une variable désignée par un double segment générique (par exemple {var=**}
), la passerelle autorise les requêtes entrantes qui respectent les conditions suivantes :
- Les requêtes peuvent contenir tous les caractères, y compris les barres obliques (/).
- Les requêtes peuvent contenir zéro ou plusieurs caractères.
- Les requêtes peuvent contenir une barre oblique finale supplémentaire si elle est présente à la fin du chemin d'accès.
Par exemple, la spécification OpenAPI de votre configuration d'API de passerelle peut contenir une section semblable à celle-ci :
...
paths:
/shelves/{shelf=*}/books/{book=**}:
get:
summary: Retrieve a book
...
Dans cet exemple, la passerelle accepte les requêtes correspondant à l'expression régulière suivante :
^/shelves/[^/]+/books/.*/?$
Barres obliques encodées en URL
API Gateway suit la norme RFC 3986, qui ne traite pas les barres obliques encodées en URL (%2F
) comme des barres obliques réelles lors de la mise en correspondance des chemins d'URL pour les décisions de routage ou de sécurité. Si des barres obliques encodées en URL sont attendues, votre backend doit gérer ces requêtes en conséquence.
Par exemple, considérons les spécifications OpenAPI suivantes :
securityDefinitions:
api_key:
type: "apiKey"
name: "key"
in: "query"
paths:
/shelves/{shelf}:
get:
parameters:
- in: path
name: shelf
type: string
required: true
description: Shelf ID.
summary: List shelves
operationId: GetShelf
responses:
'200':
description: A successful response
schema:
type: string
/shelves/{shelf}/books/{book}:
get:
parameters:
- in: path
name: shelf
type: string
required: true
description: Shelf ID.
- in: path
name: book
type: string
required: true
description: Book ID
summary: Retrieve a book
operationId: GetBook
responses:
'200':
description: A successful response
schema:
type: string
security:
- api_key: []
Dans cet exemple, l'opération /shelves/{shelf}/books/{book}
nécessite une clé API, mais l'opération /shelves/{shelf}
ne présente aucune restriction.
Dans le cas où un utilisateur envoie une requête à /shelves/shelf_1%2Fbooks%2Fbook_2
:
- La passerelle traitera la requête en tant qu'opération
GetShelf
pour l'ID d'étagèreshelf_1%2Fbooks%2Fbook_2
. Dans ce cas, la vérification des clés API n'est pas appliquée. - Si le
%2F
est normalisé avant tout traitement de la requête par le backend, la requête peut être traitée en tant qu'opérationGetBook
pour l'ID de livrebook_2
. En d'autres termes, le backend traite/shelves/shelf_1%2Fbooks%2Fbook_2
comme/shelves/shelf_1/books/book_2
.
Dans cet exemple, le backend s'attend à ce que l'opération GetBook
effectue une vérification de la clé API à la passerelle. Toutefois, comme la passerelle a lu la requête en tant qu'opération GetShelf
, aucune vérification de la clé API n'a été effectuée.
Normalisation de plusieurs barres obliques adjacentes
API Gateway suit la norme RFC 3986, qui stipule que les chemins comportant plusieurs barres obliques adjacentes seront traités comme un chemin différent de ceux comportant des barres obliques uniques.
Par exemple, une requête contenant /shelves///
ne sera pas normalisée par la passerelle au chemin de requête /shelves/
avant de correspondre à un modèle de chemin d'URI ni lors du transfert vers le backend spécifié.