[유튜브 클론코딩] 6.2 Passport로 Local Authentication(로컬 인증) 하기 (2)

2021. 3. 10. 22:13Projects/유튜브 클론코딩

728x90
반응형

6.2 Passport로 Local Authentication(로컬 인증) 하기 (2)

serializeUser & deserializeUser

  • serializeUser 함수:  쿠키에 어떤 데이터를 저장할지 선택하는 것이다. 유저의 정보 모두를 담는 것은 효율적이지 않기 때문에, id와 같이 고유한 값만을 저장하는 것이 바람직하다.
  • deserializeUser 함수: serializeUser를 통해 쿠키에는 id만 저장되었으므로, 그 id를 통해 사용자를 구분할 수 있다.

원래는 serializeUser와 deserializeUser 함수에 대해서 길게 코드를 적어야 하는데,

passport-local-mongoose의 도움으로 간단하게 구현 가능하다.

이렇게 passport가 사용자 인증을 처리할 수 있도록 설정이 되었다.

 

import passport from "passport";

import User from "./models/User";

passport.use(User.createStrategy());

passport.serializeUser(User.serializeUser());

passport.deserializeUser(User.deserializeUser());

↑ passport.js

 

serializeUser - "이봐 passport, 쿠키에는 오직 user.id만 담아서 보내도록 해"

deserializeUser - 그리고 그 id로 사용자를 식별한다

 

routers> globalRouter.js  를 확인해보면 우리는 postJoin을 만들었었다. 이 postJoin을 좀 수정할 것이다. 왜냐면 이제 여기에 패스워드가 맞는지 체크하거나 하는 미들웨어가 하나 들어갈 거기 때문이다.

 

controllers > userController.js로 가서 postJoin  수정하기

일단 User model을 import 해준다.

 

export const postJoin = async (req,res) => {

    // console.log(req.body);

    const{

        body:{name, email, password, password2}

    } = req;

    if(password !== password2){

        res.status(400);

        res.render("join", {pageTitle: "Join"});

    }else{

        try{

            const user = await User({

                name,

                email

            });

            await User.register(user,password);

        }catch(error){

            console.log(error);

        }

        //To Do: Log User In

        res.redirect(routes.home);

    }

}

↑ userController.js

postJoin controller 함수를 위와같이 고쳐주면, 패스워드가 일치하는 경우 User모델을 생성하고 인자로는 name,email을 갖는다. 그 후, User.register(user,password)를 통해 정보를 데이터베이스에 등록한다.

***try 구문에  User.create가 아니라  User 라고만 적은 이유는 create는 생성시키고 데이터베이스에 저장까지 하기 때문에 다음에 작성한 User.register 구문이 오류가 나기 때문이다. (이미 데이터베이스에 저장이 되어 있어서 가입이 못되는 상황)

 

콘솔에서 inspect > Cookies를 확인해보면 ,,,, 아직 🍪가 없다!

fontawesome 관련 쿠키는 있는데 아직 우리 쿠키는 없다.

지금 벌어진 일은 일단 사용자를 등록했고 아직 이 사용자를 로그인 시켜주지는 않았기 때문에 쿠키가 없는 것이다.

그래서 두가지 방법이 있는데, 등록한 다음 로그인 화면으로 보내서 로그인하라고 할 수도 있고 아니면 등록한 다음에 자동으로 로그인 시켜버리는 방법이 있는데 유저경험 상 후자가 더 좋으므로 그렇게 할 것이다.

 

+ 데이터베이스에 저장된 정보를 찾거나 지우고 싶을 때(콘솔창에)

  • mongo
  • help
  • show dbs (여기서 db이름 보면 mytube라고 지정되어 있음)
  • use mytube
  • show collections
    • users
    • videos

★★★ 여기서 우리는 users, videos라고 이름을 지정한 적 없는데 이렇게 저장된 이유는 mongoose가 자동으로 소문자로 변환하고 s를 붙여주기 때문이다.

우리는 Video와 User 라는 모델을 만들었었기 때문에 그렇다.

  • db.users.find({}) - 찾고싶을 때
  • db.users.remove({}) - 지우고싶을 때

 

728x90
반응형