Applications serveur + API : Implémentation de l’API en Node.js
Dans le cadre du scénario d’architecture serveur + API, nous allons implémenter l’API Feuilles de temps dans Node.js. Veuillez vous référer au scénario pour obtenir des informations sur la solution implémentation.
Le code source complet de l’implémentation de l’API Node.js se trouve dans ce dépôt GitHub.
1. Définir le point de terminaison API
Cette implémentation utilise 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 et exécutez npm init
. Ce processus configure votre fichier package.json
.
Laissez les paramètres par défaut ou modifiez-les selon votre convenance.
Le package.json
de notre échantillon ressemble à ce qui suit :
{
"name": "timesheets-api",
"version": "1.0.0",
"description": "API used to add timesheet entries for employees and contractors",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/auth0-samples/auth0-pnp-timesheets.git"
},
"author": "Auth0",
"license": "MIT",
"bugs": {
"url": "https://github.com/auth0-samples/auth0-pnp-timesheets/issues"
},
"homepage": "https://github.com/auth0-samples/auth0-pnp-timesheets#readme"
}
Was this helpful?
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.
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 JWT. 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.
Pour installer ces dépendances, procédez comme suit :
npm install express express-jwt jwks-rsa body-parser --save
Was this helpful?
Implémenter le point de terminaison
Ouvrez votre Directory API et créez un fichier server.js
. Votre code doit :
Régler les dépendances.
Activer le logiciel médiateur d’analyse du corps de la demande.
Implémenter le point de terminaison.
Lancer le serveur API.
Voici notre exemple d’implémentation :
// set dependencies
const express = require('express');
const app = express();
const jwt = require('express-jwt');
const jwksRsa = require('jwks-rsa');
const bodyParser = require('body-parser');
// enable the use of request body parsing middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
// create timesheets upload API endpoint
app.post('/timesheets/upload', function(req, res){
res.status(201).send({message: "This is the POST /timesheets/upload endpoint"});
})
// launch the API Server at localhost:8080
app.listen(8080);
Was this helpful?
Lancez votre serveur API en utilisant node server
et envoyez une requête HTTP POST à localhost:8080/timesheets/upload
. Vous verrez une réponse JSON avec le message Ceci est le point de terminaison POST /feuilles de temps/téléversement
.
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 le point de terminaison API
Afin de valider notre jeton, nous allons utiliser la fonction jwt
fournie par le logiciel médiateur express-jwt, et le paquet jwks-rsa
pour récupérer la clé publique d’Auth0. 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
poursuit sa propre logique pour valider la signature du jeton, l’expiration, l’audience
et l’issuer
.
Les étapes que nous suivrons dans notre code sont :
Créer la fonctionnalité logiciel médiateur pour valider le jeton d’accès.
Activez l’utilisation de logiciel médiateur dans nos chemins.
C’est également le bon moment pour implémenter la logique d’enregistrement des entrées de la feuille de temps dans une base de données locale, ou tout autre mécanisme de stockage que vous préférez. Voici notre exemple d’implémentation (certains codes sont omis en raison aux fins de concision) :
// set dependencies - code omitted
// enable the use of request body parsing middleware - code omitted
// Create middleware for checking the JWT
const checkJwt = jwt({
// Dynamically provide a signing key based on the kid in the header and the signing keys provided by the JWKS endpoint.
secret: jwksRsa.expressJwtSecret({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: `https://{yourDomain}/.well-known/jwks.json`
}),
// Validate the audience and the issuer.
audience: process.env.AUTH0_AUDIENCE,
issuer: `https://{yourDomain}/`,
algorithms: ['RS256']
});
// create timesheets API endpoint
app.post('/timesheets/upload', checkJwt, function(req, res){
var timesheet = req.body;
// Save the timesheet entry to the database...
//send the response
res.status(201).send(timesheet);
})
// launch the API Server at localhost:8080 - code omitted
Was this helpful?
Si nous lançons notre serveur maintenant et effectuons un HTTP POST vers localhost:8080/timesheets/upload
nous obtiendrons le message d’erreur Missing or invalid token
, ce qui est correct, car nous n’avons pas envoyé de jeton d’accès dans notre requête.
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 à : Obtenir un jeton d’accès
Invoquez l’API en ajoutant un en-tête d’
Authorization
à notre requête avec la valeurBearer ACCESS_TOKEN
, oùACCESS_TOKEN
est la valeur du jeton que nous avons récupéré à la première étape.
3. Vérifier les autorisations du client
Á cette étape nous ajoutons la possibilité de vérifier si le client a des autorisations (ou scope
) pour utiliser notre point de terminaison afin de téléverser 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 :
npm install express-jwt-authz --save
Was this helpful?
Maintenant, ajoutez un appel à 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. Voici notre exemple d’implémentation (certains codes sont omis en raison aux fins de concision) :
// set dependencies - some code omitted
const jwtAuthz = require('express-jwt-authz');
// Create middleware for checking the JWT
// Enable the use of request body parsing middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
// Batch upload endpoint
app.post('/timesheets/upload', checkJwt, jwtAuthz(['batch:upload']), function(req, res){
var timesheet = req.body;
// Save the timesheet entry to the database...
//send the response
res.status(201).send(timesheet);
});
// launch the API Server at localhost:8080 - code omitted
Was this helpful?
Si nous invoquons notre API avec un jeton qui n’inclut pas cette permission, nous devrions obtenir le message d’erreur Interdit avec le code d’état HTTP 403
. Vous pouvez l’essayer en supprimant cette permission de votre API.
Et voilà! Vous avez terminé!