페이지 이동 때마다 로그인 여부 및 관리자 여부 등을 체크 하거나
글쓰기 및 수정 권한을 체크하기 위해 Auth route를 이용할 수 있다.

 

 

// index.js
const {auth} = require("./middleware/auth");

app.get('/api/users/auth', auth, (req, res) => {
  // 미들웨어를 통과한 후 실행되는 코드 => Authentication이 True 이다.
  // 성공했으므로 user 정보를 제공해준다. 페이지에서 user정보를 이용할 수 있어 편하다.
  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
  })

})

index.js 에서는 '/api/users/auth' 요청이 들어오면 미들웨어인 auth가 먼저 실행된다.

auth에서 인증처리 완료 후 성공하면 user의 정보를 제공해준다.

 

 

// 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에 넣어준다
        req.token = token;
        req.user = user;

        next(); // 미들웨어이기 떄문에 next 해줘야 한다.
    })
}

module.exports = { auth };

미들웨어 auth 에서는 쿠키에 x_auth로 저장했던 토큰을 가져와 복호화를 한다.유저인증에 성공하면 토큰과 유저정보를 request에 저장한다.

 

 

// models/User.js

userSchema.statics.findByToken = function (token, cb) {
    var user = this;

    // 토큰을 decode 한다.
    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);
        })
    })
}

 

User.js에서는 쿠키에 저장된 토큰을 이용해 DB에서 user를 찾는다.

쿠키에 저장된 토큰과 서버에 저장된 토큰이 일치하는지 확인 후 사용자 정보를 전달해준다.

 

 

 

 

github

'Study > react' 카테고리의 다른 글

[React] Axios 및 Proxy 설정  (0) 2021.10.27
[React] react-router-dom  (0) 2021.10.27
[Node js] JWT 를 이용한 로그인  (0) 2021.10.04
[Node js] Bcrypt로 비밀번호 암호화  (0) 2021.09.27
[Node js] NodeMon 이용하기  (0) 2021.09.27

+ Recent posts