Archive

Auth Boiler Plate with Node.js-JWT

|

Boiler Plate with Node.js - JWT


JSON Web Token

지난번 포스팅의 token 생성 부분을 이어서 작성한다

클라이언트가 보낸 요청의 이메일이 있으면 genToken 메소드를 사용해 토큰을 생성하고 그것을 쿠키에 담는다

쿠키에 담던 로컬스토리지에 담던 세션에 담던 각각의 장단점이 있지만 여기선 쿠키에 담기로 한다

먼저 token을 만들기 위한 JWT 패키지를 설치한다

npm i --save jsonwebtoken

그러고 User.js Model에 메소드를 추가하자

const jwt = require('jsonwebtoken');

userSchema.methods.genToken = function (cb) {
  var user = this;

  // JWT로 토큰 생성
  var token = jwt.sign(user._id.toHexString(), 'secretToken');

  user.token = token;
  user.save(function (err, user) {
    if (err) return cb(err);
    cb(null, user);
  });
};

secretToken 부분은 임의로 정하면되고, 헥스코드로 변형한 user의 id와 secretToken을 합하여 토큰을 만든다

생성된 토큰을 스키마의 user token 컬럼에 추가하고 user를 save하고 콜백으로 user를 반환한다


쿠키를 생성하거나 요청의 쿠키값을 추출하게 해주는 cookie-parser 패키지를 설치한다

npm i --save cookie-parser

const cookieParser = require('cookie-parser'); // cookie-parser 패키지

app.use(cookieParser()); // cookie-parser 사용

app.post('/api/users/login', (req, res) => {
  // 클라가 요청한 이메일을 DB에서 검색
  User.findOne({ email: req.body.email }, (err, user) => {
    if (!user) {
      return res.json({
        loginSuccess: false,
        message: '아이디가 일치하지 않습니다',
      });
    } else {
      // 이메일이 DB에 있으면 비밀번호 대조
      user.comparePassword(req.body.password, (err, isMatch) => {
        if (!isMatch)
          return res.json({
            loginSuccess: false,
            message: '비밀번호가 일치하지 않습니다',
          });

        // 비밀번호 맞으면 Token 생성
        user.genToken((err, user) => {
          if (err) return res.status(400).send(err);

          // Token을 쿠키에 저장
          res
            .cookie('x_auth', user.token)
            .status(200)
            .json({ loginSuccess: true, userId: user._id });
        });
      });
    }
  });
});

비밀번호 대조에 성공하면 반환받은 user에서 토큰을 꺼내어 쿠키에 저장 후 성공 여부를 JSON으로 응답한다

토큰생성

로그인 성공



참고 자료


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