For Programmer

9.Auth기능 만들기 - boiler-plate 제작(backend) 본문

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

9.Auth기능 만들기 - boiler-plate 제작(backend)

유지광이 2020. 8. 1. 15:08
728x90

1.document를 생성하지 않아도 접근할 수있는 사용자정의 메서드 만들기(몽고DB 제공기능)

*static라는 기능을 이용하며 토큰의 정보를 입력했을때 해당 토큰을 복호화 하여 해당유저가 있을경우 그정보를 넘겨주는 코드(models-User.js)

const jwt = require("jsonwebtoken");
userSchema.statics.findByToken = function (token, cb) {
  var user = this;

  //토큰을 decode한다.
  jwt.verify(token, "secretToken", function (err, decoded) {
    //decoded:복호화된_id값
    //유저아이디를 이용해서 유저를 찾은 다음에 클라이언트에서 가져온 token과
    //DB에 보관된 토큰이 일치하는지 확인
    //저장할때 user._id + 'secretToken'으로 저장했기 때문에 복호화할때도
    //'secretToken'때고 user_.id만 복호화해서 decoded에 저장됨

    user.findOne({ _id: decoded, token: token }, function (err, user) {
      if (err) return cb(err);
      cb(null, user);
    });
  });
};

2. middleware 만들기(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에 넣으면 index.js에있는 app.get에 req에서 사용가능
        req.user =user; //상동
        next(); //index.js에서 app.get( ~~, auth ,~~) 인데 next를안해주면 다음으로안너어감
    })
    //유저가 있으면 인증 okay

    //유저가 없으면 인증 no!
}

module.exports = auth;

3. 라우터에 auth 통신하는 함수 만들기(routes-user.js)

router.get("/auth", auth, (req, res) => {
  //여기까지 미들웨어를 통과해 왔다는 얘기는 Authentication 이 True라는말
  res.status(200).json({
    _id: req.user._id,
    isAdmin: req.user.role === 0 ? false : true, //0이면 일반유저,0이아니면 관리자
    isAuth: true,
    email: req.user.email,
    name: req.user.name,
    lastname: req.user.lastname,
    role: req.user.role,
    image: req.user.image,
  });
});

 

*static으로 만든 메서드와 methods 로 만든 메서드의 차이점

static으로 userschema에 등록하면 굳이 생성자(다큐먼트생성)없이 바로 User.함수명 으로 접근할 수있다. userschema.method로 메서드를 정의하게 되면 메서드를 사용하기 위해 생성자로 다큐먼트를 생성하는 작업이 필요하다.

-> const user = new User(req.body);

 

동영상강의

 

728x90
Comments