Node.js mit TSOA und Authentifizierung - (Teil 1) Die Zielsetzung
Mit diesem Artikel starte ich eine Artikelserie dazu, wie ich mit TSOA in Node.js meine Endpunkte absichere. Im ersten Artikel definiere ich die Zielsetzung und die grundlegenden Gedanken.
Wir wollen eine Node.js-Express-Applikation mit TSOA so absichern, dass nur von uns definierte Nutzergruppen Zugriff auf die jeweiligen Endpunkte haben. Dabei möchte ich, dass ich meinen Endpunkt mit einer einzeiligen Deklaration sichern kann.
Beispielhaft sähe dies wie folgt aus:
@Security('jwt', ['ADMIN'])
Um es deutlicher zu machen, hier ein Codesnippet eines Controllers mit einem gesicherten Endpunkt nur für Administratoren:
@Route('securedRoute')
export class SomeController extends Controller {
@Post()
@Security('jwt', ['ADMIN'])
public async post(@Request() req: AuthenticatedRequest): Promise<void> {
// Only "Scope.ADMIN" can access this endpoint
}
}
Die Herangehensweise
Um das genannte Ziel zu erreichen, müssen wir einige Vorkehrungen treffen. Damit wir den Überblick nicht verlieren, sammele ich die Gedanken, worauf wir achten:
- Die gesicherte Kommunikation mit den Schnittstellennutzern bauen wir auf dem Standard RFC 7519 – JSON Web Token.
- Wir stellen die JWT selbst aus und signieren sie, sodass wir uns darauf verlassen können, dass sie von uns ausgestellt und nicht manipuliert wurden.
- Die Authentifizierung gibt uns im Applikationscode Zugriff auf den authentifizierten Nutzer, damit wir diese Information weiterverarbeiten können – z. B. einen Changelog schreiben, der benennt, wer was und wann verändert hat.
- Wir stellen die einfache Testbarkeit der Absicherung sicher. D. h., mithilfe eines Vitest-Helpers prüfen wir die Sicherheitsanforderung an einen Endpunkt in einem einzeiligen Aufruf.
Das gesamte Kunstwerk wird erst funktionieren, wenn alle Teile fertig und korrekt zusammengesteckt sind. Die erfolgt im Rahmen einer Artikelserie (ein Experiment meinerseits, um Content auf diese Weise aufzuarbeiten: Ich werde nachträglich in die vorherigen Artikel die Links zu den Nachfolgern ergänzen).
Im nächsten Artikel beginnen wir mit dem Basis-Setup.