카테고리 없음

NEST JS에서의 인증

wooseobsssss 2023. 12. 22. 12:38

인증이란

 

우리가 누구인지 어떤사람인지 증명하는  절차

 

인증이 없다면 보안성이 많이 취약할거고 인증이 있기에 우리가 누구인지 증명하고 프로그래밍을 할 수 있다.

 

웹서비스에서 인증은 필수

 


우리를 증명하기 위해서는

 

유저라는 뼈대를 만들어야한다.

 

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에 

 

 // 추가된 코드 - JWT 토큰 생성
    const payload = { id: newUser.id };
    const accessToken = await this.jwtService.signAsync(payload);
    return accessToken;
  }
    const payload = { id: newUser.id };
    const accessToken = await this.jwtService.signAsync(payload);
    return accessToken;

가 필요하다.