City At Night

[MernStack] Blog 만들기 9. auth Router (로그인 , 로그아웃 기능) 본문

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
반응형
Comments