Back/Node.js

노드js 유저 인증하기

클라이언트

function getSelf(callback) {
  $.ajax({
    type: 'GET',
    url: '/api/users/me',
    headers: {
      authorization: `Bearer ${localStorage.getItem('token')}`,
    },
    success: function (response) {
      callback(response.user)
    },
    error: function (xhr, status, error) {
      if (status == 401) {
        alert('로그인이 필요합니다.')
      } else {
        localStorage.clear()
        alert('알 수 없는 문제가 발생했습니다. 관리자에게 문의하세요.')
      }
      window.location.href = '/'
    },
  })
}

 

첫번째 라우터

router.get("/users/me", authMiddleware, async (req, res) => {
  const { user } = res.locals;

  res.send({
    user,
  });

 

미들 웨어

const jwt = require("jsonwebtoken");
const User = require("../schemas/user");

// 이거 3번째에 모듈로 안 넣어줘도 적용되는거 물어보기
// (req, res, authmiddlewares) 이렇게 안 해도 되는 듯
module.exports = (req, res, next) => {
    const { authorization } = req.headers;
    const [authType, authToken] = (authorization || "").split(" ");

    if (!authToken || authType !== "Bearer") {
        res.status(401).send({
            errorMessage: "로그인 후 이용 가능한 기능입니다.",
        });
        return;
    }
    try {
        const { userId } = jwt.verify(authToken, "my-key");
        User.findById(userId).then((user) => {
            res.locals.user = user;
            next();
        });
    } catch (err) {
        res.status(401).send({
            errorMessage: "로그인 후 이용 가능한 기능입니다.",
        });
    }
};

 

 

header 부분에 authorization 밸류값에 배리어, 토큰 키값이 있는데 이걸 미들 웨어에서 스플릿으로 정리하고, 인증한다. 통과하면 next()로 넘어가고, 통과못하면 catch로 넘어가서 에러처리가 난다.