ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #13 Auth 기능 만들기
    Node.js/[챕터1] 2021. 6. 8. 00:28
    728x90

    [1] middleware 폴더생성 auth.js 파일생성

    /middleware/auth.js
    
    const { User } = require("../models/User");
    
    let auth = (req, res, next) => {
        //인증 처리를 하는곳
    
        //클라이언트 쿠키에서 토큰을 가져온다.
        let token = req.cookies.x_auth;
        //토큰을 복호화 한후 유저를 찾는다.
        User.findByIdToken(token, (err, user) => {
            if(err) throw err;
            if(!user) return res.json({ isAuth : false, err: true})
    
            //라우터에서 req.token , req.user이런식으로 사용할 수 있게 할려고 넣어줌
            req.token = token;
            req.user = user;
            next();
        })
        //유저가 있으면 인증 Okay
    
        //유저가 없으면 인증 NO!
    }
    
    module.exports = {auth};

    [2] 라우터에 auth추가하기

    index.js
    
    const { auth } = require("./middleware/auth");
    // 위에 추가
    
    
    //role 0 -> 일반유저 role 0이 아니면 관리자
    app.get('/api/users/auth', auth, (req, res) =>{
      //auth 미들웨어가 성공적으로 통과했을때!
      res.status(200).json({
        _id : req.user_id,
        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
      })
    })

    [3]User모델에 findByIdToken추가

    userSchema.statics.findByIdToken = function(token, cb){
        let 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)
            })
            
        })
    }

     

    728x90
Designed by Tistory.