1. middlewares.js 파일 생성
2. 검사 코드 작성
exports.isLoggedIn = (req, res, next) => {
if (req.isAutheticated()) {
next();
} else {
res.status(401).send('로그인이 필요합니다.');
}
};
exports.isNotLoggedIn = (req, res, next) => {
if (req.isAutheticated()) {
next();
} else {
res.status(401).send('로그인하지 않은 사용자만 접근 가능합니다.');
}
};
유저가 로그인 했는지, 안했는지 검사하는 미들웨어들을 만드는 작업은 혹시 유저가 임의로 주소로 api 에 접근하는 것을 막기 위한 작업이다.
- app.use 에 들어가는 것은 모두 미들웨어에 속함.
- app.get 또한 마찬가지.
- req.isAuthenticated() 를 통해 유저의 로그인 유무를 판단하고, next() 통해 다음 미들웨어가 진행되게 할 수 있다. 보통 에러를 처리하기 위해 next(에러내용) 을 사용했지만, 어떤 값도 들어가 있지 않다면, 다음 미들웨어를 진행을 실행할 수 있다.
3. 검사 결과 활용
(...)
const { isLoggedIn, isNotLoggedIn } = require('../middlewares');
(...)
// POST /user/login
router.post('/login', isNotLoggedIn, (req, res, next) => { // 로그인하지 않은 상태를 필요
passport.authenticate('local', (err, user, info) => {
if (err) {
console.err(err);
next(err);
}
if (info) {
return res.status(401).send(info.reason);
}
return req.login(user, async (loginErr) => {
if (loginErr) {
console.error(loginErr);
return next(loginErr);
}
// 비밀번호를 제외하고, user 의 다른 정보를 함께 보내기
const fullUserWithoutPassword = await User.findOne({
where: { id: user.id },
attributes: { exclude: ['password'] },
include: [
{
model: Post,
},
{
model: User,
as: 'Followings',
},
{
model: User,
as: 'Followers',
},
],
});
return res.status(200).json(fullUserWithoutPassword);
});
})(req, res, next);
});
// POST /user/logout
router.post('/logout', isLoggedIn, (req, res) => { // 로그인 상태를 필요
req.logout((err) => {
if (err) {
return next(err);
}
res.redirect('/');
});
req.session.destroy();
res.send('로그아웃 성공');
});
// POST /user
router.post('/', isNotLoggedIn, async (req, res) => { // 로그인 하지 않은 상태를 필요
try {
const exUser = await User.findOne({
where: {
email: req.body.email,
},
});
if (exUser) {
return res.status(403).send('이미 사용중인 아이디입니다.');
}
const hashedPassword = await bcrypt.hash(req.body.password, 13);
await User.create({
email: req.body.email,
nickname: req.body.nickname,
password: hashedPassword,
});
res.status(201).send('축하합니다. 회원가입이 되었습니다.');
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = router;
- 검사 결과들을 import 한 뒤,
- 로그인 한 상태를 필요로 한 경우엔 isLoggedIn, 그렇지 않고, 로그인 하지 않은 상태를 필요로 한 경우네 isNotLoggedIn 을 각 미들웨어 앞에 매개변수로 넣어서 해당 미들웨어가 실행되기 전에 검사를 진행할 수 있다.
'Next.js' 카테고리의 다른 글
[NNN]_multer 로 이미지 업로드하기 (0) | 2024.02.14 |
---|---|
[NNN]_credentials 로 쿠키 공유하기(Unauthuorized Error) (0) | 2024.02.09 |
[NNN]_Passport 로 로그인 구현하기 (0) | 2024.02.02 |
[NNN]_Redux 원리 (0) | 2024.01.25 |
[NNN]_트러블 슈팅 1 error:0308010c:digital envelope routines::unsupported (0) | 2024.01.24 |