diff --git a/backend/src/auth/jwt.strategy.ts b/backend/src/auth/jwt.strategy.ts new file mode 100644 index 0000000..b2a1882 --- /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.fromAuthHeaderAsBearerToken(), + 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: any) { + return { + userId: payload.sub, + username: payload.preferred_username, + roles: payload.realm_access?.roles ?? [], + }; + } +}