브라우저에 쿠키를 설정해주면 그 쿠키를 통해 사용자 ID(정보)등을 알 수 있다.
여기서 PASSPORT가 브라우저에서 쿠키를 가져와 인증이 완료된 유저 정보를 CONTROLLER에 넘겨주는 역할을 한다.
npm install passport
npm install passport-local-mongoose
User.js
import mongoose from "mongoose";
import passportLocalMongoose from "passport-local-mongoose";
const UserSchema = new mongoose.Schema({
name: String,
email:String,
avatarUrl: String,
facebookId: Number,
githubId: Number
});
//
UserSchema.plugin(passportLocalMongoose,
{usernameField:"email"},
);
const model = mongoose.model("User",UserSchema);
export default model;
passport.js
import passport from "passport";
import User from "./models/User";
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
userController.js
import routes from "../routes";
import User from "../models/User";
...
export const postJoin = async (req, res, next) =>{
console.log(req.body)
// const password = req.body.password;
// const password2 = req.body.password2;
const { body : { name, email, password, password2} } = req;
if (password !== password2){
// 400 : 잘못된 요청이라는 뜻이라 브라우저가 인식
res.status(400);
res.render("join",{ pageTitle : "Join" });
} else{
// reigister user
try {
// 2 사용자생성
const user = await User({
name,
email
});
// 1 계정생성
await User.register(user, password);
next();
} catch (error) {
console.log(error);
res.redirect(routes.home);
}
}
// const { body : { name }} = req;
// const searchingBy = req.query.term;
// const { query : { term : searchingBy} } = req;
};
userController.js
import passport from "passport";
import routes from "../routes";
import User from "../models/User";
export const postJoin = async (req, res, next) =>{
console.log(req.body)
// const password = req.body.password;
// const password2 = req.body.password2;
const { body : { name, email, password, password2} } = req;
if (password !== password2){
// 400 : 잘못된 요청이라는 뜻이라 브라우저가 인식
res.status(400);
res.render("join",{ pageTitle : "Join" });
} else{
// To Do : reigister user
try {
const user = await User({
name,
email
});
await User.register(user, password);
next();
} catch (error) {
console.log(error);
res.redirect(routes.home);
}
//res.redirect(routes.home);
}
};
export const postLogin = passport.authenticate("local", {
failureRedirect: routes.login,
successRedirect: routes.home
});
globalRouter.js
...
globalRouter.post(routes.join, postJoin, postLogin);
...
middlewares.js
...
export const localsMiddleware = (req, res, next) =>{
res.locals.siteName = "weTube";
res.locals.routes = routes;
res.locals.user = req.user || null;
console.log(req.user)
next();
};
...
app.js
import passport from "passport";
...
import "./passport";
...
app.use(passport.initialize());
app.use(passport.session());
npm install express-session
app.js
import passport from "passport";
import session from "express-session";
...
import "./passport";
...
app.use(
session({
secret: process.env.COOKIE_SECRET,
resave: true,
saveUninitialized: false
})
);
app.use(passport.initialize());
app.use(passport.session());
요약을 하자면...
1. 쿠키는 express로 보내지고 있다.
2. express는 session을 이용해서 그 쿠키를 가질 수 있고
우리는 passport를 통해서 session을 이용한다.
이 말은 곧, session이 가진 쿠키를 이용한다는 말과 같다.
3. 그리고 passport로 deserialize를 진행한다.
-> deserialize를 진행사항
3-1. 쿠키는 암호화된 id를 해독해서 실제 id를 찾고
3-2. 이 id는 passport로 넘어간다.
3-3. passport로 넘어가면 deserialize 함수가 실행이 되고 이 함수는 사용자를 식별한다.
3-4. 식별한 사용자를 middleware나 routes의 요청 object에 할당한다
=> 어느 routes에서든 로그인한 사용자가 누구인지 체크할 수 있다
서버를 재접속하면 로그아웃이 되어 버린다
(= 세션정보, 쿠키정보가 메모리에 저장되어 있기 때문)
1. connect mongo install
app.js
connect mongo를 사용해서 세션에서 데이터를 MongoStroe라는 저장소에 저장시킨다
2. 세션 설정에서 store 추가, 그 store(저장소)를 mongo와 연결
app.js