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.
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é
});