-
typeorm 기본 구조 만들기 (4) - auth,jwt공부하기/node.js 2022. 1. 24. 16:43
예제 git : https://github.com/kboysm/typeorm_study
아주 간단한 auth관련 예제를 만들어보겠습니다.
npm i jsonwebtoken
1. authController를 만듭니다.( src/controller/AuthController.ts)
import { AuthService } from "../service//AuthService"; import { Body, Get, HttpCode, JsonController, Param, Post, QueryParams, Patch, Res, Delete, UseBefore, } from "routing-controllers"; import { Response } from "express"; import { Inject, Service } from "typedi"; import { LoginDto } from "../dto"; import { PageReq, PageResObj, PageResList } from "../api"; import { QueryFailedError } from "typeorm"; import { CustomValidation, IdValidation } from "../class/CustomValidation"; import { checkAccessToken } from "../middlewares"; @Service() @JsonController("/auth") export class UserController { @Inject() authService: AuthService; // constructor(private userService: UserService) {} @Post("/login") public async create(@Body() loginDto: LoginDto, @Res() res: Response) { const validationResult = await new CustomValidation( loginDto ).checkValidation(); if (validationResult) return validationResult; try { return await this.authService.login(loginDto); } catch (err) { if (err instanceof QueryFailedError) { return new PageResObj({}, err.message, true); } return new PageResObj({}, err.message, true); } } @Get("/user") @UseBefore(checkAccessToken) public async getOne(@Res() res: Response) { try { const { sub } = res.locals.jwtPayload; return await this.authService.getUserInfo(sub); } catch (err) { if (err instanceof QueryFailedError) { console.log("Instance of QueryFailedError!"); return new PageResObj({}, err.message, true); } return new PageResObj({}, err.message, true); } } }
-> @UserBefore을 사용하여 제작한 미들웨어로 토큰을 검사합니다.
2. AuthService를 만듭니다. ( src/service/AuthService.ts)
import { Service } from "typedi"; import { InjectRepository } from "typeorm-typedi-extensions"; import { PageReq } from "../api/PageReq"; import { UserQueryRepo } from "../repository/UserQueryRepo"; import { User, UserInfo } from "../entity"; import { LoginDto } from "../dto"; import { PageResObj } from "../api/PageResObj"; import { generateAccessToken } from "../middlewares"; @Service() export class AuthService { constructor( @InjectRepository() readonly userQueryRepo: UserQueryRepo ) {} async login(loginDto: LoginDto): Promise<PageResObj<string>> { // const findByUserEmail: User = await this.userQueryRepo.findOne(id); const findByUserEmail: User = await this.userQueryRepo.findByEmail( loginDto.email ); if (!findByUserEmail) throw new Error("이메일이 존재하지 않습니다."); if (findByUserEmail.password !== loginDto.password) { throw new Error("비밀번호가 일치하지 않습니다."); } const token = generateAccessToken(findByUserEmail); return new PageResObj(token, "로그인에 성공했습니다."); } async getUserInfo(id: number): Promise<PageResObj<User | {}>> { // const findByUserEmail: User = await this.userQueryRepo.findOne(id); const user = await this.userQueryRepo.findOne(id); return new PageResObj(user, "로그인에 성공했습니다."); } }
로그인 테스트 결과 및 토큰을 사용하여 로그인한 유저 정보를 얻는 결과
'공부하기 > node.js' 카테고리의 다른 글
nodejs backend 면접 질문 정리 (0) 2023.01.18 typeorm 기본 구조 만들기 (5) - swagger (0) 2022.01.24 typeorm 기본 구조 만들기 (3) - repository, service, controller (0) 2022.01.24 typeorm 기본 구조 만들기 (2) - app, index 분리 (0) 2022.01.16 typeorm 기본 구조 만들기 (1) - typeorm 셋팅 (0) 2022.01.16