본문 바로가기

개발/JavaScript

[Node.js] Auth route, Logout Route

 

Auth route

- 페이지 이동 때마다 로그인 여부와 권한 확인

- 글쓰기/수정/삭제 시 권한 체크

 

Cookie에 저장된 Token을 Server로 가져와 복호화 -> User ID

  - middleware/auth.js 생성: 인증 처리

//User.js
userSchema.statics.findByToken = function(token, cb) {
  const user = this;

  // user._id + '' = token

  // 토큰 decode
  jwt.verify(token, 'secretToken', function(err, decoded) { // decoded == user._id
    
    // 유저아이디를 이용하여 유저를 찾고 클라이언트에서 가져온 token과 DB 보관 토큰 일치 확인
    user.findOne({ "_id": decoded, "token": token}, function(err, user) {
      if(err) return cb(err)
      cb(null, user)
    })
  });
}
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; // next 함수로 전달
    req.user = user;
    next();
  })
  
}

module.exports = { auth };
// role 0 -> 일반유저
app.get('/api/users', auth, (req, res) => {
  
  // Authentication: true
  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
  })
  
})

 

Logout Route

- 로그아웃 하려는 유저를 DB에서 찾아 토큰 삭제

app.get('/api/users/logout', auth, (req, res) => {

  User.findOneAndUpdate( { _id: req.user._id }, { token: "" }, (err, user) => {
    if(err) return res.json({ success: false, err });
    return res.status(200).send({
      success: true
    })
  })
})

 

'개발 > JavaScript' 카테고리의 다른 글

[TypeScript] Functions  (0) 2022.08.04
[TypeScript] Types  (0) 2022.08.04
[Node.js] login route  (0) 2022.07.22
[Node.js] 정보보호, Bcrypt  (0) 2022.07.21
[Node.js] npm, express, mongoDB, 라이브러리  (0) 2022.07.21