Oracle Functions : Valider une clé d'API à l'aide de la passerelle d'API
Dans ce tutoriel, vous utiliserez Oracle Functions pour valider une clé d'API transmise à partir d'Oracle API Gateway. Une clé d'API est une méthode simple qui permet de sécuriser une API en exigeant du client qu'il transmette un jeton spécifique. La passerelle peut utiliser le jeton en tant que fonction d'autorisation personnalisée pour valider les demandes. Vous créerez une fonction Python qui valide le jeton et retourne une réponse JSON authentifiée.
Voici les principales tâches :
- Collecter les informations requises.
- Créer une application pour votre fonction.
- Créer une fonction "Hello World!".
- Convertir votre fonction pour valider la clé d'API.
- Déployer et tester votre fonction.
- Créer une passerelle d'API pour votre fonction.
- Appeler votre fonction à partir d'Internet à l'aide de votre passerelle d'API.

Pour plus d'informations, voir :
Étapes préliminaires
Pour suivre ce tutoriel, vous devez disposer des éléments suivants :
- Un compte Oracle Cloud Infrastructure payant. Voir Inscription à Oracle Cloud Infrastructure.
- Un compte OCI configuré pour prendre en charge le développement avec Oracle Functions. Voir Démarrage rapide avec Oracle Functions sur Cloud Shell.
- Vous devez avoir suivi l'un des deux tutoriels d'introduction à Oracle Functions.
- Voici les résultats obtenus après l'exécution de ces deux tutoriels :
- Oracle Functions est configuré pour créer des applications et déployer des fonctions.
- Oracle Registry est configuré pour stocker des images de fonction.
- Docker est connecté à Oracle Registry.
- Vous disposez du VCN requis et des ressources requises pour Oracle Functions.
- Vous disposez d'une paire de clés d'API et d'un jeton d'authentification.
Interface de ligne de commande Oracle
- Python 3.6+ et pip3.
- Moteur Docker : Ordinateur Linux ou machine virtuelle Linux. Voir les exigences en matière de moteur Docker pour connaître les versions et les distributions prises en charge.
- Docker Desktop : Disponible pour MacOS ou Windows 10.
- Windows 10 : Mise à jour Windows 10 2004 avec WSL 2 et Ubuntu ou toute autre distribution installée.
- Consultez le guide d'installation du sous-système Windows pour Linux sous Windows 10.
- Installez Docker Desktop pour Windows 10.
Note
Docker inclut une prise en charge spéciale de Linux pour WSL 2 sous la mise à jour Windows 10 2004. - MacOS : Consultez la page relative à l'installation de Docker Desktop pour MacOS.
- Windows 10 : Mise à jour Windows 10 2004 avec WSL 2 et Ubuntu ou toute autre distribution installée.
Oracle Cloud Shell
- Si vous utilisez Cloud Shell, les logiciels répertoriés dans la liste précédente sont déjà installés.
1. Collecter les informations requises
Collectez toutes les informations dont vous aurez besoin pour suivre le tutoriel. Copiez les informations suivantes dans votre bloc-notes.
Pour créer un compartiment, voir Créer un compartiment. Une fois votre compartiment créé, enregistrez son OCID et son nom.
Pour obtenir l'OCID du compartiment à partir d'un compartiment existant :
- Ouvrez le menu de navigation et cliquez sur Identité et sécurité. Sous Identité, cliquez sur Compartiments.
- Sélectionnez votre compartiment.
- Cliquez sur le lien Copier pour le champ OCID.
Enregistrez l'OCID et le nom du compartiment.
Notez les informations suivantes pour le tutoriel.
-
Nom du compartiment :
<your-compartment-name>
Exemple :
mon compartiment
-
ID compartiment :
<your-compartment-OCID>
Exemple :
ocid1.compartment.oc1.aaaaaaa...
-
Nom du VCN :
<your-vcn-name>
Exemple :
mon VCN
Ouvrez le menu de navigation et cliquez successivement sur Service de réseau et Réseaux en nuage virtuels.
-
Nom du sous-réseau public du réseau VCN :
<Public-Subnet-your-vcn-name>
Exemple :
Public-Subnet-my-vcn
Ouvrez le menu de navigation et cliquez successivement sur Service de réseau et Réseaux en nuage virtuels. Cliquez sur le VCN que vous avez créé.
2. Effectuer la configuration requise
Effectuez toute la configuration nécessaire pour le tutoriel.
Pour créer une application, procédez de la façon suivante.
- Ouvrez le menu de navigation et cliquez sur Services de développement. Sous Fonctions, cliquez sur Applications.
- Sélectionnez votre compartiment dans la liste déroulante Compartiments.
- Cliquez sur Créer une application.
- Complétez le formulaire.
- Nom :
<your-app-name>
- VCN :
<your-vcn-name>
- Sous-réseaux :
<Public-Subnet-your-vcn-name>
- Nom :
- Cliquez sur Créer.
Votre application est créée.
- Ouvrez le menu de navigation et cliquez successivement sur Service de réseau et Réseaux en nuage virtuels.
- Cliquez sur le nom du VCN que vous avez utilisé pour votre application Oracle Functions.
- Maintenant que votre nouveau VCN est affiché, cliquez sur le lien de sous-réseau Public.
Les informations sur le sous-réseau public s'affichent avec les listes de sécurité au bas de la page.
- Cliquez sur le lien Liste de sécurité par défaut ou sur le lien de liste de sécurité approprié.
Les règles de trafic entrant par défaut pour votre VCN s'affichent.
- Cliquez sur Ajouter des règles de trafic entrant.
Une boîte de dialogue Ajouter des règles de trafic entrant s'affiche.
- Entrez les informations suivantes pour la règle de trafic entrant. Une fois toutes les données entrées, cliquez sur Ajouter des règles de trafic entrant
Définissez la règle de trafic entrant comme suit :
- Sans état : Coché
- Type de source : CIDR
- CIDR source : 0.0.0.0/0
- Protocole IP : TCP
- Intervalle de ports sources : (Laissez vide)
- Intervalle de ports de destination : 443
- Description : VCN pour les applications
Après que vous avez cliqué sur Ajouter une règle de trafic entrant, les connexions HTTPS à votre sous-réseau public sont autorisées.
À présent, configurez une politique qui permet à la passerelle d'API d'appeler des fonctions.
Commencez par créer un groupe dynamique pour la passerelle d'API.
- Ouvrez le menu de navigation et cliquez sur Identité et sécurité. Sous Identité, cliquez sur Groupes dynamiques.
- Cliquez sur Créer un groupe dynamique.
- Indiquez les informations suivantes pour définir votre groupe dynamique.
- Nom :
<name-for-your-dynamic-group>
- Sous Règles de correspondance, utilisez Règle 1 :
<the-rule-text>
Voici le nom d'exemple et la règle que vous devez entrer.
- Nom : api-gtw-func-dynamic-group
- Sous Règles de correspondance, utilisez Règle 1 :
Tout {resource.type = 'ApiGateway', resource.compartment.id = 'ocid1.compartment.<your-compartment-OCID>'}
- Nom :
- Cliquez sur Créer.
À présent, créez la politique pour la passerelle d'API.
- Ouvrez le menu de navigation et cliquez sur Identité et sécurité. Sous Identité, cliquez sur Politiques.
- Cliquez sur Créer une politique.
- Pour définir votre politique, entrez les informations suivantes.
- Nom :
<name-for-your-policy>
- Description :
<description-for policy>
- compartiment :
<name-of-functions-compartment>
Pour la section Générateur de politiques :
- Cliquez sur Afficher l'éditeur manuel.
- Entrez votre politique dans la zone de texte, par exemple :
Allow dynamic-group api-gtw-func-dynamic-group to use functions-family in compartment <your-compartment-name>
Note
Le dernier paramètre est le nom et non l'OCID du compartiment.
- Nom :
- Cliquez sur Créer.
Vous avez créé une politique pour permettre à la passerelle d'API d'utiliser le service des fonctions.
- Ouvrez une fenêtre de terminal.
- Créez un répertoire dans lequel stocker vos fonctions et accédez à ce répertoire.
mkdir my-dir-name cd my-dir-name
- Créez une fonction Python "Hello World" avec Fn.
fn init --runtime python my-func-name
Cette commande crée un répertoire nommé
my-func-name
contenant la fonction et des fichiers de configuration. - Accédez au répertoire.
- Déployez la fonction.
fn -v deploy --app your-app-name
Divers messages s'affichent au fur et à mesure que les images Docker sont créées, poussées vers OCIR, puis déployées dans Oracle Functions.
- Appelez la fonction.
fn invoke your-app-name my-func-name
Retourne :
{"message": "Hello World"}
- Appelez la fonction avec un paramètre.
echo -n '{"name":"Bob"}' | fn invoke your-app-name my-func-name
Retourne :
{"message": "Hello Bob"}
3. Créer une passerelle d'API
Pour appeler votre fonction, créez une passerelle d'API.
Pour créer une passerelle d'API :
- Ouvrez le menu de navigation et cliquez sur Services de développement. Sous Gestion d'API, cliquez sur Passerelles.
- Sélectionnez votre compartiment dans la liste déroulante Compartiments.
- Cliquez sur Créer une passerelle
- Indiquez les informations suivantes pour définir votre passerelle d'API.
- Nom :
<your-gateway-name>
- Type :
<Public>
- compartiment :
<your-compartment-name>
- Réseau en nuage virtuel dans <your-vcn-name>:
<select-your-vcn>
- Sous-réseau dans <your-compartment-name:
<your-public-subnet-name>
- Nom :
- Cliquez sur Créer. Attendez quelques minutes que votre passerelle d'API soit créée.
À présent, créez un déploiement pour votre passerelle d'API.
- Cliquez sur Déploiements dans la section Ressources située dans la partie gauche de l'écran.
- Cliquez sur Créer un déploiement.
- Assurez-vous que À partir de zéro est sélectionné pour le type de déploiement.
- Pour définir votre déploiement, renseignez la section Informations de base.
- Nom :
<your-deployment-name>
- Préfixe de chemin (exemple) :
/tokens
- compartiment :
<your-compartment-name>
- Politiques de demande d'API : Utilisez les valeurs par défaut
- Politiques de journalisation d'API : Utilisez la valeur par défaut Informations
- Nom :
- Cliquez sur Suivant. La boîte de dialogue Routes s'affiche avec la valeur Route 1 sélectionnée.
- Pour définir votre route, renseignez la section Route 1.
- Chemin :
<your-route-path>
Exemple :
/val-token
- Modes :
GET POST
- Type : Oracle Functions
- Application dans <your-compartment-name> : Sélectionnez l'application Oracle Functions que vous avez créée.
- Nom de la fonction : Sélectionnez la fonction que vous avez créée à la section de configuration.
- Chemin :
- Cliquez sur Suivant. La boîte de dialogue Vérifier récapitulant les choix que vous avez faits s'affiche.
- Cliquez sur Créer. Votre déploiement est créé.
- Cliquez sur le lien Déploiements pour votre passerelle. Copiez le point d'extrémité de base pour le déploiement que vous avez créé.
Par exemple :
https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/tokens
Maintenant que votre passerelle d'API et votre déploiement sont créés, vous pouvez tester votre installation. Créez un script simple pour la commande curl
. Pour créer l'URL de curl
, ajoutez votre chemin de déploiement à votre point d'extrémité.
- Créez le fichier de script :
touch gtw01.sh && chmod 755 gtw01.sh
- Ajoutez la commande curl au fichier de script :
#!/bin/bash curl <your-api-gateway-endpoint>/val-token
- La commande retourne :
{"message":"Hello World"}
Vous avez connecté votre passerelle d'API à une fonction Python standard. À présent, vous allez mettre à jour votre fonction Python pour afficher les informations transmises dans une demande HTTP.
4. Mettre à jour la fonction pour valider la clé d'API
À présent, modifiez la fonction Python standard pour valider la clé d'API.
Si vous examinez la fonction Python standard, elle ressemble à ceci.
import io
import json
import logging
from fdk import response
def handler(ctx, data: io.BytesIO = None):
name = "World"
try:
body = json.loads(data.getvalue())
name = body.get("name")
except (Exception, ValueError) as ex:
logging.getLogger().info('error parsing json payload: ' + str(ex))
logging.getLogger().info("Inside Python Hello World function")
return response.Response(
ctx, response_data=json.dumps(
{"message": "Hello {0}".format(name)}),
headers={"Content-Type": "application/json"}
)
Avec ce code comme point de départ, les sections suivantes convertissent la fonction en une fonction Python qui valide une clé d'API et retourne un jeton.
Oracle Functions vous permet de stocker les données de configuration dans le contexte disponible dans votre demande. Il est possible de stocker les données de configuration dans une application ou une fonction. La commande suivante stocke la clé d'API dans la configuration de votre application.
fn config app <your-app-name> FN_API_KEY ABCD
La chaîne "ABCD" est un exemple de valeur de clé.
Pour plus d'informations sur la définition des valeurs de configuration d'Oracle Functions, voir le tutoriel sur le contexte d'exécution FnProject.
Commencez par mettre à jour func.py
avec les ensembles requis.
- Mettez à jour les énoncés
import
dansfunc.py
pour la validation des ensembles requis :import io import json import logging import datetime from datetime import timedelta from fdk import response
L'ensemble
datetime
sert à définir un délai d'expiration pour le jeton retourné. - Retirez le corps principal de la fonction. La méthode
response
et le code connexe seront ajoutés à nouveau au fur et à mesure.import io import json import logging import datetime from datetime import timedelta from fdk import response def handler(ctx, data: io.BytesIO = None):
À présent, vous pouvez mettre à jour la fonction avec le code de validation.
À présent, ajoutez du code pour valider la clé d'API et retourner un jeton dans la réponse. Voici le code avec des commentaires.
import io
import json
import logging
import datetime
from datetime import timedelta
from fdk import response
def handler(ctx, data: io.BytesIO = None):
auth_token = "invalid"
token = "invalid"
apiKey = "invalid"
expiresAt = (datetime.datetime.utcnow() + timedelta(seconds=60)).replace(tzinfo=datetime.timezone.utc).astimezone().replace(microsecond=0).isoformat()
try:
auth_token = json.loads(data.getvalue())
token = auth_token.get("token")
app_context = dict(ctx.Config())
apiKey = app_context['FN_API_KEY']
if token == apiKey:
return response.Response(
ctx,
status_code=200,
response_data=json.dumps({"active": True, "principal": "foo", "scope": "bar", "clientId": "1234", "expiresAt": expiresAt, "context": {"username": "wally"}})
)
except (Exception, ValueError) as ex:
logging.getLogger().info('error parsing json payload: ' + str(ex))
pass
return response.Response(
ctx,
status_code=401,
response_data=json.dumps({"active": False, "wwwAuthenticate": "API-key"})
)
- La fonction
handler
reçoit des informations système sur la demande courante au moyen des paramètresctx
etdata
. - La fonction suppose que
FN_API_KEY
est défini dans la configuration de l'application. Ensuite, la fonction compare la valeur de configuration à la valeur de jeton envoyée à partir de la demande POSTcurl
:-d '{"token":"ABCD"}'
. - Si les valeurs correspondent, un message JSON de validation est retourné. Dans le cas contraire, un code 401 est retourné avec les données d'erreur JSON.
Le code de fonction est terminé. À présent, vous pouvez tester la fonction.
- Redéployez la fonction mise à jour.
- Appelez la fonction pour vous assurer qu'elle fonctionne.
- Mettez à jour le script
gtw01.sh
pour transmettre les donnéesPOST
au script./bin/bash curl -X POST -d '{"token":"ABCD"}' https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/tokens/val-token
- Exécutez le script :
gtw01.sh | jq
- Si les clés d'API correspondent, la sortie du script ressemble à ceci :
{ "active": true, "principal": "foo", "scope": "bar", "clientId": "1234", "expiresAt": "2020-12-16T22:48:50+00:00", "context": { "username": "wally" } }
Si les clés d'API ne correspondent pas, un message d'erreur est retourné.
{ "active": false, "wwwAuthenticate": "API-key" }
Vous pouvez télécharger le code source complet de la fonction à partir du site des échantillons pour Oracle Functions.
Félicitations, vous avez converti la fonction Python standard en une nouvelle fonction qui valide une clé d'API. La fonction montre comment des données peuvent être transmises à la passerelle d'API et traitées dans une fonction.
Étape suivante
Vous avez créé une passerelle d'API et appelé une fonction à partir de celle-ci. Vous avez mis à jour la fonction pour valider une clé d'API.
Pour en savoir plus sur le développement à l'aide des produits Oracle, consultez les sites suivants :