목록JS (76)
Mini

* GetUser 커스텀 데코레이터 생성import { createParamDecorator, ExecutionContext } from "@nestjs/common";import { User } from "./user.entity";export const GetUser = createParamDecorator((data, ctx: ExecutionContext): User =>{ const req = ctx.switchToHttp().getRequest(); return req.user;}) * 컨트롤러@Post('/test')@UseGuards(AuthGuard())test(@GetUser() user : User){ console.log('user',user);}@GetUser에서 우리가 만든..

우리는 4번까지했음토큰생성후, 클라는 요청을 보낼때 토큰을 같이보내는데, 이 토큰을 검증하는 작업을 할것임! npm install @types/passport-jwt --save * jwt-strategy 구현import { PassportStrategy } from "@nestjs/passport";import { Injectable, UnauthorizedException } from "@nestjs/common";import { ExtractJwt, Strategy } from "passport-jwt";import { InjectRepository } from "@nestjs/typeorm";import { UserRepository } from "./user.repository";import ..

* 개념 * 구현필요한 모듈들 설치하기npm install @nestjs/jwt @nestjs/passport passport passport-jwt --save@nestjs/jwt - nestjs에서 jwt를 사용하기 위해 필요한 모듈 @nestjs/passport - nestjs에서 passport를 사용하기 위해 필요한 모듈 passport - passport 모듈 passport-jwt - jwt 모듈 npm install @nestjs/jwt @nestjs/passport passport passport-jwt --save * 모듈에 import => app에서 사용가능토록@Module({ imports:[ JwtModule.register({ secret:'Secret123..

* 서비스async signIn(authCredentialDto : AuthCredentialsDto) { const {username, password} = authCredentialDto; const user = await this.userRepository.findOneBy({username}); //username으로 user 찾고 //입력받은 비밀번호랑 저장된 비밀번호랑 비교 if(user && (await bcrypt.compare(password, user.password))){ return 'login success' } else{ throw new UnauthorizedException('login failed'); }}📌 bcrypt.compareDB에 실제 ..

npm install bcryptjs --save * salt => 같은비밀번호를 입력해도 다른 해시값이 저장되도록import * as bcrypt from 'bcryptjs'@Injectable()export class UserRepository extends Repository{ ... async createUser(authCredentialsDto : AuthCredentialsDto){ const {username, password} = authCredentialsDto; const salt = await bcrypt.genSalt(); const hashedPassword = await bcrypt.hash(password, salt); const user = this...

* 엔티티에서 @Unique 딸깍import { BaseEntity, Column, Entity, PrimaryGeneratedColumn, Unique } from "typeorm";@Entity()@Unique(['username'])export class User extends BaseEntity{ @PrimaryGeneratedColumn() id: number; @Column() username: string; @Column() password: string;} * 원인 : 에러가 그냥 컨트롤러 레벨로 가서 500에러를 던져버림해결 : 에러를 try catch로 잡아줘야함리포지토리에서 save를 try-catch 안에 넣어주면됨.@Injectable()export class UserR..

* dto 에서 사용import { IsString, Matches, MaxLength, MinLength } from "class-validator";export class AuthCredentialsDto{ @IsString() @MinLength(4) @MaxLength(20) username : string; @IsString() @MinLength(4) @MaxLength(20) @Matches(/^[a-zA-Z0-9]*$/,{message : 'password only accepts english and number'}); password : string;} * 컨트롤러에 파이프 넣어줘야 제대로 작동함@Post('/signup')signUp(@Body(ValidationPipe..

* dto 생성export class AuthCredentialsDto{ username : string; password : string;}* 리포지토리에서 db 접근 메소드 구현@Injectable()export class UserRepository extends Repository{ constructor(dataSource: DataSource) { super(User, dataSource.createEntityManager()); } async createUser(authCredentialsDto : AuthCredentialsDto){ const {username, password} = authCredentialsDto; const user = this.create({u..