노마드/유튜브

ch7.5~ login, sessions&cookies, logged in user

hippo0207 2022. 8. 23. 16:02

1. login

  • id확인
export const postLogin = async (req, res) => {
  const { username, password } = req.body;
  const pageTitle = "Login";
  // check if account exists
  const user = await User.findOne({ username });
  if (!user) {
    return res.status(400).render("login", {
      pageTitle,
      errorMessage: "An account with this username does not exists",
    });
  }
  • 비번확인

https://github.com/kelektiv/node.bcrypt.js

  }
  // check if password correct
  const ok = await bcrypt.compare(password, user.password);
  if (!ok) {
    return res.status(400).render("login", {
      pageTitle,
      errorMessage: "Wrong password",
    });
  }
   return res.redirect("/");
};
  • >> 쿠키 세션 사용하여 로그인유저 유지

2. sessions&cookies

  • 세션 : 백엔드, 브라우저간의 활동을 기억함
    • 브라우저, 백엔드 사이의 memory, history
    • express-session install 필요
    • use router전에 use session 넣어야함!@!@!
import session from "express-session";

app.use(
  session({
    secret: "Hello!",
    resave: true,
    saveUninitialized: true,
  })
);

app.use("/", rootRouter);
app.use("/videos", videoRouter);
  • 예 제 
app.use((req, res, next) => {
  req.sessionStore.all((error, sessions) => {
    console.log(sessions);
    next();
  });
});



app.get("/add-one", (req, res, next) => {
  req.session.potato += 1;
  return res.send(`${req.session.id}\n${req.session.potato}`);
});
  • req.session.potato >>처럼 항목 만들수있음

 

  • 세션을 몽고디비와 연결 
  • 백엔드 세션 마다 id를 갖고있음> 브라우저에 id보냄 > 브라우저와 일치하는 세션이 뭔지 알수있음
  • 백엔드에 요청할때마다 id를 보내야함
  • 브라우저마다 id가 다름
  • app접근때마다 session이 id만들어서 줌, 

 

  • postLogin 컨트롤러에 세션항목 추가
    • 각 유저마다 다른 세션 가짐
    • req.session.abcd = "abcd"; << session에 저장

  req.session.loggedIn = true;      <<      <<
  req.session.user = user;      <<      <<
  return res.redirect("/");
};

=================
 'iHmaFMabkWDEViM-Bvxh5NyzIH5t52Zg': {
    cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' },
    loggedIn: true,
    user: {
      _id: '63043fb590e1c94851f12e74',
      email: 'joj1043@nate.com',
      username: 'joj1043',
      password: '$2b$05$wxgktXaauMCpAIMqn6Pe0.WntDkfj3kTm78R0F0ne28/cxWBEAM.C',
      name: '동영상',
      location: '톳고개로',
      __v: 0
    }
  • req.session 에 정보저장했음 >> template와 공유하는 방법? 밑에서

3. logged in user

  • server.js >> console.log(res) >> ~~~~, locals: [Object:null prototype]{} 나옴 >>
  • pug template에서 이 locals에 접근가능함
  •  res.locals.sexy= "you" >>> pug에서 #{sexy} 로 global하게 사용가능함
  • >> 이거전용으로 쓸 middlewares.js 생성 & server.js 의 session뒷부분에 app.use(localsMiddleware) 추가
export const localsMiddleware = (req, res, next) => {      <<
  console.log(req.session);
  res.locals.siteName = "Wetube";      <<
  next();
};

-----------------------
app.use(
  session({      <<
    secret: "Hello!",
    resave: true,
    saveUninitialized: true,
  })
);

app.use(localsMiddleware);      <<      <<
  • >> userController에서 저장한 res.session.loggedIn >> locals에 저장하기
export const localsMiddleware = (req, res, next) => {
  res.locals.loggedIn = Boolean(req.session.loggedIn);      <<      <<      <<
  res.locals.siteName = "Wetube";
  res.locals.loggedInUser = req.session.user;
  
  =================
  [base.pug]
  if loggedIn
        li  
            a(href="/logout") Logout
        li  
            a(href="/my-profile") #{loggedInUser.name} 의 Profile
    else
        li 
            a(href="/join") Join
        li 
            a(href="/login") Login