내배캠 115일차

·2023년 3월 8일
0

내일배움캠프

목록 보기
123/142

수요일
0. 공고 상세 페이지 손보기(수정버튼 누르면 input박스열려서 수정가능하도록/ 공고생성시간수정시간)
1. refreshToken
2. 로그인 회원가입페이지 컨트롤러로 옮기기

uncaught typeerror: cannot read properties of undefined (reading 'display')

class => 같은 클래스를 가지고 있는 모든 태그들에 속성을 줄 수 있음.
id => 같은 아이디를 가지고 있는 하나의 태그에게 속성을 줄 수 있음.

getElementById를 사용해서 속성값을 줄려고 하니 원하는 대로 되지않아 class로 바꾸어 주었더니 style을 줄 수 없길래 찾아보니 한 클래스를 사용하는 태그들 각각 .style.display를 줘야하더라
참고

아 그리고 난 document.querySelectorAll로 같은 클래스인 태그를 찾았는데, getElementsByClassName를 사용해도 됨!

일단 기능구현 완료!

refresh token 까지 추가 완료!

const jwt = require('jsonwebtoken');
const { User } = require('../models');
const {
  UserNotFound,
  RefreshTokenNotFound,
  TokenExpired,
} = require('../utility/customError');

const verifyToken = (token) => {
  try {
    return jwt.verify(token, process.env.KAKAO_SECRET);
  } catch (error) {
    if (error.name === 'TokenExpiredError') {
      return null;
    }
  }
};

const checkToken = async (req, res, next) => {
  try {
    // cookie 들고오기
    const { cookie } = req.headers;

    // cookie 없음
    if (!cookie) {
      return res.render('login.html');
    }

    let accessToken = '';
    let refreshToken = '';

    let cookieList = cookie.split(' ');
    cookieList.map((a) => {
      if (a.includes('accessToken')) {
        let [authType, authToken] = a.split('=');
        accessToken = authToken.split(';')[0];
      }
      if (a.includes('refreshToken')) {
        let [authType, authToken] = a.split('=');
        refreshToken = authToken.split(';')[0];
      }
    });

    const checkAccess = verifyToken(accessToken);
    const checkRefresh = verifyToken(refreshToken);

    if (checkAccess === null) {
      if (checkRefresh === null) {
        // case1: access token과 refresh token 모두만료
        const error = new TokenExpired();
        return res.status(401).json({ message: error.message });
      }
      // case2: access token은 만료됐지만, refresh token은 유효한 경우 => 새로 accessToken 발급
      let userId = checkRefresh.id;
      let { id, email, nickname } = await User.findAll({
        where: { id: userId },
      });

      const newAccessToken = jwt.sign(
        {
          id,
          email,
          nickname,
        },
        process.env.KAKAO_SECRET,
        {
          expiresIn: '2h',
        }
      );
      res.cookie('accessToken', newAccessToken);
    } else {
      if (checkRefresh === null) {
        // case3: access token은 유효하지만, refresh token은 만료된 경우 => 새로 refreshToken 발급
        let id = checkAccess.id;

        const newRefreshToken = jwt.sign({ id }, process.env.KAKAO_SECRET, {
          expiresIn: '14d',
        });

        res.cookie('refreshToken', newRefreshToken);

        await User.update(
          { refreshToken: newRefreshToken },
          {
            where: { id },
          }
        );
      }
    }

    let { id } = verifyToken(accessToken);
    const user = await User.findByPk(id);

    // 해당하는 회원이 존재하지 않을 때
    if (!user) {
      const error = new UserNotFound();
      return res.status(401).json({ message: error.message });
    }

    // 저장된 refreshToken 이 아닌 경우
    if (refreshToken !== user.refreshToken) {
      const error = new RefreshTokenNotFound();
      res.status(401).json({ message: error.message });
      return res.render('login.html');
    }

    res.locals.user = user;
    next();
  } catch (error) {
    res.clearCookie('connect.sid');
    res.clearCookie('accessToken');
    res.clearCookie('refreshToken');
    return res.render('login.html');
  }
};

module.exports = { checkToken };

참고1
참고2
참고3
참고4

profile
개발자 꿈나무

0개의 댓글