현재 원하는건 로그인 하지 않은 사람들이 해당 페이지에 가는걸 막는 일이다.
그걸 위해서 Protector Middlewares
를 만드는 거다.
middlewares.js
에서
export const proectorMiddleware = (req, res, next) => {
if (req.session.loggedIn) {
return next();
} else {
return res.redirect("/login");
}
};
export const publicOnlyMiddleware = (req, res, next) => {
if (!req.session.loggedIn) {
return next();
} else {
return res.redirect("/");
}
};
middleware
뿐만 아니라 모든 것에 req
,res
,next
가 포함되어 있다는 걸 명심한다.
그리고 사용자가 로그인 돼 있지 않은걸 확인하면 로그인 페이지로 redirect
하게 할거다.
사용자가 로그인 돼 있다면 request
를 계속 하도록 하는 거다.
controller
에서 user
를 찾게 하는 방법은 req.session.loggedIn
이다.
어느 controller
나 middleware
에서도 사용 할수 있다.
user
가 loggedIn
이 되어 있으면 next()
함수를 호출 하는거다.
그리고 유저가 loggedIn
이 아니라면 로그인 페이지로 redirect
하게 된다.
그 다음 로그인 돼 있지 않은 사람들만 접근 할수 있게 하는 middleware
도 만든다.
예를 들어 로그인했는데 다시 로그인 페이지로 갈수 있으면 안되는 거다.
방금 전이랑 반대로 만들어 준다.
그리고 loggedIn
이 돼 있다면 /
로 res.redirect
로 해준다.
현재 middleware
에서는 user
가 loggedIn
돼 있다면 요청을 계속 하게 하고
loggedIn
돼 있지 않으면 로그인 페이지로 redirect
해준다.
다른 middleware
는 user
가 loggedIn
돼 있지 않으면 요청을 계속하게 하고
loggedIn
돼 있으면 "/"
으로 redirect
해준다.
그러면 이 middleware
들을 사용해 보도록 한다.
userRouter.js
에서
userRouter.get("/logout", protectorMiddleware, logout);
userRouter
.route("/edit")
.get(protectorMiddleware, getEdit)
.post(protectorMiddleware, postEdit);
로그인 돼 있는 사람들만 로그아웃 페이지로 갈수 있어야 한다.
그래서 protectorMiddleware
를 추가 할거다.
/edit
에도 protectorMiddleware
를 적용해 준다.
middleware
를 get
이랑 post
둘 다 사용 할수 있게 되었다.
하지만 express
에서는 반복해서 사용 할 필요 없이 all()
이라는 함수를 사용 하면 된다.
userRouter.route("/edit").all(protectorMiddleware).get(getEdit).post(postEdit);
이렇게 해주면 get
,post
등 어떤 http method
를 사용 하든지 middleware
를 사용 한다는 거다.
이제 startGithubLogin
,finishGithubLogin
을 싫행시키고 싶다면
publicOnlyMiddleware
를 적용하면 된다.
publicOnly
는 로그아웃 돼 있어야 실행시키는걸 허락해주니까
로그인 돼 있으면 여기로 올수 없게 보호해주는 거다.
userRouter.get("/github/start", publicOnlyMiddleware, startGithubLogin);
userRouter.get("/github/finish", publicOnlyMiddleware, finishGithubLogin);
그리고 이건 나중에 user
를 볼수 있게 해줄거다.
userRouter.get(":id", see);
이건 public
도 될수 있고 private
도 될수 있을것 같다. 로그인 여부가 상관없는 거다.
그리고 import
도 해준다.
import { protectorMiddleware, publicOnlyMiddleware } from "../middlewares";
그리고 이제 새로고침을 해보면 잘 작동 한다.
로그인 된 상태에서 로그인 페이지로 갈수가 있다 이것도 보호 해주도록 한다.
그리고 /github/start
로 가본다. 홈페이로 돌아가진다. 잘 작동한다.
rootRouer.js
에 가서
rootRouter.route("/join").all(publicOnlyMiddleware).get(getJoin).post(postJoin);
rootRouter
.route("/login")
.all(publicOnlyMiddleware)
.get(getLogin)
.post(postLogin);
/join
,/login
에는 로그아웃 된 사람만 갈수 있다.
그래서 두곳에 all()
함수를 적용 해주었다. 새로고침 해보니 로그인 상태에서 로그인 페이지로 갈수 없다.
당연히 join
페이지도 못 간다.