126 lines
4.1 KiB
TypeScript
126 lines
4.1 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import { JwtService } from '@nestjs/jwt';
|
|
import { Response } from 'express';
|
|
import { Utility } from 'src/common/Utility';
|
|
import JwtPayload from 'src/jwt/jwt-payload.dto';
|
|
import RefreshToken from 'src/jwt/refresh-token.entity';
|
|
import { User } from 'src/user/user.entity';
|
|
import { UserService } from 'src/user/user.service';
|
|
import { Request } from 'express';
|
|
|
|
@Injectable()
|
|
export class AuthService {
|
|
|
|
constructor(private userService: UserService, private jwtService: JwtService) { }
|
|
|
|
private signToken(payload: any, type: 'accessToken' | 'refreshToken') {
|
|
const config = Utility.jwtConfig[type];
|
|
return this.jwtService.sign(payload, {
|
|
secret: config.secretOrKey,
|
|
expiresIn: config.expiresIn,
|
|
});
|
|
}
|
|
|
|
private verifyToken(token: string, type: 'accessToken' | 'refreshToken'): any {
|
|
const config = Utility.jwtConfig[type];
|
|
try {
|
|
return this.jwtService.verify(token, {
|
|
secret: config.secretOrKey,
|
|
});
|
|
} catch (error) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async validateUser(payload: any) {
|
|
return this.userService.findByEmail(payload.email);
|
|
}
|
|
|
|
async login(user: any) {
|
|
const { password, ...rest } = user;
|
|
const payload = { rest };
|
|
const accessToken = this.signToken(payload, 'accessToken');
|
|
const refreshToken = this.signToken(payload, 'refreshToken');
|
|
await RefreshToken.create({ email: user.email, token: refreshToken, type: 'jwt' });
|
|
return {
|
|
access_token: accessToken,
|
|
refresh_token: refreshToken,
|
|
};
|
|
}
|
|
|
|
async signup(user: any) {
|
|
const { password, ...rest } = user;
|
|
const payload = { rest };
|
|
const accessToken = this.signToken(payload, 'accessToken');
|
|
const refreshToken = this.signToken(payload, 'refreshToken');
|
|
await RefreshToken.create({ email: user.email, token: refreshToken, type: 'jwt' });
|
|
return {
|
|
access_token: accessToken,
|
|
refresh_token: refreshToken,
|
|
};
|
|
}
|
|
|
|
async refreshAccessToken(refreshToken: string) {
|
|
const payload = this.verifyToken(refreshToken, 'refreshToken');
|
|
if (!payload) {
|
|
throw new Error('Invalid refresh token');
|
|
}
|
|
const user = await this.userService.findByEmail(payload.email);
|
|
if (!user) {
|
|
throw new Error('User not found');
|
|
}
|
|
const { password, ...rest } = user;
|
|
const newPayload = { rest };
|
|
const accessToken = this.signToken({ newPayload }, 'accessToken');
|
|
return { access_token: accessToken };
|
|
}
|
|
|
|
async verifyRefreshToken(refreshToken: string) {
|
|
const payload = this.verifyToken(refreshToken, 'refreshToken');
|
|
return payload;
|
|
}
|
|
|
|
async verifyAccessToken(accessToken: string) {
|
|
const payload = this.verifyToken(accessToken, 'accessToken');
|
|
return payload;
|
|
}
|
|
|
|
async logout(refreshToken: string) {
|
|
return RefreshToken.destroy({ where: { token: refreshToken } });
|
|
}
|
|
|
|
|
|
//google services
|
|
|
|
async googleOauthRedirect(user) {
|
|
console.log("user in service is", user);
|
|
if (!user.email) {
|
|
return {
|
|
statusCode: 400,
|
|
message: 'User not found'
|
|
}
|
|
}
|
|
console.log("user.email in service is", user.email);
|
|
let existingUser = await User.findOne({ where: { email: user.email } });
|
|
if (!existingUser) {
|
|
existingUser = await User.create({
|
|
email: user.email,
|
|
name: user.name,
|
|
userTypeCode: 'user'
|
|
});
|
|
|
|
}
|
|
|
|
const payload = existingUser.get();
|
|
const { password, ...rest } = payload
|
|
const accessToken = this.signToken(rest, 'accessToken');
|
|
const refreshToken = this.signToken(rest, 'refreshToken');
|
|
await RefreshToken.create({ email: payload.email, token: refreshToken, type: 'jwt' });
|
|
return {
|
|
statusCode: 200,
|
|
access_token: accessToken,
|
|
refresh_token: refreshToken
|
|
}
|
|
}
|
|
}
|