So I have two strategies in JWT, the first is for the access token and the other is for the refresh token, but the two are actually clashing.
I've made it like this
JWT Strategy
// Import
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
constructor(
private readonly configService: ConfigService,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: configService.get('JWT_SECRET'),
});
}
async validate(jwtPayload: JwtPayload): Promise<User> {
// Code
}
}
Refresh Token JWT Strategy
// Import
@Injectable()
export class JwtRefreshTokenStrategy extends PassportStrategy(
Strategy,
'jwt-refresh',
) {
constructor(
private readonly configService: ConfigService,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: configService.get('JWT_REFRESH_SECRET'),
passReqToCallback: true,
});
}
async validate(request: Request, jwtPayload: JwtPayload): Promise<User> {
// Code
}
}
I've also made each guard like this
JWT Strategy
import { ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class AccessTokenGuard extends AuthGuard('jwt') {
constructor(private reflector: Reflector) {
super();
}
canActivate(context: ExecutionContext) {
const isPublic = this.reflector.getAllAndOverride('isPublic', [
context.getHandler(),
context.getClass(),
]);
if (isPublic) return true;
return super.canActivate(context);
}
}
Refresh Token JWT Strategy
import { AuthGuard } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
@Injectable()
export class RefreshTokenGuard extends AuthGuard('jwt-refresh') {
constructor() {
super();
}
}