[TIL] 231121_refreshToken 구현

VonBielefeld·2023년 11월 21일
0

TIL

목록 보기
19/32

isAuthenticated 미들웨어 함수 생성하였다.
생각하는건 간단해서 금방 할 줄 알았는데 마음과 같이 않구나...

async function isAuthenticated(req, res, next) {
  const accessToken = req.cookies.accessToken;
  const refreshToken = req.cookies.refreshToken;

  // accessToken 유무 확인
  if (!accessToken) {
    // 없는 경우 에러 발생 시켜 에러처리
    throw next(new Error('accessTokenNotFound')); 
  }
  // accessToken 이씨는 상태에서 검증
  const verifiedAccessToken = verifyAccessToken(accessToken);
  // 인증 성공하면
  if (verifiedAccessToken) {
    //다음으로 이동
    req.user = verifiedAccessToken;
    next();
  }
  // accessToken not verified
  if (!refreshToken) {
    throw next(new Error('refreshTokenNotFound'));
  }
  //  인증에 실패하면
  // refresh token 유무 확인
  const verifiedRefreshToken = await verifyRefreshToken(refreshToken);
  // 검증에 실패하면
  if (!verifiedRefreshToken) {
    // 에러 발생 시켜 에러처리
    throw next(new Error('refreshTokenNotFound'));
  }
 // 검증에 성공 하면  DB에 동일한 refreshToken 검색
  const findDBToken = await Refreshtoken.findOne({
    where: {
      refrshtoken: refreshToken,
    },
  });
  const findToken = findDBToken.dataValues.refrshtoken;
   // DB에refreshToken 검색
  if (findToken !== refreshToken) {
    //실패하면 에러 발생 시켜 에러처리
    throw next(new Error('refreshTokenNotMatched'));
  }

  // 성고하면 accessToken 재발급 진행 다음으로 진행
  const newAccessToken = jwt.sign({ id: verifiedRefreshToken.id }, process.env.SECRETTEXT, { expiresIn: '30s' });
  const newVerifyAccessToken = verifyAccessToken(newAccessToken);
  req.user = newVerifyAccessToken;
  req.accessToken = newAccessToken;
  next();
}

function verifyAccessToken(accessTokenToken) {
  try {
    return jwt.verify(accessTokenToken, process.env.SECRETTEXT);
  } catch (error) {
    return false;
  }
}
async function verifyRefreshToken(refreshTokenToken) {
  try {
    return jwt.verify(refreshTokenToken, process.env.REFRESHSECRETTEXT);
  } catch (error) {
    return false;
  }
}

0개의 댓글