따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part2

2020. 9. 17. 15:21· Programming/Node.js

- Auth 기능 만들기

  •  회원 인증을 하기 위해 사용
  •  쿠키에 저장 된 토큰을 서버에서 가져오고 복호화한다.
  •  복호화 후 userId가 나오는데 이것을 이용하여 DB에서 유저를 찾은 후 쿠키에서 받아온
     토큰이 유저를 가지고 있는지 확인
// auth 미들웨어
app.get('/api/users/auth', auth, (req, res) => {})

 

 

middleware 폴더안에 auth.js 파일 생성

 

const { User } = require('../models/User');

let auth = (req, res, next) => {
    // 인증 처리를 하는 곳
    // 클라이언트 쿠키에서 토큰을 가져온다.
    let token = req.cookies.x_auth;
    // 토큰을 복호화 한 후 유저를 찾는다.
    User.findByToken(token, (err, user) => {
        if (err) {
            throw err;
        }
        if (!user) {
            return res.json({ isAuth: false, error: true});
        }
        req.token = token;
        req.user = user;
        next();
    })
    // 유저가 있으면 인증 Okay
    // 유저가 없으면 인증 No !
}

module.exports = { auth };

 

 

User.js 파일 안에서 findBytoken 메서드 생성

 

userSchema.statics.findByToken = function (token, cb) {
    const user = this;
    // 토큰을 decode(복호화) 한다.
    jwt.verify(token, 'secretToken', function (err, decoded) {
      // 유저 아이디를 이용해서 유저를 찾은 다음에
      // 클라이언트에서 가져온 token과 DB에 보관 된 토큰이 일치하는지 확인
      user.findOne({'_id': decoded, 'token': token}, function (err, user) {
          if(err) {
              return cb(err);
          }
          cb(null, user);
      })
    })
}

 

 

 인증에 성공했으면 user data 응답

 

app.get('/api/users/auth', auth, (req, res) => {
    // 여기까지 미들웨어를 통과해 왔다는 것은 Authentication 이 True 라는 것
    res.status(200).json({
        _id: req.user._id,
        isAdmin: req.user.role !== 0,
        isAuth: true,
        email: req.user.email,
        name: req.user.name,
        lastname: req.user.lastname,
        role: req.user.role,
        image: req.user.image
    });
});

 

- methods와 statics의 차이점

 

  • methods는 객체의 인스턴스를 생성해야 사용이 가능하다.
  • statics는 객체의 인스턴스를 생성하지 않아도 사용이 가능하다(모델 자체를 가리킴)

 - 로그아웃 기능 만들기

 

  • 로그아웃 Route를 만든다.
  • 로그아웃 하려는 유저를 DB에서 찾는다
  • 유저의 토큰을 지워준다.

데이터 베이스에서 토큰을 지워주면 로그아웃 

 

// auth 미들웨어를 사용하는 이유는 req.user 데이터를 사용하기 위함
app.get('/api/users/logout', auth, (req, res) => {
    User.findOneAndUpdate({ _id: req.user._id },
        { token:"" },
        (err, user) => {
            if (err) {
                return res.json({success: false, err});
            }
            return res.status(200).send({ success : true});
        });
});

'Programming > Node.js' 카테고리의 다른 글

[Node.js] Express body-parser 너 뭐냐?  (0) 2021.10.13
[MongoDB] mongoose.connection.on() & once()  (0) 2021.10.13
[Express.js] middleware란??  (0) 2021.10.01
Node.js 교과서 express 미들웨어  (0) 2020.11.27
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part1  (0) 2020.09.11
'Programming/Node.js' 카테고리의 다른 글
  • [MongoDB] mongoose.connection.on() & once()
  • [Express.js] middleware란??
  • Node.js 교과서 express 미들웨어
  • 따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part1
한우콩
한우콩
분할정복
한우콩
Divide and Conquer
한우콩
전체
오늘
어제
  • 분류 전체보기 (88)
    • Programming (42)
      • React (15)
      • JavaScript (8)
      • 트러블슈팅 (1)
      • Node.js (6)
      • Python (7)
      • C (5)
    • 면접준비 (11)
    • 네트워크 (0)
    • 프리온보딩 (8)
    • TIL (9)
    • 회고 (13)
    • 메가테라 (1)
    • 예제 (2)
      • C (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 유데미 #udemy #웅진씽크빅 #스나이퍼팩토리 #인사이드아웃 #미래내일일경험 #프로젝트캠프 #부트캠프 #next.js #프론트엔드개발자양성과정 #개발자교육과정
  • 메가테라 프론트엔드 생존코스
  • 14버전
  • grid column
  • 항해99 취업 리부트 코스 후기#항해99#리부트#취업 리부트#리부트 후기#취업 리부트 후기
  • Next.js
  • zerocho
  • V14
  • v13
  • react
  • 전체 너비
  • webpack cli
  • 그리드 아이템
  • 개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트
  • 제로초
  • z.com
  • 13버전
  • Next
  • z-com
  • EnvironmentPlugin

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
한우콩
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part2
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.