100 lines
2.8 KiB
TypeScript
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)
|
|
}
|
|
}
|
|
}
|