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;
}
}