Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SPGO 34] implement validate token function #14

Merged
merged 3 commits into from
Oct 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/auth/auth.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {
LogoutResponse,
RegisterRequest,
RegisterResponse,
ValidateTokenRequest,
ValidateTokenResponse,
ResetPasswordRequest,
ResetPasswordResponse,
// ValidateGoogleRequest,
Expand Down Expand Up @@ -55,4 +57,9 @@ export class AuthController {
return this.authService.resetPassword(request);

}

@GrpcMethod('AuthService', 'ValidateToken')
validateToken(request: ValidateTokenRequest): Promise<ValidateTokenResponse> {
return this.authService.validateToken(request);
}
}
15 changes: 15 additions & 0 deletions src/auth/auth.pb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,14 @@ export interface ForgotPasswordResponse {
resetPasswordUrl: string;
}

export interface ValidateTokenRequest {
token: string;
}

export interface ValidateTokenResponse {
isValid: boolean;
}

export const AUTH_PACKAGE_NAME = "auth";

export interface AuthServiceClient {
Expand All @@ -99,6 +107,8 @@ export interface AuthServiceClient {

logout(request: LogoutRequest): Observable<LogoutResponse>;

validateToken(request: ValidateTokenRequest): Observable<ValidateTokenResponse>;

forgotPassword(request: ForgotPasswordRequest): Observable<ForgotPasswordResponse>;
}

Expand All @@ -121,6 +131,10 @@ export interface AuthServiceController {

logout(request: LogoutRequest): Promise<LogoutResponse> | Observable<LogoutResponse> | LogoutResponse;

validateToken(
request: ValidateTokenRequest,
): Promise<ValidateTokenResponse> | Observable<ValidateTokenResponse> | ValidateTokenResponse;

forgotPassword(
request: ForgotPasswordRequest,
): Promise<ForgotPasswordResponse> | Observable<ForgotPasswordResponse> | ForgotPasswordResponse;
Expand All @@ -136,6 +150,7 @@ export function AuthServiceControllerMethods() {
"validateOAuth",
"logout",
"forgotPassword",
"validateToken",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
Expand Down
42 changes: 39 additions & 3 deletions src/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
RefreshTokenResponse,
RegisterRequest,
RegisterResponse,
ValidateTokenRequest,
ValidateTokenResponse,
ResetPasswordRequest,
ResetPasswordResponse,
// ValidateGoogleRequest,
Expand All @@ -39,7 +41,7 @@
private blacklistRepo: BlacklistRepository,
private jwtService: JwtService,
private configService: ConfigService,
) { }
) {}

public async login(request: LoginRequest): Promise<LoginResponse> {
try {
Expand Down Expand Up @@ -92,7 +94,7 @@
}
}

public async refreshToken(

Check warning on line 97 in src/auth/auth.service.ts

View workflow job for this annotation

GitHub Actions / build (18.x)

'request' is defined but never used
request: RefreshTokenRequest,
): Promise<RefreshTokenResponse> {
return null;
Expand Down Expand Up @@ -178,14 +180,48 @@
}
}

public async validateToken(
request: ValidateTokenRequest,
): Promise<ValidateTokenResponse> {
try {
const decodedToken = this.jwtService.verify(request.token, {
secret: this.configService.get<string>('JWT_ACCESS_SECRET'),
});
if (!decodedToken) {
return { isValid: false };
}
if (
decodedToken.registeredClaims.issuer !==
this.configService.get<string>('TOKEN_ISSUER')
) {
return { isValid: false };
}

if (decodedToken.registeredClaims.expiredAt < Date.now()) {
return { isValid: false };
}

return { isValid: true };
} catch (err) {
console.log(err);
if (!(err instanceof RpcException)) {
throw new RpcException({
code: status.INTERNAL,
message: 'internal server error',
});
}
throw err;
}
}

private async getTokens(userId: string) {
try {
const accessToken = await this.jwtService.signAsync(
{
sub: userId,
registeredClaims: {
issuer: this.configService.get<string>('TOKEN_ISSUER'),
expiredAt: Date.now() + 60 * 15,
expiredAt: Date.now() + 60 * 15 * 1000,
issuedAt: Date.now(),
},
},
Expand All @@ -200,7 +236,7 @@
sub: userId,
registeredClaims: {
issuer: '',
expiredAt: Date.now() + 60 * 60 * 24 * 7,
expiredAt: Date.now() + 60 * 60 * 24 * 7 * 1000,
issuedAt: Date.now(),
},
},
Expand Down
9 changes: 9 additions & 0 deletions src/proto/auth.proto
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ service AuthService {
rpc ResetPassword(ResetPasswordRequest) returns (ResetPasswordResponse) {}
rpc ValidateOAuth(ValidateOAuthRequest) returns (LoginResponse) {}
rpc Logout(LogoutRequest) returns (LogoutResponse) {}
rpc ValidateToken(ValidateTokenRequest) returns (ValidateTokenResponse) {}
rpc ForgotPassword(ForgotPasswordRequest) returns (ForgotPasswordResponse) {}
}

Expand Down Expand Up @@ -89,3 +90,11 @@ message ForgotPasswordRequest {
message ForgotPasswordResponse {
string reset_password_url = 1;
}

message ValidateTokenRequest {
string token = 1;
}

message ValidateTokenResponse {
bool is_valid = 1;
}
Loading