For Programmer

8. 로그인 기능 만들기 - boiler-plate 제작(backend) 본문

React & Node.js 프로젝트/boiler-plate 제작

8. 로그인 기능 만들기 - boiler-plate 제작(backend)

유지광이 2020. 8. 1. 14:39
728x90

1. 사용자 정의 함수 만들기(몽고DB에서 제공하는 기능)

*로그인을 하기 위해서는 로그인정보를 받아서 제공받은 패스워드와 데이터베이스 내의 패스워드를 비교하는 메서드 와 비교했을때 맞을 경우 로그인하기전에 토큰을 생성하는 함수를 collection 내부에 따로 정의해야한다. (models-User.js)

const mongoose = require("mongoose");
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");
const saltRounds = 10;
const moment = require("moment");
userSchema.methods.comparePassword = function (planePassword, cb) {
  bcrypt.compare(planePassword, this.password, function (err, isMatch) {
    //isMatch는 맞으면true를반환
    //1st:사용자가입력하여암호화된패스워드,2nd:기존DB 패스워드,3rd:콜백함수
    if (err) return cb(err);
    cb(null, isMatch);
  });
};
userSchema.methods.generateToken = function (cb) {
  var user = this;
  //jsonwebtoken을 이용해서 토큰을 생성하기
  var token = jwt.sign(user._id.toHexString(), "secretToken"); // user._id+ secretToken이 합쳐진이름으로 토큰이만들어짐
  var oneHour = moment().add(1, "hour").valueOf();

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

* 토큰 생성을 위해서는 꼭 npm install jsonwebtoken --save로 모듈을 다운받아준다.

2.user.js라우터에 로그인을 처리하는 function 만들기(routes-user.js)

const express = require("express");
const app = express();

const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
const config = require("./config/key");

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
router.post("/login", (req, res) => {
  //요청된 이메일을 데이터베이스에서 찾는다.
  User.findOne({ email: req.body.email }, (err, user) => {
    //몽고db에서 제공하는메소드
    if (!user)
      return res.json({
        loginSuccess: false,
        message: "Auth failed, email not found",
      });
    //요청된 이메일이 데이터베이스에 있다면 비밀번호가 일치하는지 확인
    user.comparePassword(req.body.password, (err, isMatch) => {
      if (!isMatch)
        return res.json({ loginSuccess: false, message: "Wrong password" });
      //비밀번호까지 동일하다면 토큰을 생성하기.
      user.generateToken((err, user) => {
        if (err) return res.status(400).send(err); //400이면에러가있으면 err를전달해라는의미
        //토큰을 저장한다. 어디에 ? 쿠키 or 로컬스토리지
        res.cookie("x_authExp", user.tokenExp);
        res.cookie("x_auth", user.token).status(200).json({
          loginSuccess: true,
          userId: user._id,
        });
      });
    });
  });
});

* 쿠키를 사용하기 위해서는 npm install cookie-parser --save 로 쿠키모듈을 다운받아준다.

 

해당강의

 

 

728x90
Comments