Closed wochae closed 1 year ago
-nest g module auth ( auth module generate ) -nest g controller auth --no-spec ( controller ) -nest g service auth --no-spec ( service )
repository 문제 발견 이번엔 모듈에 제대로 넣었는데 발생한 것. 그러면 이전 버전이라서 의존성에 문제라고 본다. repo 안에 datasource 첨부를 시도
유저 유효성 검사 (class-validator)
이름에 유니크한 값 주기
테스트에서는 같은 이름의 유저를 생성하려고 하면 500 에러가 반환된다. NestJS 에서 에러 발생하고 그걸 try catch 에서 잡아주지 않으면 이 에러가 컨트롤러 단에 가서 그냥 500 으로 뱉는다. ( 어떤 에러 상태코드인지 알려줘야하게 때문에 ) 포스트맨으로 중복 이름인 경우 뱉는 아 근데 이 강의, 이전 버전이라 엔터티가 유니크 데코를 사용할 때 디비에 접근하지 못한다 ( 의존적이기도 하고 )
비밀번호 암호화 하기 npm install bcryptjs --save
genSalt () 로 hash(pw, salt) 감자에 소금 뿌리는 건가?
클라이언트에서 온 Headers + 클라이언트에서 온 Headers + 서버에서 가지고 있는 Secret Text 가 합쳐진다.
jwt 를 이용해서 토큰 만들기 @nestjs/jwt @nestjs/passport passport passport-jwt
설치방법 npm install @nestjs/jwt @nestjs/passport passport passport-jwt --save
Secret
Expiresion
로그인 성공 시 JWT로 토큰 생성해주기 !!
패스포트, jwt 를 이용해서 토큰 인증 후 유저 정보 가져오기 이건 강의에서 클래스다이어그램을 참조해야할 듯.. npm install @types/passport-jwt --save
클라(브라우저) -> 서버 요청 서버는 유저 정보를 토대로 토큰을 생성 서버는 토큰, 유저 정보를 토대로 만든, 다시 클라에 반환, http response header 안에다 토큰을 넣어서 클라는 쿠키 안에 토큰을 저장 여기까지 진행 근데 브라우저 없이 진행하니깐 다음 시간에 하는 커스텀 데코레이터에서 테스트 작성하는 걸로 포스트맨을 통해 확인하는 것을 구현
현재 해야할 부분이 5번과 6번 토큰을 가지고 요청을 보내면그 토큰이 유효성 유무로, payload 안에 info 를 이용해서 db 내 있는 유저인지 확인 후 있다면 유저 객체, 아니라면 에러를 반환. Passport 모듈을 이용하면 더 쉽게 처리할 수 있다. jwt 구조 헤더: 토큰에 메타 데이터 페이로드: 유저 정보, 만료 기간, 주제 검증 서명: 이 곳에서 이 토큰이 유효한 지 먼저 확인을 한다. 그 다음에 페이로드에서 유저 이름을 가지고 온 다음에 데이터베이스 접근~ 이런 식
AuthModule 에 있는 JwtModule.register 안에 secret 키는 토큰을 생성할 때 쓰는 것이고 jwt.strategy.ts 에 있는 super({ secretOrkey는 토큰을 확인할 때 사용함
NestJS에 여러가지 미들웨어 ( Pipes, Filters, Guards, Interceptors ) Pipes : 요청 유효성 검사 및 페이로드 변환을 위해 만들어짐, 데이터를 예상한 대로 직렬화. Filters : 오류 처리 미들웨어, 특정 오류 처리기를 사용할 경로와 각 경로 주변의 복잡성을 관리하는 방법을 제시함 Guards : 인증 미들웨어, 지정된 경로로 통과할 수 있는 사람과 아닌 사람을 서버에 알려줌. Interceptors : 응답 매핑 및 캐시 관리와 함께 요청 로깅과 같은 전후 미들웨어, 각 요청 전 후에 유용한 기능들을 실행할 수 있다.
각각 호출 순서 middleware -> guard -> interceptor (before) -> pipe -> controller ->service -> controller -> interceptor (after) -> filter ( if application ) -> client
아 너무 많은 일이 있었다. 근데 해결한 방법은 모듈에서 providers : [ ... , UserRepository ] 얘 없어서 가입이 안된 것 같은데 지금 한 번 해봄 아 맞네 짜증난다 ㅋㅋ
커스텀 데코레이터로 유저 객체만 얻어오기 여태 req. 의 불필요한 정보가 너무 많았기 때문에 ExecutionContext 타입 ctx에 .switchToHttp().getRequest() 하면 유저객체만 달랑 뽑아올 수 있다
유저 객체가 undefined 로 나오는 이유를 알고 싶다 저 데코가 있어야 한다. 리퀘스트 객체 안에 유저 객체가 있다는 전제 하에 추출하기 때문 반환 타입을 보장해주는 역할인가?
유저에게 게시물 접근 권한 부여 ( 미들웨어 - 가드 ) 요청 시 올바른 토큰 값 소지 여부를 파악한다. 각 라우트 별로 줄 수 있고, 한 번에 하나의 컨트롤러 안에 속한 모든 라우트에도 줄 수 있다.
보드 컨트롤러에 가드를 넣었다. 그렇게 해서 인가 받은 유저가 토큰을 이용해서 전체 게시물을 볼 수 있게 바뀌게 되었다.
후기 모듈에 대해서 좀 더 공부해야겠다. 결국엔 컨트롤러 프로바이더 export import 문제, 각각 엮이면 오류나는 원인과 원리를 찾아서...
다음 커밋은 이번 주말 간 개인 과제로 인해 휴재입니다. 월요일엔 다음 이슈 auth로 찾아옵니다. ( 섹션 8 )