fix(security): JWT-Audience gegen OIDC_CLIENT_ID prüfen

Bisher prüfte das Backend nur Issuer und Signatur. Ein Access-Token, das
derselbe Authentik-Provider für eine andere Anwendung ausgestellt hat,
wurde ebenfalls akzeptiert.

- JwtStrategy verlangt aud == OIDC_CLIENT_ID (jwt-optionen.ts, getestet
  mit echten RS256-Tokens). Ohne OIDC_CLIENT_ID bleibt die Prüfung aus,
  mit Warnung beim Start.
- docker-compose.yml übergibt OIDC_CLIENT_ID jetzt ans Backend, Standard:
  dieselbe Client-ID wie das Frontend (VITE_OIDC_CLIENT_ID).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bjoernpoettkerandClaude Opus 5.5 committed 2026-11-04 10:46:57 +01:00
1 parent b11294ec10
commit c28475f71f
4 files changed
+92 -5

No files matched your search

@@ -0,0 +1,27 @@
import type { Algorithm } from 'jsonwebtoken';
export interface JwtPruefOptionen {
issuer: string;
/** Client-ID dieser Anwendung; ohne sie wird `aud` nicht geprüft. */
audience?: string;
algorithms: Algorithm[];
jwksUri: string;
}
/**
* Prüfoptionen für Access-Tokens von Authentik. Ohne Audience-Prüfung würde
* jedes Token desselben Issuers akzeptiert – also auch eines, das Authentik
* für eine andere Anwendung mit demselben Provider ausgestellt hat.
*/
export function jwtPruefOptionen(
issuer: string,
clientId: string | undefined,
): JwtPruefOptionen {
const basis = issuer.endsWith('/') ? issuer.slice(0, -1) : issuer;
return {
issuer,
...(clientId ? { audience: clientId } : {}),
algorithms: ['RS256'],
jwksUri: `${basis}/jwks/`,
};
}