wochae / nestj

nestj
0 stars 0 forks source link

[Feat] : User #7

Closed wochae closed 1 year ago

wochae commented 1 year ago
wochae commented 1 year ago

-nest g module auth ( auth module generate ) -nest g controller auth --no-spec ( controller ) -nest g service auth --no-spec ( service )

wochae commented 1 year ago

repository 문제 발견 이번엔 모듈에 제대로 넣었는데 발생한 것. 그러면 이전 버전이라서 의존성에 문제라고 본다. repo 안에 datasource 첨부를 시도

wochae commented 1 year ago

유저 유효성 검사 (class-validator)

wochae commented 1 year ago

이름에 유니크한 값 주기

  1. repository 에서 findOne 메소드로 존재 유무로 생성 결정. ( 디비 처리를 두 번이나 해야함. )
  2. 디비 레벨에서 중복 값을 발견하면 에러를 던져주는 방법
wochae commented 1 year ago

테스트에서는 같은 이름의 유저를 생성하려고 하면 500 에러가 반환된다. NestJS 에서 에러 발생하고 그걸 try catch 에서 잡아주지 않으면 이 에러가 컨트롤러 단에 가서 그냥 500 으로 뱉는다. ( 어떤 에러 상태코드인지 알려줘야하게 때문에 ) 포스트맨으로 중복 이름인 경우 뱉는 아 근데 이 강의, 이전 버전이라 엔터티가 유니크 데코를 사용할 때 디비에 접근하지 못한다 ( 의존적이기도 하고 )

wochae commented 1 year ago

비밀번호 암호화 하기 npm install bcryptjs --save

genSalt () 로 hash(pw, salt) 감자에 소금 뿌리는 건가?

wochae commented 1 year ago

클라이언트에서 온 Headers + 클라이언트에서 온 Headers + 서버에서 가지고 있는 Secret Text 가 합쳐진다.

wochae commented 1 year ago

jwt 를 이용해서 토큰 만들기 @nestjs/jwt @nestjs/passport passport passport-jwt

설치방법 npm install @nestjs/jwt @nestjs/passport passport passport-jwt --save

Secret

Expiresion

wochae commented 1 year ago

로그인 성공 시 JWT로 토큰 생성해주기 !!

  1. 서비스에서 SignIn 메소드 생성 auth 모듈에 JWT 등록으로 서비스 단에서 JWT 가져올 수 있음.
wochae commented 1 year ago
  1. Token 생성은 Secret 과 Payload 가 필요합니다. Payload 에는 자신의 전달할 정보, ( ex. Role , Username, email ..) 민감 정보 주의 Payload 이용해서 JWT에서 토큰을 만들 때 사용하는 Sign 메소드를 이용해서 토큰 생성
wochae commented 1 year ago

패스포트, jwt 를 이용해서 토큰 인증 후 유저 정보 가져오기 이건 강의에서 클래스다이어그램을 참조해야할 듯.. npm install @types/passport-jwt --save

wochae commented 1 year ago

클라(브라우저) -> 서버 요청 서버는 유저 정보를 토대로 토큰을 생성 서버는 토큰, 유저 정보를 토대로 만든, 다시 클라에 반환, http response header 안에다 토큰을 넣어서 클라는 쿠키 안에 토큰을 저장 여기까지 진행 근데 브라우저 없이 진행하니깐 다음 시간에 하는 커스텀 데코레이터에서 테스트 작성하는 걸로 포스트맨을 통해 확인하는 것을 구현

wochae commented 1 year ago
image
wochae commented 1 year ago

현재 해야할 부분이 5번과 6번 토큰을 가지고 요청을 보내면그 토큰이 유효성 유무로, payload 안에 info 를 이용해서 db 내 있는 유저인지 확인 후 있다면 유저 객체, 아니라면 에러를 반환. Passport 모듈을 이용하면 더 쉽게 처리할 수 있다. jwt 구조 헤더: 토큰에 메타 데이터 페이로드: 유저 정보, 만료 기간, 주제 검증 서명: 이 곳에서 이 토큰이 유효한 지 먼저 확인을 한다. 그 다음에 페이로드에서 유저 이름을 가지고 온 다음에 데이터베이스 접근~ 이런 식

wochae commented 1 year ago

AuthModule 에 있는 JwtModule.register 안에 secret 키는 토큰을 생성할 때 쓰는 것이고 jwt.strategy.ts 에 있는 super({ secretOrkey는 토큰을 확인할 때 사용함

wochae commented 1 year ago

NestJS에 여러가지 미들웨어 ( Pipes, Filters, Guards, Interceptors ) Pipes : 요청 유효성 검사 및 페이로드 변환을 위해 만들어짐, 데이터를 예상한 대로 직렬화. Filters : 오류 처리 미들웨어, 특정 오류 처리기를 사용할 경로와 각 경로 주변의 복잡성을 관리하는 방법을 제시함 Guards : 인증 미들웨어, 지정된 경로로 통과할 수 있는 사람과 아닌 사람을 서버에 알려줌. Interceptors : 응답 매핑 및 캐시 관리와 함께 요청 로깅과 같은 전후 미들웨어, 각 요청 전 후에 유용한 기능들을 실행할 수 있다.

각각 호출 순서 middleware -> guard -> interceptor (before) -> pipe -> controller ->service -> controller -> interceptor (after) -> filter ( if application ) -> client

wochae commented 1 year ago

아 너무 많은 일이 있었다. 근데 해결한 방법은 모듈에서 providers : [ ... , UserRepository ] 얘 없어서 가입이 안된 것 같은데 지금 한 번 해봄 아 맞네 짜증난다 ㅋㅋ

wochae commented 1 year ago

커스텀 데코레이터로 유저 객체만 얻어오기 여태 req. 의 불필요한 정보가 너무 많았기 때문에 ExecutionContext 타입 ctx에 .switchToHttp().getRequest() 하면 유저객체만 달랑 뽑아올 수 있다

wochae commented 1 year ago

유저 객체가 undefined 로 나오는 이유를 알고 싶다 저 데코가 있어야 한다. 리퀘스트 객체 안에 유저 객체가 있다는 전제 하에 추출하기 때문 반환 타입을 보장해주는 역할인가?

wochae commented 1 year ago

유저에게 게시물 접근 권한 부여 ( 미들웨어 - 가드 ) 요청 시 올바른 토큰 값 소지 여부를 파악한다. 각 라우트 별로 줄 수 있고, 한 번에 하나의 컨트롤러 안에 속한 모든 라우트에도 줄 수 있다.

wochae commented 1 year ago

보드 컨트롤러에 가드를 넣었다. 그렇게 해서 인가 받은 유저가 토큰을 이용해서 전체 게시물을 볼 수 있게 바뀌게 되었다.

후기 모듈에 대해서 좀 더 공부해야겠다. 결국엔 컨트롤러 프로바이더 export import 문제, 각각 엮이면 오류나는 원인과 원리를 찾아서...

wochae commented 1 year ago

다음 커밋은 이번 주말 간 개인 과제로 인해 휴재입니다. 월요일엔 다음 이슈 auth로 찾아옵니다. ( 섹션 8 )