JS
[Nest] 커스텀 데코리이터 => controller 코드 간소화
data는 컨트롤러에서 넣어준 인자를 뜻한다.이걸로 원하는 속성만 return 해줄수있다.import { createParamDecorator, ExecutionContext, InternalServerErrorException } from "@nestjs/common";import { UsersModel } from "../entities/users.entity";/** * accessTokenGuard에서 req에 넣어준 user를 검사하고 * 리턴해주는 데코레이터 * @param : usersModel의 key */export const User = createParamDecorator((data: keyof UsersModel | undefined, context : ExecutionContext..
[Nest] DI 실습 export service, import module, Nest can't resolve dependencies of the 해결, 게시글 생성제한 구현
* 문제현재 post 에서 아래와같은 가드를 사용하려고 한다.authService, usersService를 주입받아야 사용가능하다.@Injectable()export class BearerTokenGuard implements CanActivate { constructor(private readonly authService: AuthService, private readonly usersService : UsersService) {} //런타임에서 DI에서 주입해줌* 해결 (Nest can't resolve dependencies of the 해결)가드가 속한, auth 모듈에서 service를 export 해준다.@Module({ imports:[ JwtModule.r..
[Nest] Guard => req에 user 넣기, 로그인 과정 복습, 토큰 타입확인
* 로그인 과정 복습 (Basic token 이용)이메일 : 비밀번호를 encoding Basic Ymfldgkmdfkgdbdfbdf를 요청뒷부분만 파싱다시 디코딩email, pw 나옴db에서 조회user 객체 리턴 * req에 user 넣기/** * req.header.authorization 의 토큰으로 * user를 가와서 * req.user에 넣는 가드 */@Injectable()export class BasicTokenGuard implements CanActivate { constructor(private readonly authService: AuthService) {} //런타임에서 DI에서 주입해줌 async canActivate(context: ExecutionContext): Pr..
[Nest] 커스텀 파이프 => 비밀번호 길이 제한 구현
커스텀 파이프import { BadRequestException, Injectable, PipeTransform } from "@nestjs/common";@Injectable()export class PasswordPipe implements PipeTransform { transform(value: any): any { if(value.toString().length
[Nest] Jwt 토큰 재발급 구현
* 의사코드accesstoken을 header > authorization에 함께 보내야함이를 바탕으로 사용자 구분쓰다가 만료되면 refresh token으로 access token 재발급refresh token도 만료되면 refresh token 재발급access token으로는 절대 재발급 불가 (예외처리) * 구현서비스/** * 토큰 검증 * @param token */ verifyToken(token: string){ return this.jwtService.verify(token, { secret: JWT_SECRET, }); }/** * refresh 토큰 => access 토큰 재발급 * @param token */rotateToken(token: string, isRefreshTo..
[Nest] base64 토큰 인증 구현
* 설계/** * 토큰인증 * * 1) 사용자가 로그인 또는 화원가입을하면, 토큰 발급받는다. * * 2) 로그인 할때는 Basic 토큰과 함께 요청을보낸다. * Basic 토큰 : '이메일:비밀번호'를 Base64로 인코딩한 결과 * ex) {authorization : 'Basic {token}' } * * 3) 아무나 접근 할 수 없는 정보 (private router)를 접근할때는 * access토큰을 헤더에 추가해서 요청과함께 보낸다. * ex) {authorization: 'Bearer {token}'} * * 4) 토큰과 요청을 함께 받은 서버는 토큰 검증을 통해 현재 요청을 보낸 * 사용자가 누구인지 알 수 있다. * ex) 토큰의 sub(id) => 해당 ..
[Nest] JWT 토큰발급 구현, 외부 모듈 import-export 하는법
* 의존성 주입authModule에서 import => DI 컨테이너에 올라감@Module({ imports:[ JwtModule.register({}), ], controllers: [AuthController], providers: [AuthService],})export class AuthModule {}서비스에서 생성자 주입받고 사용할수 있음.@Injectable()export class AuthService { constructor( private readonly jwtService: JwtService ) { } * jwt 의사코드/** * 1) register with email * - email, nickname, password 입력받고 사용자 생성 * ..
[Nest] Relation 생성, 1대다, 다대1 연관관계 구현
엔티티 수정/** * 게시글은 1명의 사용자를 가진다. * 사용자는 게시글 여러개를 가진다. * users 모델에서 posts모델을 표현하는 속성이 posts다. */@ManyToOne(()=>UsersModel, (user)=> user.posts, { nullable: false,})author: UsersModel;/** * 사용자는 여러개의 post를 가진다. * (연동할모델, 반환 모델) * 포스트모델의 어떤 속성하고 연동인지? post.author */@OneToMany(()=> PostsModel, (post) => post.author)posts : PostsModel[]; * 오류원인 : author는 더이상 string이 아니라, user 객체이기 때문.해결 : authorId로 인자..