ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] AUTH 만들기
    node.JS 2022. 1. 1. 22:05

     

     

    페이지 이동 시 로그인이 되어있는 상태인지 CHK 할 수 있어야한다.

    Client쪽 COOKIE 에 저장된 TOKEN을 DECODE 해서 SERVER로 가져온다. 그러기 위해 AUTH를 만든다.

     

     

    request를 받은 후 callback function 하기 전 중간에서 'auth' 받아오기

    middleware/auth.js 만들기

     

     

     

     const { User } = require("../models/User"); //user model 불러오기
    
     let auth = (req,res,next)=>{
         //인증처리
    
         //Client Cookie 에서 Token을 가져온다.
         let token =req.cookies.x_auth; //index.js에서 cookie에 넣을 때 x_auth 라는 이름을 이용하여 넣었다.
    
         //Token을 복호화한 후 유저를 찾는다.
         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(); //index.js 에서 middleware에서 계속 진행할 수 있도록 작성
         })
    
         //유저가 있으면 인증 OK
    
         //유저가 없으면 인증 NO
     }

     

     

    user.js에서 findByToken 

    참고 : token을 decode 하기

    userSchema.statics.findByToken = function(token,cb){
         var user = this;
        // user._id + '' = token
        //token을 decode 한다.
         jwt.verify(token, 'secretToken', function(err,decoded){ //decoded : decode된 user._id
            //user id 이용하여 user 찾은 후 client 에서 가져온 token과
            //DB 에 보관된 token이 일치하는지 확인하기
            user.findOne({"_id": decoded, "token": token}, function(err,user){ //findOnde:mongodb에서 제공하는 메소드
                if(err) return cb(err);
                cb(null,user)
            })
        })
    }

     

    index.js

    const {auth} = require('./middleware/auth');
    app.get('/api/users/auth',auth,(req,res)=>{
         //여기까지 middleware(auth)를 통과했다는 얘기는 authentication이 true 라는 말
         res.status(200).json({
             _id: req.user._id,
             isAdmin: req.user.role === 0? false : true, //0이면 일반 user, 0이 아니면 advisor
             isAuth : true,
             email: req.user.email,
             name: req.user.name,
             lastname: req.user.lastname,
             role: req.user.role,
             image: req.user.image
    
         })
     })

     

     

    728x90
Designed by Tistory.