인증(Authentication) 기능 만들기

이연중·2021년 4월 20일
0

Node.js

목록 보기
10/14

페이지 이동 때마다 로그인 여부와 관리자, 유저 체크, 권한의 여부를 체크하는 것이 필요하다.

이를 auth route를 만듦으로써 구현해본다.

구현 방법


저번에 서버 부분에서 데이터베이스에 토큰 정보를 저장하고, 클라이언트 부분에서는 쿠키에 토큰을 저장하였다.

  1. 클라이언트에서 서버에 쿠키에 담겨져 있는 토큰을 전달
  2. 서버 부분에서는 토큰의 Decoding 과정으로 통해 User ID를 얻어냄
  3. 해당 ID를 가진 유저가 데이터베이스에 있는지에 대한 여부를 확인하여 권한 부여의 여부를 결정
  4. 인증을 성공했다면 클라이언트에 유저 정보 중에 선별하여 보내주고,
  5. 인증이 실패 했다면, 인증 실패 메세지 Json 형식으로 전달

구현


우선, 루트 디렉터리에 middleware 폴더 생성 후, middleware 폴더 안에 auth.js 파일 생성

index.js

const {auth}=require('./middleware/auth');
//생략

//auth: 요청을 받고 콜백함수로 넘어가기 전 auth라는 미들웨어를 통해 인증 절차 수행
app.get('/api/users/auth',auth,(req,res)=>{
  //미들웨어를 통과해 여기까지 왔으면 인증이 성공했다는 것
  res.status(200).json({
    _id: req.user._id,
    isAdmin: req.user.role===0? false : true,
    isAuth: true,
    email: req.user.email,
    lastname: req.user.lastname,
    role: req.user.role,
    image: req.user.image
  });
});

//생략

auth.js

const { User } = require("../models/User");

//인증 처리 수행
let auth=(req,res)=>{
    //클라이언트의 쿠키에서 토큰을 가져옴
    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};

User.js

//생략

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

    //토큰 복호화
    jwt.verify(token,'secretToken',function(err,decoded){
        if(err) return cb(err);
        //유저 아이디를 이용해 유저를 찾은 후 클라이언트에서 가져온 토큰과 데이터베이스에 보관된 토큰이 일치하는지 확인
        user.findOne({"_id":decoded,"token":token},function(err,user){
            if(err) return cb(err);
            cb(null,user);
        });
    });
}

//생략

참고

www.inflearn.com/course/따라하며-배우는-노드-리액트-기본

profile
Always's Archives

0개의 댓글