From a82cced5c1ef91776d94657f92bfb7ddb248a597 Mon Sep 17 00:00:00 2001 From: toir-bot Date: Mon, 13 Apr 2026 11:43:53 +0000 Subject: [PATCH] chore: initial project scaffold: backend/src/auth/jwt.strategy.ts --- backend/src/auth/jwt.strategy.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 backend/src/auth/jwt.strategy.ts diff --git a/backend/src/auth/jwt.strategy.ts b/backend/src/auth/jwt.strategy.ts new file mode 100644 index 0000000..3c6708b --- /dev/null +++ b/backend/src/auth/jwt.strategy.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { passportJwtSecret } from 'jwks-rsa'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor() { + super({ + jwtFromRequest: ExtractJwt.fromAuthBearerToken(), + ignoreExpiration: false, + secretOrKeyProvider: passportJwtSecret({ + cache: true, + rateLimit: true, + jwksRequestsPerMinute: 5, + jwksUri: `${process.env.KEYCLOAK_URL}/protocol/openid-connect/certs`, + }), + algorithms: ['RS256'], + issuer: process.env.KEYCLOAK_URL, + }); + } + + validate(payload: Record) { + return { + userId: payload.sub, + username: payload.preferred_username, + roles: payload.realm_access?.['roles'] ?? [], + }; + } +}