Skip to content

Guard not returning authenticated user

I have created a guard

@Injectable()
export class EmailConfirmationGuard implements CanActivate {
    canActivate(context: ExecutionContext) {
        const request: RequestWithUser = context.switchToHttp().getRequest();

        console.log(request.user);


        if (!request.user?.hasEmailConfirmed) {
            throw new UnauthorizedException("Confirm your email first before updating your profile");
        }

        return true;
    }
}

And i am using it on of my endpoints

    @UseGuards(JwtAuthGuard)
    @UseGuards(EmailConfirmationGuard)
    @Post("/update-profile")
    @UseInterceptors(FileInterceptor("file"))
    async updateProfile(@UploadedFile() file: Express.Multer.File, @Body("full-name") fullname: string,@Request() req) {

The point is it is faling because getRequest is not returning the authenticated user it is returning undefined

const request: RequestWithUser = context.switchToHttp().getRequest();

How can i return the authenticated user from the response ?

Answer

You should use your JwtAuthGuard at your controller level since nest doesn’t have an order to run the decorators.

@UseGuards(JwtAuthGuard)
export class YourController{

@UseGuards(EmailConfirmationGuard)
@Post()
public async yourFunction() {}
    
}