항해 99
항해 99 38일차 10/26일
코딩이좋아요
2022. 10. 27. 02:23
어제 리프레쉬 토큰과 에쎼스 토큰을 하나하나 뜯으면서 미들웨어 작업을 끝 마쳤다.
module.exports = async (req, res, next) => {
//쿠키로 받아온다.
let userId
const accessToken = req.cookies.AccessToken
const refreshToken = req.cookies.RefreshToken
//토큰이 없다면~
if (!accessToken) return res.status(400).json({ "message": "Access Token이 존재하지 않습니다." });
//리프레쉬 토큰 확인하기
if (!refreshToken) return res.status(400).json({ "message": "RefreshToken이 존재하지 않습니다." });
//에쎄스 토큰 검증하기
const decodeAccessToken = await LoginSevice.validateAccessToken(accessToken)
//리프레쉬 토큰 검증(시크릿 키가 같은지)
const decodeRefreshToken = await LoginSevice.validateRefreshToken(refreshToken)
//검증해서 아이디값 가져오기
userId = decodeRefreshToken.userId
//인증된 에쎄스 토큰이 없을시
if(decodeAccessToken == null){
//에쎼쓰 토큰 안에 있는 유저정보로 디비에 저장된 유저정보 찾기
const findUser = await User.findByPk(userId)
//디비에서 찾아온 리프레쉬 토큰 복호화(내가 가지고 있는 리프레쉬(암호화전) 토큰이랑 디비에 저장되어있는거랑 같은지)
const decodeRefreshToken = bcrypt.compareSync(refreshToken,findUser.RefreshToken)
//위변조가 있거나 존재 하지 않을때 라고 가정했을때 예외 처리
if(decodeRefreshToken == false){return res.status(400).json({ "message": "RefreshToken이 일치하지 않거나 만료 되었습니다." })}
//리프레쉬 정상에 AccessToken 만료시 재발급
const AccessToken = await LoginSevice.createAccessTokenRe(userId)
//쿠키로 보내줌
res.cookie('AccessToken',AccessToken)
console.log("쿠키에 보내줬어요")
//프론트에서 로컬 스토리지에 저장하기 위해 res에 보내줌
//리프레쉬 토큰이 만료시
}
//유저정보를 찾아서 로컬스에 저장
User.findByPk(userId).then((user) => {
res.locals.user = user;//res.locals.user데이터를 담는다 가상공간에
next()
})
}