Skip to content

Commit

Permalink
Merge pull request #14 from Brints/jwt-config
Browse files Browse the repository at this point in the history
feat: jwt config
  • Loading branch information
aniebietafia authored Sep 3, 2024
2 parents 31959a9 + 42f0e05 commit 6e4bd1d
Show file tree
Hide file tree
Showing 8 changed files with 93 additions and 5 deletions.
15 changes: 12 additions & 3 deletions brints-estate-api/src/auth/auth.module.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
import { forwardRef, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { JwtModule } from '@nestjs/jwt';

import { AuthController } from './auth.controller';
import { AuthService } from './providers/auth.service';
import { UsersModule } from 'src/users/users.module';
import { HashingProvider } from './providers/hashing.provider';
import { BcryptProvider } from './providers/bcrypt.provider';
import { CreateUserProvider } from './providers/create-user.provider';
import { UserHelper } from 'src/utils/userHelper.lib';
import { GenerateTokenHelper } from 'src/utils/generate-token.lib';
import { UserHelper } from '../utils/userHelper.lib';
import { GenerateTokenHelper } from '../utils/generate-token.lib';
import { LoginUserProvider } from './providers/login-user.provider';
import jwtConfig from './config/jwt.config';

@Module({
controllers: [AuthController],
providers: [
ConfigService,
AuthService,
CreateUserProvider,
LoginUserProvider,
Expand All @@ -22,7 +27,11 @@ import { LoginUserProvider } from './providers/login-user.provider';
useClass: BcryptProvider,
},
],
imports: [forwardRef(() => UsersModule)],
imports: [
forwardRef(() => UsersModule),
ConfigModule.forFeature(jwtConfig),
JwtModule.registerAsync(jwtConfig.asProvider()),
],
exports: [AuthService, HashingProvider],
})
export class AuthModule {}
10 changes: 10 additions & 0 deletions brints-estate-api/src/auth/config/jwt.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { registerAs } from '@nestjs/config';

export default registerAs('jwt', () => {
return {
secret: process.env.JWT_SECRET,
expiresIn: parseInt(process.env.JWT_ACCESS_TOKEN_TTL ?? '3600', 10),
audience: process.env.JWT_TOKEN_AUDIENCE,
issuer: process.env.JWT_TOKEN_ISSUER,
};
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class AccessTokenGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
return true;
}
}
38 changes: 36 additions & 2 deletions brints-estate-api/src/auth/providers/login-user.provider.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import { forwardRef, HttpStatus, Inject, Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { JwtService } from '@nestjs/jwt';
import { ConfigType } from '@nestjs/config';

import { User } from 'src/users/entities/user.entity';
import { HashingProvider } from './hashing.provider';
import { LoginUserDto } from '../dto/login.dto';
import { CustomException } from 'src/exceptions/custom.exception';
import jwtConfig from '../config/jwt.config';
import { JwtPayload } from 'src/types/jwt.interface';

@Injectable()
export class LoginUserProvider {
Expand All @@ -15,9 +19,16 @@ export class LoginUserProvider {

@Inject(forwardRef(() => HashingProvider))
private readonly hashingProvider: HashingProvider,

private readonly jwtService: JwtService,

@Inject(jwtConfig.KEY)
private readonly jwtConfiguration: ConfigType<typeof jwtConfig>,
) {}

public async loginUser(loginUserDto: LoginUserDto): Promise<User> {
public async loginUser(
loginUserDto: LoginUserDto,
): Promise<{ access_token: string }> {
const user = await this.userRepository.findOne({
where: { email: loginUserDto.email },
});
Expand All @@ -38,6 +49,29 @@ export class LoginUserProvider {
);
}

return user;
if (!user.isVerified) {
throw new CustomException(
HttpStatus.BAD_REQUEST,
'User account not verified',
);
}

const payload: JwtPayload = {
sub: user.id,
first_name: user.first_name,
last_name: user.last_name,
email: user.email,
role: user.role,
verified: user.isVerified,
};

const access_token = await this.jwtService.signAsync(payload, {
secret: this.jwtConfiguration.secret,
expiresIn: this.jwtConfiguration.expiresIn,
audience: this.jwtConfiguration.audience,
issuer: this.jwtConfiguration.issuer,
});

return { access_token };
}
}
10 changes: 10 additions & 0 deletions brints-estate-api/src/config/config.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ export class AppConfigService {
app: {
port: this.configService.get<number>('APP_PORT') as number,
},
jwt: {
secret: this.configService.get<string>('JWT_SECRET') as string,
expiresIn: this.configService.get<number>(
'JWT_ACCESS_TOKEN_TTL',
) as number,
audience: this.configService.get<string>(
'JWT_TOKEN_AUDIENCE',
) as string,
issuer: this.configService.get<string>('JWT_TOKEN_ISSUER') as string,
},
};
}
}
3 changes: 3 additions & 0 deletions brints-estate-api/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Logger, ValidationPipe } from '@nestjs/common';

import { AppModule } from './app.module';
import { swaggerInitializer } from './config/config.swagger';
import { HttpExceptionFilter } from './exceptions/http-exception.filter';

async function bootstrap() {
const app = await NestFactory.create(AppModule);
Expand All @@ -14,6 +15,8 @@ async function bootstrap() {
}),
);

app.useGlobalFilters(new HttpExceptionFilter());

const configService = new ConfigService();

const port = configService.get('APP_PORT');
Expand Down
10 changes: 10 additions & 0 deletions brints-estate-api/src/types/jwt.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export interface JwtPayload {
sub: string;
first_name: string;
last_name: string;
email: string;
role: string;
verified: boolean;
iat?: number;
exp?: number;
}
1 change: 1 addition & 0 deletions brints-estate-api/tsconfig.build.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"extends": "./tsconfig.json",
"include": ["src/**/*.ts", "src/**/*.d.ts"],
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
}

0 comments on commit 6e4bd1d

Please sign in to comment.