1. Définir les points de terminaison de l’API
Nous utiliserons le cadre d’applications Web Express pour construire une API Node.js.Créer un fichier package.json
Créez un dossier pour votre API-y et exécuteznpm init
. Cette action configurera votre fichier package.json
.
Laissez les paramètres par défaut ou modifiez-les selon votre convenance.
Le package.json
de notre exemple ressemble à ce qui suit :
Installer les dépendances
Ensuite, nous devons définir nos dépendances. Nous utiliserons les modules suivants :- express : ce module ajoute le cadre d’applications Web Express.
- cors : Le présent module ajoute la prise en charge de l’activation du CORS, ce qui est nécessaire car l’API sera appelée à partir d’une application à page unique qui s’exécute sur un domaine différent dans un navigateur Web.
- jwks-rsa : cette bibliothèque récupère les clés de connexion RSA à partir d’un point de terminaison JWKS (JSON Web Key Set). À l’aide de
expressJwtSecret
nous pouvons générer un fournisseur de secret qui fournit la bonne clé de connexion àexpress-jwt
en fonction dukid
dans l’en-tête . Pour en apprendre davantage, consultez node-jwks-rsa GitHub repository. - express-jwt : Ce module vous laisse authentifier les requêtes HTTP à l’aide de jetons JWT dans vos applications Node.js. Express-jwtusieurs fonctions qui facilitent le travail avec les JWT. Pour plus d’information consultez express-jwt GitHub repository.
- body-parser : il s’agit d’un logiciel médiateur d’analyse de corps Node.js. Il extrait la partie entière du corps d’une requête entrante et l’expose sur
req.body
comme quelque chose de plus facile à interfacer. Pour plus d’informations et plusieurs alternatives, consultez le dépôt GitHub body-parser.
Implémenter les points de terminaison
Ouvrez votre répertoire API et créez un fichierserver.js
. Votre code doit :
- Obtenir les dépendances.
- Implémenter le ou les points de terminaison.
- Lancer le serveur API.
node server
et envoyez une requête HTTP POST à localhost:8080/timesheets
. Vous verrez une réponse JSON avec le message This is the POST /timesheets endpoint
.
Nous avons désormais notre point de terminaison, mais tout le monde peut l’appeler. Rendez-vous au paragraphe suivant pour voir comment nous pouvons résoudre ce problème.
2. Sécuriser les points de terminaison de l’API
Dans l’optique de valider notre jeton, nous utiliserons la fonctionjwt
fournie par le logiciel médiateur express-jwt, et jwks-rsa
pour récupérer notre secret. Les bibliothèques remplissent les rôles suivants :
express-jwt
décode le jeton et achemine la demande l’en-tête et les données utiles versjwksRsa.expressJwtSecret
.jwks-rsa
télécharge toutes les clés de connexion à partir du point de terminaison JWKS et vérifie si l’une des clés de connexion correspond à la valeurkid
dans l’en-tête du jeton JWT. Si aucune des clés de connexion ne correspond à la valeurkid
reçue, une erreur sera générée. Si nous avons une correspondance, nous transmettrons la bonne clé de connexion àexpress-jwt
.express-jwt
poursuivra sa propre logique pour valider la signature du jeton, l’expiration, l’audience
et l’issuer
.
- Créer la fonctionnalité logiciel médiateur pour valider le jeton d’accès.
- Activez l’utilisation du logiciel médiateur dans nos chemins.
localhost:8080/timesheets
nous obtiendrons le message d’erreurMissing or invalid token
, ce qui est correct, car nous n’avons pas envoyé de jeton d’accès dans notre demande).
Pour tester également le scénario de fonctionnement, nous devons :
- Obtenir un jeton d’accès Pour plus d’informations sur la procédure à suivre pour y parvenir, reportez-vous à : Get an Access Token (Obtenir un jeton d’accès).
- Invoquez l’API en ajoutant un en-tête
Authorization (Autorisation)
à notre requête avec la valeurBearer ACCESS_TOKEN (Porteur de jeton d’accès)
, oùACCESS_TOKEN (jeton d’accès)
est la valeur du jeton que nous avons récupéré à la première étape.
3. Vérifiez les permissions de l’application
Á cette étape nous ajouterons à notre mise en œuvre la possibilité de vérifier si l’application a des autorisations (ou despermissions
) pour utiliser notre point de terminaison afin de créer une feuille de temps. En particulier, nous voulons nous rassurer que le jeton a la bonne permission, qui est batch:upload
.
Pour y parvenir, nous utilisons le paquet express-jwt-authz
Node.js, donc ajoutez-le à votre projet :
jwtAuthz(...)
à votre logiciel médiateur pour vous assurer que le jeton JWT contient une permission particulière afin d’exécuter un point de terminaison particulier.
Nous ajouterons une dépendance supplémentaire. La bibliothèque express-jwt-authz , utilisée conjointement avec express-jwt, valide le jeton JWT et s’assure qu’il possède les autorisations adéquates pour appeler le point de terminaison souhaité. Pour plus d’informations, consultez le référentiel express-jwt-authz GitHub.
Voici notre exemple d’implémentation (certains codes sont omis aux fins de concision) :
403
. Vous pouvez l’essayer en supprimant cette permission de votre API.
4. Déterminer l’identité de l’utilisateur
Le logiciel médiateurexpress-jwt
utilisé pour valider le jeton JWT configure également req.auth
avec les informations contenues dans le jeton JWT. Si vous voulez utiliser la demande sub
pour identifier l’utilisateur de manière unique, vous pouvez simplement utiliser req.auth.sub
.
Dans le cas de l’application de feuilles de temps, nous souhaitons cependant utiliser l’adresse courriel de l’utilisateur comme identifiant unique.
La première chose que nous devons faire est d’écrire une règle qui ajoutera l’adresse courriel de l’utilisateur au jeton d’accès. Accédez à la section Règles du Dashboard, puis cliquez sur le boutonCréer une règle.
Vous pouvez donner à la règle un nom descriptif, par exemple Ajouter courriel au jeton d’accès
, puis utiliser le code suivant pour la règle :
namespace
est utilisé pour s’assurer que la requête possède un nom unique et n’entre pas en conflit avec les noms de requêtes OIDC standard. Cependant, Auth0 prend en charge les demandes personnalisées avec et sans espace de noms. Pour plus d’informations sur les demandes personnalisées, consultez Créer des demandes personnalisées.
Ensuite, dans votre API, vous pouvez récupérer la valeur de la demande à partir de req.auth
, et l’utiliser en tant qu’identité unique de l’utilisateur que vous pouvez associer aux entrées de feuilles de temps.