본문 바로가기

개인과제(로그인,회원가입 및 Mysql)

[내일배움캠프] 주특기 숙련주차 개인과제 lv2 로그인 회원가입 기능-3-

로그인으로 얻은 쿠키 데이터를 CRUD에 접목시키자

 

먼저 쿠키데이터를 전역으로 보내주기 위해서 작업 폴더에 middlewares라는 폴더를 만든다.

그리고 그 폴더에 login-middleware.js 파일을 만든다.

./middlewares/ login-middleware.js 경로에서

최상단에 User와 jwt를 가져오기 위한 require을 작성한다.

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

middleware에서 쿠키데이터를 검증하고 jwt로 암호화된 쿠키 데이터를  정상적인 데이터로 다시 가공해서

module.exports로 보낸다.

module.exports = async (req, res, next) => {
    const { Authorization } = req.cookies;
    //authorization이 쿠키가 존재하지 않았을 때 대비
    const [authyType, authToken] = (Authorization ?? "").split(" ");

    //authType===Barer값인지 확인
    //authToken 검증
    if (authyType !== "Bearer" || !authToken) {
        res.status(403).json({
            errorMessage: "로그인이 필요한 기능입니다."
        })
        return;
    }

    //authToken이 만료되었는지 확인
    //autuToken이 서버가 발급한 토큰이 맞는지 검증
    //authToken에 있는 userId에 해당하는 사용자가 실제 DB에 존재하는지 확인

    //jwt검증
    try {
        //1.authToken이 만료되었는지 확인
        //2.authToken이 서버가 발급 토큰이 맞는지 검증
        const { userId } = jwt.verify(authToken, "customized-secret-key");
        //3.authToken에 있는 userId에 해당하는 사용자가 실제 DB에 존재하는지 확인
        const user = await User.findById(userId);
        res.locals.user = user;
        next();//이 미들웨어 다음으로 보낸다.
    } catch (error) {
        console.error(error);
        res.status(403).json({ errorMessage: "전달된 쿠키에서 오류가 발생하였습니다." })
        return;
    }
}

암호화를 해금한 쿠키데이터는 

res.local.user=user로 할당한다.

 

이것을 통해서 본인인증을 자동으로 할 수 있다.

 

기존 CRUD의 비밀번호 검증과는 다르게

router.post("/posts", loginMiddleware, async (req, res)

post에 middleware를 넣고, 

const { userId } = res.locals.user;
const existsUser = await Post.find({ userId });

현재의 쿠키데이터를 가지고 있는 유저가 존재하는지 확인함으로써 본인인증이 가능해진다.