NEST JS에서의 인증
인증이란
우리가 누구인지 어떤사람인지 증명하는 절차
인증이 없다면 보안성이 많이 취약할거고 인증이 있기에 우리가 누구인지 증명하고 프로그래밍을 할 수 있다.
웹서비스에서 인증은 필수
우리를 증명하기 위해서는
유저라는 뼈대를 만들어야한다.
NESTJS에서 뼈대는 명령어로 만들 수있다.
nest g resource user
USER.ENTITY.TS
import { IsString } from 'class-validator';
import {
Column, CreateDateColumn, DeleteDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn
} from 'typeorm';
@Entity({
name: 'users',
})
export class User {
@PrimaryGeneratedColumn()
id: number;
@IsString()
@Column('varchar', { length: 10, nullable: false })
userId: string;
@IsString()
@Column('varchar', { length: 10, select: false, nullable: false })
password: string;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@DeleteDateColumn()
deletedAt?: Date;
}
CREATE-USER.DTO.TS
import { PickType } from '@nestjs/mapped-types';
import { User } from '../entities/user.entity';
export class CreateUserDto extends PickType(User, [
'userId',
'password',
] as const) {}
USER.SERVICE.TS
import _ from 'lodash';
import { Repository } from 'typeorm';
import {
ConflictException,
Injectable,
NotFoundException,
UnauthorizedException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from './entities/user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User) private userRepository: Repository<User>,
) {}
async login(userId: string, password: string) {
const user = await this.userRepository.findOne({
where: { userId, deletedAt: null },
select: ['id', 'password'],
});
if (_.isNil(user)) {
throw new NotFoundException(`유저를 찾을 수 없습니다. ID: ${userId}`);
}
if (user.password !== password) {
throw new UnauthorizedException(
`유저의 비밀번호가 올바르지 않습니다. ID: ${userId}`,
);
}
}
async create(createUserDto: CreateUserDto) {
const existUser = await this.findOne(createUserDto.userId);
if (!_.isNil(existUser)) {
throw new ConflictException(
`이미 가입된 ID입니다. ID: ${createUserDto.userId}`,
);
}
return await this.userRepository.save(createUserDto);
}
checkUser(userPayload: any) {
return `유저 정보: ${JSON.stringify(userPayload)}}`;
}
private async findOne(userId: string) {
return await this.userRepository.findOne({
where: { userId, deletedAt: null },
select: ['userId', 'createdAt', 'updatedAt'],
});
}
}
npm i @nestjs/jwt
NEST/JWT설치 명령
USER 모듈에 JWT을 설정
import { Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { JwtModule } from '@nestjs/jwt';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
imports: [
TypeOrmModule.forFeature([User]), // 이건 TypeORM 강의 시간에 배웠죠?
JwtModule.registerAsync({
useFactory: (config: ConfigService) => ({
// .env 파일에 JWT_SECRET_KEY라는 키로 비밀키를 저장해두고 사용합니다.
secret: config.get<string>('JWT_SECRET_KEY'),
}),
inject: [ConfigService],
}),
],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
또한 JWT가 필요한 USERSERVICE에
가 필요하다.