ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [auth - middleware]
    React/프로젝트 2022. 1. 24. 17:02
    middleware
    endpoint의 req받은 다음, cb function하기 전 중간에서 작업을 처리하는 곳
    Auth route
    1. 페이지 이동 때마다 로그인 여부와 관리자 유저인지 등 체크
    2. 글을 쓸 때나 지울 때 같은 권한이 있는지 체크
    Auth route 만드는 방법

    ※ 현재 token은

    서버에서는 user DB에 넣었고

    클라이언트에서는 쿠키에 넣었다.

    1. 쿠키(client)에 저장된 토큰을 서버에 가져와서 복호화 한다.
      • User.findByToken
    2. 복호화(토큰 디코드)를 통해 User ID추출
      • jwt.verify
    3. 서버에 있는 token 인증 완료가 되면
      해당 유저 정보를 선별해 프론트 엔드로 보내준다.

     

    // users.js
    
    const { auth } = require("../middleware/auth");
    
    router.get("/auth", auth, (req,res) => {  // auth middleware 이동
        res.statue(200).json({
            _id: req.user._id,
            isAdmin: req.user.role === 0 ? false : true,
            isAuth: true,
            email: req.user.email,
            firstname: req.user.firstname,
            lastname: req.user.lastname,
            role: req.user.role,
            image: req.user.image
        });
    });
    // auth.js
    
    const { User } = require("../models/User");
    
    let auth = (req, res, next) => {
        // 쿠키에서 token가져온다.
        let token = req.cookies.x_auth;  // cookieParser이용
        
        User.findByToken(token, (err, user) => {  // User model에서 처리
            if(err) throw err;
            if(!user)
                return res.json({
                    isAuth: false,
                    error: true
                });
              req.token = token; // token 정보 저장
              req.user = user;  // user 정보 저장
              next();
          });
      };
      
      module.exports = { auth };
    // User.js  models > User.js
    
    
    userSchema.statics.findByToken = function(token, cb) {
        var user = this;
        
        // 복호화 과정
        // 쿠키에서 가져온 토큰을 decode한다.(secretToken 이용)
        jwt.verify(token, "secretToken", function(err, decode) {  // decode : userID
            user.findOne({ _id: decode, token: token}, function (err, user) {
            // client에서 가져온 토큰과 DB에 보관된 토큰이 일치하는지 확인
                if(err) return cb(err);
                cb(null, user);  // 오류가 없다면(null), user정보 전달
            });
        });
    };
    JWT 디코딩
    참고 : https://backend-intro.vlpt.us/4/03.html
    // jwt 디코딩
    
    jwt.verify(token, jwtSecret, (error, decoded) => {
        if(error) {
            console.error(error);
            return;
        }
        
        console.log(decoded);
    });

    'React > 프로젝트' 카테고리의 다른 글

    [npm vs npx]  (0) 2022.01.24
    [리액트]  (0) 2022.01.24
    [로그인]  (0) 2022.01.24
    [Bcrypt] - 비밀번호 암호화  (0) 2022.01.21
    [Nodemon]  (0) 2022.01.21
Designed by Tistory.