
endpoint를
/auth로 하는 라우터를 하나 생성해준다.
여기서 중요한 점은 endpoint와 callback함수 사이에 미들웨어를 넣는것이다.
여기서 저 미들웨어의 역활은 콜백으로 넘어가기 전 해당 미들웨어가 실행이 되고 넘어가는것이다.
여기서 구현해야 될 로직은
1. 우선 클라이언트로 받아온 request에서 토큰을 가져온다.
2. 토큰을 decode하여서 user의 정보를 추출한다.
3. 데이터베이스에서 해당 유저와 같은 유저를 찾은 뒤 쿠키에서 받은 토큰과 데이터베이스 토큰이 같은지 확인한다.
4. 해당결과값에따라 next를 호출하거나 response를 호출한다.
위의 로직을 우선 하기전에middleware/auth.js파일을 생성한다.
그리고 requst의 쿠키에서 토큰을 가져와 비교한다.
그리고 해당 토큰을 User model에서 정의한
findByToken메서드를 이용하여 유효한 토큰인지 찾아준다.
그러기 위해서findByToken을 정의하는데, 이때userSchema.methods.findByToken => X userSchema.statics.findByToken => O위처럼 메서드를 정의한다. 그 이유는 미들웨어에서는 user의 인스턴스가 아닌 User객체 자체에서 전역으로 정의된 메서드를 사용할꺼기 때문이다.
그래서 메서드를 위와같이 정의해 준다.
그 다음jwt를 이용하여 토큰을 디코드 해준다.
이 때 사용하는 메서드는verify()메서드를 이용한다.
해독하여 받아온 유저정보를 이용하여 데이터베이스의 유저 정보와 비교를 한다.
그리고 비교하여 나온 user값을 callback에 전해준다.
그럼 이제 만들어진 메서드를 이용하기위해서 여기서도 User를 import한다.
그런 다음 해당 메서드에 token과 콜백함수를 넣어 호출한다.
해당 콜백은 아래와 같이 정의한다.
err가 발생하면 에러를 던져주고, 유저가 없다면 인증이 안되었다고 응답을 해준다.
그리고 해당 유저가 존재한다면 reqest에 토큰과 유저를 담아 보내준다.
그럼 이제 미들웨어가 정상적으로 통과되었다면 해당 라우터까지 올것이고, 통과가 안되었다면 그전에 응답을 보냈을 것이다.
그럼 라우터에서는 이제 정상적인 처리만 해주면 되고, 응답으로 유저의 정보를 한번 넘겨줘보겠다.
위의 로직을 테스트하기 위해서 포---스트맨을 이용하여 로그인한 뒤 URI를 날려보았다.
우선 로그인을 하고
그런 다음 인증이 되는지 날렸더니
잉? 아무반응이 없다.. 무엇이 문제인가...!
콘솔들을 찍어보지만 아무데서도 콘솔이 안찍힌다...
auth부터 안찍히는것인데.;;;
...
..
.
일단 포스트맨을 강제종료하고 회원가입부터 다시하니깐 결과가 나오긴한다.. 하지만
인증이 안되는 것인데 콘솔을 찍어보며 데이터를 확인해보니
토큰을 디코드해서 나온 객체는 유저정보가 아니라 디코드된 정보가 있었고 그안에_doc라는 키에 유저정보가 있었던것이다.그래서 디코드를 해준것에서
._doc로 하나씩 더 들어가게 했더니
예스!! 성공적으로 인증이 되었다고 나온다.