This commit is contained in:
Bastian Wagner
2026-07-15 17:17:28 +02:00
parent d0600ab6ac
commit 7a6e08d2c5

View File

@@ -1,10 +1,14 @@
import { Body, Controller, Get, Param, Post, Req, Res, UnauthorizedException } from '@nestjs/common'; import { Body, Controller, Get, Param, Post, Req, Res, UnauthorizedException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { OidcProviderService } from './oidc-provider.service'; import { OidcProviderService } from './oidc-provider.service';
@Controller('interaction') @Controller('interaction')
export class OidcInteractionController { export class OidcInteractionController {
constructor(private readonly oidc: OidcProviderService) {} constructor(
private readonly oidc: OidcProviderService,
private readonly config: ConfigService,
) {}
@Get(':uid') @Get(':uid')
async view(@Param('uid') uid: string, @Req() request: Request, @Res() response: Response) { async view(@Param('uid') uid: string, @Req() request: Request, @Res() response: Response) {
@@ -15,6 +19,7 @@ export class OidcInteractionController {
} }
if (details.prompt.name === 'login') { if (details.prompt.name === 'login') {
response.send( response.send(
this.page( this.page(
'Anmelden', 'Anmelden',
@@ -25,6 +30,7 @@ export class OidcInteractionController {
} }
if (details.prompt.name === 'consent') { if (details.prompt.name === 'consent') {
console.log(details)
response.send( response.send(
this.page( this.page(
'Zugriff erlauben', 'Zugriff erlauben',
@@ -94,6 +100,7 @@ export class OidcInteractionController {
<form method="post" action="/interaction/${encodedUid}/abort"> <form method="post" action="/interaction/${encodedUid}/abort">
<button class="secondary" type="submit">Abbrechen</button> <button class="secondary" type="submit">Abbrechen</button>
</form> </form>
<p class="form-link"><a href="${this.escape(this.registrationUrl)}">Neues Konto registrieren</a></p>
`; `;
} }
@@ -113,6 +120,9 @@ export class OidcInteractionController {
input { border: 1px solid #bcc8d3; border-radius: 6px; font: inherit; min-height: 44px; padding: 10px 12px; } input { border: 1px solid #bcc8d3; border-radius: 6px; font: inherit; min-height: 44px; padding: 10px 12px; }
button { background: #0f6b6e; border: 1px solid #0f6b6e; border-radius: 6px; color: white; cursor: pointer; font: inherit; font-weight: 700; min-height: 44px; padding: 10px 14px; } button { background: #0f6b6e; border: 1px solid #0f6b6e; border-radius: 6px; color: white; cursor: pointer; font: inherit; font-weight: 700; min-height: 44px; padding: 10px 14px; }
button.secondary { background: white; color: #0f6b6e; } button.secondary { background: white; color: #0f6b6e; }
a { color: #0f6b6e; font-weight: 700; text-decoration: none; }
a:hover { text-decoration: underline; }
.form-link { margin: 16px 0 0; text-align: center; }
.message { background: #edf7f4; border: 1px solid #b8ddd3; border-radius: 6px; color: #24564f; margin: 0 0 16px; padding: 12px; } .message { background: #edf7f4; border: 1px solid #b8ddd3; border-radius: 6px; color: #24564f; margin: 0 0 16px; padding: 12px; }
.message.error { background: #fff1f0; border-color: #efb5ae; color: #8d2b20; } .message.error { background: #fff1f0; border-color: #efb5ae; color: #8d2b20; }
.scopes { background: #edf2f5; border-radius: 6px; padding: 10px; word-break: break-word; } .scopes { background: #edf2f5; border-radius: 6px; padding: 10px; word-break: break-word; }
@@ -131,6 +141,11 @@ export class OidcInteractionController {
.replaceAll("'", '&#039;'); .replaceAll("'", '&#039;');
} }
private get registrationUrl(): string {
const publicWebUrl = this.config.get<string>('PUBLIC_WEB_URL') ?? 'http://localhost:4200';
return `${publicWebUrl.replace(/\/+$/, '')}/register`;
}
private isInvalidCredentialsError(error: unknown): boolean { private isInvalidCredentialsError(error: unknown): boolean {
return error instanceof UnauthorizedException && error.message === 'Ungültige Zugangsdaten.'; return error instanceof UnauthorizedException && error.message === 'Ungültige Zugangsdaten.';
} }