ABOUT ME

Today
Yesterday
Total
  • NEST JS에서의 인증
    카테고리 없음 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;

    가 필요하다.


     

     

     

     

Designed by Tistory.