ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MERN 기본파일 만들기 - 6) authentification기능 구현하기(middleware사용)
    NODE.JS 2021. 5. 13. 13:39

     

     

    사이트에 들어가서 메뉴를 보면 로그인 한 사람만 자신의 특정 데이터를 볼 수 있도록 지정한다. 

    그런데 페이지를 클릭해서 들어가게 되면 반복해서 로그인을 해야하는 경우가 생기지 않도록 

    로그인 된 정보를 authentification해서 유지되도록 하는 기능을 구현하도록 한다. 

     

    페이지를 이동할때마다 userid가 일치하는지를 확인하기 위해서

    가진 client의 token을 decode해서 server에 보내 user_id확인하는 작업을(복호화) 계속 할것이다. 

     

    이는 middleware를 이용해서 구현하도록 할 것이다. 

     

    다음과 같은 폴더와 파일을 생성해준다.

     

    auth.js파일에 다음과 같은 내용을 입력해준다.

     

     const { User } = require('../models/User'); //auth할때 사용자 정보가 필요하다. 
    
     let auth = (req, res, next )=>{ //인증처리를 한다.
         // token을 생성하고 나서 쿠키에 넣었는데 이를 이용할 것이다. 
         //로그인하고나서 다른페이지(상세페이지나 블로그 등등)로 이동할때 로그인 된 상태에서접근가능하도록 유지한다.
         
         //클라이언트 쿠키에서 토큰을 가져온다.(쿠키파서 이용해서 가져온다)
         let token = req.cookies.x_auth;
    
    
    	//토큰을 복호화 한 후 유저를 찾는다. 
         User.findByToken(token, (err, user)=>{
             if(err) throw err;
             
             if(!user) //유저가 없으면 인증 no!
                return res.json({
                 isAuth: false,
                 error:true
             });
    		
             //유저가 있으면 인증 okay!(토큰과 유저정보 넣어준다)
             req.token = token;
             req.user = user;
             next();//미드웨어에서 다음 것 실행할 수 있도록 보내준다.
         });
     };
    
     module.exports = {auth};//다른 파일에서도 쓸 수 있도록 보내준다

     

     

    User.js파일에 다음과 같은 내용을 추가해준다. (token으로 사용자 찾기)

     

    userSchema.statics.findByToken = function(token, cb){
    
        var user = this;
    
        //토큰을 복호화 한다. (decode)  
        jwt.verify(token, 'secret', function(err, decoded){//아까 넣어준 합치는 단어 'secret'을 같이 넣어준다.
            //이 아이디와 토큰을 가진 유저를 찾는다.(복호화 된 것은 유저의 아이디)
            
            //유저 아이디를 이용해서 유저를 찾기
            user.findOne({"_id":decoded, "token": token}, function(err, user){
                if(err)return cb(err);
                
                //클라이언트에서 가져온 토큰과 db에 보관된 토큰이 일치하는지 확인(일단 유저를 보내준다)
                cb(null, user);
            })
        })
    }

     

     

    index.js파일에 auth 부분을 생성해준다.

    const {User} = require('./models/User');//mongodb에 클라이언트가 입력한 정보를 저장하기위해서 user정보 가져온다. 
    const {auth} = require('./middleware/auth');//인증처리 하기 위해서 가져온다.
    
    
    app.get("/api/users/auth",auth, (req,res)=>{ //auth =>미들웨어(callback 함수 하기 전에 중간에서 뭔가를 한다)
        
        //데이터를 업로드를 하기전에 authenticated->middle ware이용(여기 까지 왔다는 것은 미들웨어를 통과해 authentication이 true라는 의미)
        
        //Roledl 1 이라면 admin, role 0 일반유저로 가정
        
        res.status(200).json({
            _id:req.user._id,
            isAdmin: req.user.role ===0? false: true, 
            isAuth: true,//이미 middleware 통과해서 왔다. 
            email:req.user.email,
            name:req.user.name,
            lastname:req.user.lastname,
            role:req.user.role
            image: req.user.image
        })
    })
    

     

Designed by Tistory.