Archive

Auth Boiler Plate with Node.js-Authentication

|

Boiler Plate with Node.js - Authentication


Authentication

사용자가 제한된 페이지 접근시 로그인된 유저인지 혹은 관리자인지 등을 체크할 수 있는 auth route를 만든다

글 작성, 삭제 등 제한된 액션을 취할때에도 권한이 있는지 여부를 체크할 수도 있다

  1. 클라이언트는 쿠키의 토큰을 서버에 전송한다

  2. 서버에서는 토큰을 decode하여 나온 user ID로 DB에서 해당 유저를 찾는다
  3. 클라에게 받은 토큰과 DB에서 검색한 유저의 토큰을 비교한다
  4. 일치 여부에 맞는 액션을 취한다

먼저, root folder에 middleware 폴더를 만들고 그 안에 auth.js 파일을 만든다

미들웨어가 없으면 무수히 생성될 api 들을 관리하기가 어려워진다

// 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;
    // 유저가 없으면 인증 no
    if (!user) return res.json({ isAuth: false, error: true });

    // 유저가 있으면 인증 ok
    // requst에 토큰과 유저를 담아서 index에서 사용
    req.token = token;
    req.user = user;
    next();
  });
};

module.exports = { auth };

위의 findByToken은 토큰으로 해당 유저를 검색하는 메소드로 User.js에서 정의한다

// User.js

userSchema.statics.findByToken = function (token, cb) {
  var user = this;

  // Token decode => id
  jwt.verify(token, 'secretToken', function (err, decoded) {
    // 유저 아이디로 해당 유저 검색 후 클라의 토큰과 DB의 토큰 일치 여부를 확인
    user.findOne({ _id: decoded, token: token }, function (err, user) {
      if (err) return cb(err);
      cb(null, user);
    });
  });
};
// index.js

const { auth } = require('./middleware/auth');

app.get('/api/users/auth', auth, (req, res) => {
  // 미들웨어 통과 => auth 통과
  res.status(200).json({
    _id: req.user._id,
    // 0 : 일반, 1 이상 : 관리자
    isAdmin: req.user.role === 0 ? false : true,
    isAuth: true,
    email: req.user.email,
    name: req.user.name,
    lastname: req.user.lastname,
    role: req.user.role,
    image: req.user.image,
  });
});



참고 자료


기초 노드 리액트 강의 - John Ahn