nestjs_auth/src/auth/auth.service.ts
2022-09-15 17:26:51 +09:00

100 lines
2.8 KiB
TypeScript

/* eslint-disable prettier/prettier */
import { Injectable, UnauthorizedException } from '@nestjs/common'
import { JwtService } from '@nestjs/jwt'
import { Prisma, User } from '@prisma/client'
import { UserDTO } from 'src/user/dtos/user.dto'
import { UserService } from '../user/user.service'
import { jwtConstants } from './guards/jwt.constants'
import * as bcrypt from 'bcrypt'
@Injectable()
export class AuthService {
constructor(
private userService: UserService,
private jwtService: JwtService
) {}
//password 암호화
async getEcryptedPassword(password: string): Promise<string> {
// return await bcrypt
// .hash(password, jwtConstants.password_saltorRounds)
// .catch((e) => {
// throw new Error('암호화 실패' + e)
// })
return password
}
//app.controller.ts에서 AuthGuard('local') 또는 AuthGuard('jwt')용
async validateUser(where: Prisma.UserWhereInput): Promise<any> {
return await this.userService.fetchOne(where)
}
async login(user: User): Promise<any> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { password, ...result } = user
return (result['access_token'] = await this.getAccessToken(user))
}
async register(data: UserDTO): Promise<any> {
data.refresh_token = await this.getRefreshToken(data)
data.password = await this.getEcryptedPassword(data.password)
return await this.userService.add(data)
}
//Access Token 재발행
async reload(refresh_token): Promise<any> {
const user = await this.userService.fetchOne({
refresh_token: refresh_token
})
return await this.getAccessToken(user)
}
//Access Token 및 refresh Token 재발행
async recreate(user: User): Promise<any> {
const tokens = await this.getTokens(user)
await this.userService.update({
where: { id: user.id },
data: { refresh_token: tokens.refresh_token }
})
return tokens
}
async getAccessToken(data: UserDTO): Promise<any> {
const token = await this.jwtService.sign(
{
email: data.email,
name: data.name
},
{
secret: jwtConstants.access_secret,
expiresIn: jwtConstants.access_expiresIn
}
)
return {
token: token,
expiresIn: jwtConstants.access_expiresIn
}
}
async getRefreshToken(data: UserDTO): Promise<any> {
const token = await this.jwtService.sign(
{
email: data.email,
name: data.name
},
{
secret: jwtConstants.access_secret,
expiresIn: jwtConstants.refresh_expiresIn
}
)
return {
token: token,
expiresIn: jwtConstants.refresh_expiresIn
}
}
async getTokens(data: UserDTO): Promise<any> {
return {
access_token: await this.getAccessToken(data),
refresh_token: await this.getRefreshToken(data)
}
}
}