MernStack
[MernStack] Blog 만들기 9. auth Router (로그인 , 로그아웃 기능)
Wuny
2021. 3. 30. 01:33
728x90
반응형
이제는 로그인과 관련된 라우터를 만들겠다.
사용자가 입력한 아이디와 패스워드를 서버로 전송하고
서버에서는 저장되어 있는 아이디와 패스워드를 비교하여
일치하면 토큰값과 로그인 성공 응답을 보내주고,
일치하지 않 으면 에러 메세지를 띄워 로그인 실패 응답을 보내준다.
이에 관련한 auth Router를 만들겠다.
1.auth.js 라우터 생성
routes/api 폴더에 auth.js를 생성한다
<auth.js>
import express from "express";
import bcrypt from "bcryptjs";
import jwt from "jsonwebtoken";
import auth from "../../middleware/auth";
import config from "../../config/index";
import {JWT_SECRET} = config;
//model
import User from "../../models/user";
const router = express.Router();
// @route POST api/auth
// @desc Auth user
// @access Public
router.post("/", (req,res) => {
const {email, password } = req.body; // req.body에 사용자가 입력한 아이디와 패스워드를 보낸다.
//Simple Validation
if(!email || !password) {
return res.status(400).json({msg : "모든 필드를 채워주세요 "});
} // 둘중 하나라도 채우지 않으면 에러메세지를 띄운다
//check for existing user
User.findOne({email}).then((user) => {
if(!user) return res.status(400).json({msg: "존재하지 않는 유저입니다. "});
//validate password
bcrypt.compare(password, user.password).then(isMatch) => {
if(!isMatch)
return res.status(400).json({msg : "비밀번호가 일치하지 않습니다. "})
// 로그인 성공시 ...
jwt.sign(
{ id : user.id},
JWT_SECRET,
{ expiresIn : "2 days"}, //토큰의 유효기간은 2달로 지정
(err, token) => {
if (err) throw err;
res.json({
token,
user:{
id: user.id,
name : user.name,
email : user.email,
role: user.role,
}
})
}
)
}
})
})
export default router;
2. auth Router 사용하기위해 app.js에 등록
<app.js>
import authRoutes from './routes/api/auth';
//....
app.use('/api/auth', authRoutes)
3. 포스트맨으로 테스트

전전 포스팅에서 가입한 아이디와 패스워드를 입력하고 auth 주소로 POST요청을 하면 토큰값과 user정보를 보내준다.
4.로그아웃 기능 만들기
<auth.js>
router.get("/user", auth, async (req, res) => {
try {
const user = await User.findById(req.user.id).select("-password");
if (!user) throw Error("유저가 존재하지 않습니다");
res.json(user);
} catch (e) {
console.log(e);
res.status(400).json({ msg: e.message });
}
});
export default router 위에 추가 해준다.
5. 포스트맨에서 테스트

로그인했을때 받은 토큰값을 넣어 GET요청을 하면 아래와 같이 회원정보가 나오면 성공이다.
728x90
반응형