boiler-plate authentication 기능

강정우·2022년 10월 18일
0

node.js

목록 보기
3/3
post-thumbnail
post-custom-banner

1. auth route

why?

  • 페이지 이동 때마다 로그인되있는지 안되어있는지, 관리자 유저인지등을 체크
  • 글을 쓸때나 지울때 같은데 권한이 있는지 같은것도 체크

how?

  • 저번 토큰화 할때 토큰 생성 후 userDB와 Cookie에 둘다 등록해두었다.
  1. Cookie에서 저장된 Token을 Server에서 가져와서 복호화를 한다.
  2. 복호화를 하면 User ID가 나오는데 그 User ID를 이용해서 DB User Collection에서 유저를 찾은 후 쿠키에서 받아온 token이 유저도 갖고있는지 확인
    3-1. [쿠키 일치 O] :
    3-2. [쿠키 일치 X] : Authentication False

index.js

app.get('/api/users/auth', auth, (req, res)=>{
  })
})
  • 우선 틀만 만들어준다. 그리고 auth라는 미들웨어를 넣어준다.
    이 미들웨어란 엔트포인트에서 request를 받은 후 cb함수 작동 전 그 사이에 작동하는 함수이다.

auth.js

  • 이곳에서는 실제로 동작(web token과 server token이 일치하는지)하는 부분을 작성하면 된다.
  • 앞서 언급했듯 auth.js는 미들웨이이기에 전용 폴더를 만들어서 관리를 해주면 편하다.

이때 middleware 폴더는 root directory에 만들어주어야 한다.

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.user = user;
        next();
    })
}

module.exports = {auth};
  • req 객체의 token과 user정보를 다시 넣어서 다음 함수로 가야 페이지에서 확인할 수 있다.

User.js

  • 복보화 함수 작성
userSchema.statics.findByToken = function(token, cb){
    var user = this;

    // 토큰을 decode 한다.
    jwt.verify(token, 'secretToken', function(err, decoded){
        // 유저 id를 이용해서 유저를 찾은 다음
        // 클라이언트에서 가져온 token과 db에 보관된 토큰이 일치하는지 확인
        
        user.findOne({ '_id': decoded, 'token':token}, function(err, user){
            if(err) return cb(err)
            cb(null, user)
        })
    })
}

index.js

app.get('/api/users/auth', auth, (req, res)=>{
  res.status(200).json({
    _id:req.user._id,
    idAdmin:req.user.role === 0? false:true,  // 여기는 role이 뭐냐에 따라 언제든 바뀔 수 있는 코드임.
    isAuth : true,
    email : res.user.email,
    name : res.user.name,
    lastname : res.user.lastname,
    role : res.user.role,
    image : res.user.image
  })
})

함수 작성 순서

큰 뼈대부터 함수틀만 잡아주고 세부적인 동작기능부터 만든다음 다시 큰 뼈대쪽으로 빠져나오면서 완성시킨다.

profile
智(지)! 德(덕)! 體(체)!
post-custom-banner

0개의 댓글