본문 바로가기
개발/nest.js

nestjs + typeorm backend JWT 로그인 / 소스포함

by 아크투어 2023. 3. 30.
반응형

1. 개요

 

nestjs + typeorm backend 회원가입 / 소스포함 (10)

1. 개요 지금까지 Backend개발을 하기위한 대략적인 프레임워크 작업을 완료하였다. 회원가입까지 완료한 소스 제공한다. 필요하신분은 다운로드해서 사용하길 바란다. 개발소스 : backend.zip nestjs +

arckwon.tistory.com

 

  • JWT토큰 로그인이 적용된 소스는 아래에서 다운로드해서 사용하길 바란다.
  •  db접속정보만 수정해서 사용하면된다.

backend.zip
0.19MB

 

2. JWT 토큰

  • NestJS는 @nestjs/jwt 모듈을 사용하여 JWT 기반 인증을 기본적으로 지원합니다. 이 모듈은 JWT 서명에 사용되는 비밀 키, JWT 만료 시간 등과 같은 옵션으로 구성할 수 있는 'JwtModule'을 제공합니다.
  • NestJS 애플리케이션에서 JWT 기반 인증을 사용하려면 일반적으로 JWT의 유효성을 검사하고 여기에서 사용자 정보를 추출할 수 있는 사용자 지정 'AuthGuard'를 만들어야 합니다. 그런 다음 이 'AuthGuard'를 사용하여 애플리케이션의 경로와 엔드포인트를 보호할 수 있습니다.
  • https://docs.nestjs.com/security/authentication
 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

 

3.설치패키지

  • 아래 패키지를 설치한다.
$ npm install --save bcrypt @types/bcrypt
$ npm install --save @nestjs/jwt passport-jwt
$ npm install --save-dev @types/passport-jwt

$ npm install --save @nestjs/passport passport passport-local
$ npm install --save-dev @types/passport-local

 

 

4. 소스설명

  • auth-user.dto.ts
  • 로그인을 담당할 dto를 생성한다.
// auth-user.dto.ts

export class AuthUserDto {
  userid: string;
  userpw: string;
}

 

  • jwt-auth.guard.ts
  • jwt토큰을 사용하기위한 AuthGuard를 생성한다.
// jwt-auth.guard.ts

import {
  ExecutionContext,
  Injectable,
  UnauthorizedException,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  canActivate(context: ExecutionContext) {
    return super.canActivate(context);
  }

  handleRequest(err, user, info) {
    if (err || !user) {
      throw err || new UnauthorizedException();
    }
    return user;
  }
}

 

  • jwt.strategy.ts
  • jwt를 사용하기위한 설정및 검증
// jwt.strategy.ts

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy, VerifiedCallback } from 'passport-jwt';
import { ConfigService } from '@nestjs/config';
import { AuthService } from '../auth.service';
import { Payload } from './payload.interface';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(
    private readonly authService: AuthService,
    private readonly config: ConfigService,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: config.get<string>('jwt.secret'),
    });
  }

  async validate(payload: Payload, done: VerifiedCallback): Promise<any> {
    const user = await this.authService.tokenValidateUser(payload);

    if (!user) {
      return done(new UnauthorizedException(), false);
    }
    return done(null, user);
  }
}

 

  • payload.interface.ts
  • payload정보
// payload.interface.ts

export interface Payload {
  userid: string;
  emailadres: string;
}

 

 

5. 프로세스

  • 컨트롤러 부분
//로그인
@Post('/signin')
@UseFilters(CustomExceptionFilter)
async signIn(@Res() res: Response, @Body() dto: AuthUserDto): Promise<any> {
    const jwt = await this.authService.signIn(dto);
    res.setHeader('Authorization', 'Bearer ' + jwt.accessToken);
    return res.json(jwt);
}

//토큰인증
@Get('/authenticate')
@UseGuards(JwtAuthGuard)
    getAuth(@Req() req: Request): any {
    const user: any = req.user;
    return user;
}

 

 

6. 테스트

  • 토큰취득

jwt token

 

  • 만료된 토큰일시 401에러 발생

토큰만료

 

  • 헤더에 토큰정보 삽입
  • res.setHeader('Authorization', 'Bearer ' + jwt.accessToken);

jwt token

 

  • 로그인

nestjs jwt token login

 

 

반응형