본문 바로가기
Front-end/Node.js

#8. Auth 기능 만들기

by 예닌잉 2020. 12. 26.
728x90

 

Auth 를 왜 만들어야 하나 😉 ?

1. 페이지 이동 시 로그인되어있는지 안되어있는지, 관리자 유저인지 등을 체크

2. 글을 작성하거나 지워야 할 때,  권한이 있는지 체크

 

 

How !!

 

1. Cookie 에서 저장되어있는 Token을 Server에 가져와서 복호화를 한다.

2. 복호화를 하면 User ID가 나오게 된다. 그러한 User ID 를 이용하여 데이터베이스 User Collection에서 유저를 찾은 후, 쿠키에서 받아 온 token이 유저도 갖고있는지를 확인한다.

 

 

 

User.js

// user.js

...

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

    // 토큰을 decode 한다.
    // jsonwebtoken 에 작성되어 있는 코드이다.
    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)
       });
    });

}
...

 

 

 

middleware/auth.js

// midleware/auth.js

const { User } = require('./model/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.js({ isAuth: false, error: true })

            req.token = token;
            req.user = user;
            next(); // next 하는 이유 : middleware 과정이 끝난 후 계속 진행 가능하도록 사용

        });

        // 유저가 있으면, 인증 OK

        // 유저가 없으면 인증 NO !

    };

    module.exports = { auth };

 

 

 

index.js

// index.js

...

// 예시 , role != 0 ( 어드민 ) , role === 0 ( 일반 유저 )
app.get('/api/users/auth', auth, (req, res) => {

    // 여기까지 미들웨어를 통과해 왔다는 이야기는 ? Authentication 이 True 라는 말.
    res.status(200).json({
        _id: req.user._id,
        isAdmin: req.user.role === 0 ? false : true,
        email: req.user.email,
        name: req.user.name,
        lastname: req.user.lastname,
        role: req.user.role,
        image: req.user.image
    })
});
반응형