Aller au contenu principal

Guide : Node (Express)

Étape 1 : Extraire le jeton Bearer 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. Extraire 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 publiques d'Autorisation 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 Bearer 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é depuis le serveur Logto
{
// Émetteur attendu du jeton, doit être émis par le serveur Logto
issuer: 'https://<your-logto-domain>/oidc',
// Jeton d’audience attendu, doit être l'indicateur de ressource de l'API actuelle
audience: '<your request listener resource indicator>',
}
);

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

// logique de charge utile personnalisée
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é
});