Zum Hauptinhalt springen

Anleitung: Node (Express)

Schritt 1: Extrahiere das Bearer Token aus dem Anfrage-Header

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 Token-Aussteller, 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
});

Schütze deine Express.js API mit JWT und Logto