[Node.js] 인증 라우터 구현

kwonseokki·2022년 8월 20일
0

node

목록 보기
5/8

token 값을 만들어서 회원정보에 입력하는것 까지는 구현이 되었다
그리고 인증이 필요한 페이지에서 인증을 해주는 라우터를 구현하고있다
쉽지 않다

index.js

app.get("/api/users/auth", auth, (req, res) => {
  // 여기까지 미들웨어를 통과해 왔다는 얘기는 인증이 true 라는 말
  res.status(200).json({
    _id: req.user._id,
    isAdmin: req.user.role === 0 ? false : true,
    isAuth: true,
    email: req.user.name,
    lastname: req.user.lastname,
    role: req.user.role,
  });
});

index.js 에서는 단순히 user의 정보를 json 으로 뿌려준다
그전의 과정이 중요하다 auth 라는 미들웨어를 살펴보자
*미들웨어란 중간다리 같은 역할이다 처리를 하기전에 중간에 거쳐가는 역할

auth.js

const { User } = require("../models/User");
let auth = (req, res, next) => {
  // 인증처리를 담당할 미들웨어

  // 1.클라이언트 쿠키에서 토큰값을 가져옴
  let token = req.cookies.x_auth;
  // 2.토큰을 복호화 한후 유저를 찾는다.
  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();
  });
  // 3.유저가 있으면 인증O

  // 4.유저가 없으면 인증X
};

module.exports = { auth };

auth req, res, next 를 받아와서 요청한 정보를 기반으로
성공 혹은 실패를 판별해주는 미들웨어 인듯하다(추측)

findByToken 이라는 method에 token 과 콜백함수를 넘겨주고 있다
findByToken 을 살펴보자

User.js

userSchema.statics.findByToken = function (token, cb) {
  var user = this;
  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);
    });
  });
};

첫번째로 jwt.verify 함수로 현재 클라이언트에 저장되어있는 토큰을 복호화 한다
복호화된 값은 _id값이며 회원정보중 _id값이 복호화된 토큰값인지를 찾는다
찾았다면 해당 회원정보의 token 값이 현재 클라이언트측에 저장된 token 값인지도 검사한다.
만약 정보가 틀리다면 콜백함수로 err객체를 넘겨주며
정보가 일치한다면 user 정보를 콜백함수로 넘겨준다.

auth.js

const { User } = require("../models/User");
let auth = (req, res, next) => {
  // 인증처리를 담당할 미들웨어

  // 1.클라이언트 쿠키에서 토큰값을 가져옴
  let token = req.cookies.x_auth;
  // 2.토큰을 복호화 한후 유저를 찾는다.
  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();
  });
  // 3.유저가 있으면 인증O

  // 4.유저가 없으면 인증X
};

User.js 에서 콜백함수로 user 정보를 넘겨주면
req.token= token;
req.user = user;
req.user 를 findByToken 에서 쿼리한 user의 정보로 바꿔준다.

index.js

app.get("/api/users/auth", auth, (req, res) => {
  // 여기까지 미들웨어를 통과해 왔다는 얘기는 인증이 true 라는 말
  res.status(200).json({
    _id: req.user._id,
    isAdmin: req.user.role === 0 ? false : true,
    isAuth: true,
    email: req.user.name,
    lastname: req.user.lastname,
    role: req.user.role,
  });
});

authentication 이 유효한 상태이니깐
성공한 정보를 json 객체로 만들어서 응답해준다.

헷갈리는 부분이 많다
많이 해보면서 감을 익혀야겠다.

profile
프론트개발자가 되고싶어요

0개의 댓글