Zum Hauptinhalt springen

Anleitung: Node (Express)

Schritt 1: Das Bearer-Token aus dem Anfrage-Header extrahieren

Eine autorisierte Anfrage sollte einen Authorization-Header mit Bearer <access_token> als Inhalt enthalten. Extrahiere das Autorisierungstoken aus dem Anfrage-Header:

// 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);
};

Schritt 2: Token-Validierung

Zur Demonstration verwenden wir das jose-Paket, um die Signatur, den Ablaufstatus und die erforderlichen Ansprüche des Tokens zu validieren.

Installiere jose als Abhängigkeit

npm i jose --save

Abrufen der OIDC-Konfigurationen von Logto

Du benötigst einen JWK-öffentlichen Schlüssel und den Aussteller des Tokens, um die Signatur und die Quelle des empfangenen JWS-Tokens zu überprüfen. Alle aktuellen öffentlichen Logto-Autorisierungskonfigurationen findest du unter https://<your-logto-domain>/oidc/.well-known/openid-configuration.

z.B. Rufe https://tenant-id.logto.app/oidc/.well-known/openid-configuration auf. Und finde die folgenden zwei Felder im Antwortkörper:

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

Auth-Middleware hinzufügen

Die jwtVerify-Methode von Jose kann dir helfen, das JWS-Format des Tokens, die Tokensignatur, den Aussteller, die Zielgruppe und den Ablaufstatus zu überprüfen. Eine Ausnahme wird ausgelöst, wenn die Validierung fehlschlägt.

warnung

Wenn du rollenbasierte Zugangskontrolle (RBAC) verwendest, ist auch eine Berechtigungsprüfung erforderlich.

// auth-middleware.ts

import { createRemoteJWKSet, jwtVerify } from 'jose';

//...

export const verifyAuthFromRequest = async (req, res, next) => {
// Extrahiere das Token
const token = extractBearerTokenFromHeaders(req.headers);

const { payload } = await jwtVerify(
token, // Das rohe Bearer-Token, das aus dem Anfrage-Header extrahiert wurde
createRemoteJWKSet(new URL('https://<your-logto-domain>/oidc/jwks')), // Erzeuge ein jwks mit jwks_uri, das vom Logto-Server abgefragt wurde
{
// Erwarteter Aussteller des Tokens, sollte vom Logto-Server ausgestellt sein
issuer: 'https://<your-logto-domain>/oidc',
// Erwartetes Zielgruppen-Token, sollte der Ressourcenindikator der aktuellen API sein
audience: '<your request listener resource indicator>',
}
);

// wenn du RBAC verwendest
assert(payload.scope.includes('some_scope'));

// benutzerdefinierte Payload-Logik
userId = payload.sub;

return next();
};

Middleware auf deine API anwenden

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

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