티스토리 뷰

Auth 기능이란?
특정 서비스를 로그인한 유저 혹은 관리자 유저 처럼 특정 유저들만 쓸 수 있도록 하는 기능. 

 

1) 쿠키에 저장된 토큰을 서버에 가져와서 복호화한다. 

 

2) 복호화를 하면 user ID가 나오는데,

그 user ID를 이용해서 데이터베이스 User Controller에서 User를 찾은 후,

쿠키에서 받아온 토큰을 갖고 있는지 확인한다. 

userSchema.statics.findByToken = function(token, cb) {
    var user = this;
    
    // verify a token symmetric //토큰을 디코드 한다.
    //decoded -> userId
    jwt.verify(token, 'secretToken', function(err, decoded) {
        //console.log(decoded.foo) // bar
        
        //유저 아이디를 이용해서 유저를 찾은 다음에
        //클라이언트에서 가져온 token과 DB에 저장된 토큰이 일치하는지 확인한다. 
        user.findOne({"_id" : decoded, "token" : token}, function(err, user) {
            if (err) return cb(err);
            cb(null, user);
        });
    });
}

 

3) 쿠키가 비일치시, Authentication False;

쿠키가 일치시,  Authentication True! -> 

../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, err : true}); //유저가 없으면 인증 no.

        //유저가 있으면 인증 Ok
        req.token = token; //req에 넣어주므로, 라우트에서 사용할 수 있도록함. 
        req.user = user;
        next(); //-> 미들웨어이므로, 다음 단계로 전진할 수 있도록함. 
    });
}

module.exports = { auth };

 

4) Authentication 라우트 생성 

유저의 정보들을 json처리 하여 담아 보낸다. 

app.get('/api/users/auth', auth, (req, res) => {
  //여기까지 미들웨어를 통과했다는 얘기는 aus가 통과.
  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
  });

});