diff --git a/apps/api/src/application-error-log/application-error-codes.ts b/apps/api/src/application-error-log/application-error-codes.ts index cdb3847..945445a 100644 --- a/apps/api/src/application-error-log/application-error-codes.ts +++ b/apps/api/src/application-error-log/application-error-codes.ts @@ -16,6 +16,7 @@ export enum ApplicationErrorCode { EXTERNAL_API_REQUEST_FAILED = 'EXTERNAL_API_REQUEST_FAILED', FILE_GENERATION_FAILED = 'FILE_GENERATION_FAILED', OIDC_AUTHORIZATION_ERROR = 'OIDC_AUTHORIZATION_ERROR', + OIDC_INTERACTION_SESSION_NOT_FOUND = 'OIDC_INTERACTION_SESSION_NOT_FOUND', OIDC_PROVIDER_ERROR = 'OIDC_PROVIDER_ERROR', PASSWORD_RESET_EMAIL_SEND_FAILED = 'PASSWORD_RESET_EMAIL_SEND_FAILED', REGISTRATION_APPROVAL_NOTIFICATION_FAILED = 'REGISTRATION_APPROVAL_NOTIFICATION_FAILED', diff --git a/apps/api/src/oidc/oidc-interaction.controller.ts b/apps/api/src/oidc/oidc-interaction.controller.ts index 9a192d1..cc0caae 100644 --- a/apps/api/src/oidc/oidc-interaction.controller.ts +++ b/apps/api/src/oidc/oidc-interaction.controller.ts @@ -2,6 +2,9 @@ import { Body, Controller, Get, Param, Post, Req, Res, UnauthorizedException } f import { ConfigService } from '@nestjs/config'; import { Request, Response } from 'express'; import type { Interaction } from 'oidc-provider'; +import { ApplicationErrorCategory, ApplicationErrorCode } from '../application-error-log/application-error-codes'; +import { ApplicationErrorLoggerService } from '../application-error-log/application-error-logger.service'; +import { RequestContextService } from '../common/request-context.service'; import { OidcProviderService } from './oidc-provider.service'; @Controller('interaction') @@ -9,11 +12,28 @@ export class OidcInteractionController { constructor( private readonly oidc: OidcProviderService, private readonly config: ConfigService, + private readonly applicationErrorLogger: ApplicationErrorLoggerService, + private readonly requestContext: RequestContextService, ) {} @Get(':uid') async view(@Param('uid') uid: string, @Req() request: Request, @Res() response: Response) { - const details = await this.oidc.interactionDetails(request, response); + let details: Interaction; + try { + details = await this.oidc.interactionDetails(request, response); + } catch (error) { + await this.logInteractionSessionError(error, uid, request); + response + .status(400) + .send( + this.page( + 'Anmeldung abgelaufen', + '
', + ), + ); + return; + } + if (details.uid !== uid) { response.status(400).send(this.page('Ungueltige Anfrage', 'Die OIDC-Interaktion ist ungueltig.
')); return; @@ -194,4 +214,33 @@ export class OidcInteractionController { private isInvalidCredentialsError(error: unknown): boolean { return error instanceof UnauthorizedException && error.message === 'Ungueltige Zugangsdaten.'; } + + private async logInteractionSessionError(error: unknown, uid: string, request: Request): Promise