Aller au contenu principal

Guide : Node (Express)

Étape 1 : Extraire le Jeton d’autorisation de l'en-tête de la requête

Une requête autorisée doit contenir un en-tête Authorization avec Bearer <access_token> comme contenu. Extrayez le Jeton d’autorisation de l'en-tête de la requête :

// auth_middleware.ts

import { IncomingHttpHeaders } from 'http';

const extractBearerTokenFromHeaders = ({ authorization }: IncomingHttpHeaders) => {
const bearerTokenIdentifier = 'Bearer';

if (!authorization) {
throw new Error({ code: 'auth.authorization_header_missing', status: 401 });
}

if (!authorization.startsWith(bearerTokenIdentifier)) {
throw new Error({ code: 'auth.authorization_token_type_not_supported', status: 401 });
}

return authorization.slice(bearerTokenIdentifier.length + 1);
};

Étape 2 : Validation du jeton

Pour la démonstration, nous utilisons le package jose pour valider la signature du jeton, son statut d'expiration et les revendications requises.

Installer jose comme dépendance

npm i jose --save

Récupérer les configurations OIDC de Logto

Vous aurez besoin d'un ensemble de clés publiques JWK et de l'émetteur du jeton pour vérifier la signature et la source du jeton JWS reçu. Toutes les dernières configurations d'autorisation publiques de Logto peuvent être trouvées à https://<your-logto-domain>/oidc/.well-known/openid-configuration.

Par exemple, appelez https://tenant-id.logto.app/oidc/.well-known/openid-configuration. Et localisez les deux champs suivants dans le corps de la réponse :

{
"jwks_uri": "https://tenant-id.logto.app/oidc/jwks",
"issuer": "https://tenant-id.logto.app/oidc"
}

Ajouter un middleware d'authentification

La méthode jwtVerify de Jose peut vous aider à vérifier le format JWS du jeton, la signature du jeton, l'émetteur, l'audience et le statut d'expiration. Une exception sera levée si la validation échoue.

attention:

Si vous utilisez le contrôle d’accès basé sur les rôles (RBAC), la validation de la portée est également requise.

// auth-middleware.ts

import { createRemoteJWKSet, jwtVerify } from 'jose';

//...

export const verifyAuthFromRequest = async (req, res, next) => {
// Extraire le jeton
const token = extractBearerTokenFromHeaders(req.headers);

const { payload } = await jwtVerify(
token, // Le Jeton d’autorisation brut extrait de l'en-tête de la requête
createRemoteJWKSet(new URL('https://<your-logto-domain>/oidc/jwks')), // générer un jwks en utilisant jwks_uri demandé au serveur Logto
{
// émetteur attendu du jeton, doit être émis par le serveur Logto
issuer: 'https://<your-logto-domain>/oidc',
// audience attendue du jeton, doit être l'indicateur de ressource de l'API actuelle
audience: '<your request listener resource indicator>',
}
);

// si vous utilisez RBAC
assert(payload.scope.includes('some_scope'));

// logique personnalisée du payload
userId = payload.sub;

return next();
};

Appliquer le middleware à votre API

import { verifyAuthFromRequest } from '/middleware/auth-middleware.ts';

app.get('/user/:id', verifyAuthFromRequest, (req, res, next) => {
// Code personnalisé
});

Ressources associées

Protégez votre API Express.js avec JWT et Logto