๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[E-Commerce App with REST API] (4) login ์ธ์ฆ by jwt & ์œ ์ €์˜ ์ •๋ณด post, get, delete, put ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ๋ฐฑ์—”๋“œ(Back-End)/Node js

[E-Commerce App with REST API] (4) login ์ธ์ฆ by jwt & ์œ ์ €์˜ ์ •๋ณด post, get, delete, put

์ง•์ง•์•ŒํŒŒ์นด 2023. 3. 22. 01:36
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” Developers Corner ์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example!

 

๐ŸŒท login ์‹œ ์ •๋ณด๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ

 

 

๐ŸŒท jwt (json webtoken)

Header : ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํƒ€์ž…
Payload : ๋ฐ์ดํ„ฐ
SIGNATURE : ํ† ํฐ์„ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ•  ๋•Œ, ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ ํ•œ ์ฝ”๋“œ


=> Header ์™€ Payload๋ฅผ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ BASE64๋กœ ์ธ์ฝ”๋”ฉ

=> ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’์„ Secret Key๋ฅผ ์ด์šฉํ•ด ํ—ค๋”์—์„œ ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹ฑ

=> ์ด ๊ฐ’์„ ๋‹ค์‹œ BASE64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ƒ์„ฑ

์ด ์„ธ ๋ถ€๋ถ„์„ ํ•ฉ์ณ์„œ ์•”ํ˜ธํ™”๋ฅผ ํ•œ ๊ฒƒ์ด JWT

npm i jsonwebtoken

 

๐ŸŒท role์œผ๋กœ ์‚ฌ์šฉ์ž ์œ ์ €์˜ ์ •๋ณด ๊ตฌ๋ถ„ํ•˜๊ธฐ 

 

๐ŸŒท login ์‹œ token ๋ฐœ๊ธ‰ํ•˜๊ธฐ 

 

 

๐ŸŒท ๋ชจ๋“  users ์ •๋ณด ๋ณด๊ธฐ

 

๐ŸŒท 1๋ช…์˜ users ์ •๋ณด ๋ณด๊ธฐ

id๋กœ ๋ฐ›์•„์„œ ์œ ์ € ์ •๋ณด ๊ฐ–๊ณ ์˜ด

 

๐ŸŒท id๋กœ ์œ ์ €์˜ ์ •๋ณด ์‚ญ์ œํ•˜๊ธฐ

findByIdAndDelete ์‚ฌ์šฉํ•จ 

 

๐ŸŒท id๋กœ ์œ ์ €์˜ ์ •๋ณด ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ

findByIdAndUpdate ์‚ฌ์šฉํ•จ

 

๐ŸŒท ์ฝ”๋“œ

โœ… controllers/userCtrl.js

const User = require("../models/User");
const bcrypt = require("bcrypt");
const asyncHandler = require("express-async-handler");
const { generateToken } = require("../config/jwtToken");

const createUser = asyncHandler(async (req, res) => {
  const { firstname, lastname, email, mobile, password } = req.body;
  const findUser = await User.findOne({ email: email });

  // email์ด db์— ์—†๋‹ค๋ฉด
  if (!findUser) {
    // Create a new User
    // 1) ์šฐ์„  ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‰ฌํ™”(์•”ํ˜ธํ™”)
    const hashedPassword = await bcrypt.hash(password, 10);
    // 2) ์ƒˆ User ์ •๋ณด ๋งŒ๋“ค๊ธฐ
    const newUser = await User.create({
      firstname, lastname, email, mobile, password: hashedPassword
    });

    res.json(newUser);
  } else {
    // User already exists
    throw new Error("User already exists");
  }
});

const loginCheck = asyncHandler(async (req, res) => {
  const { email, password } = req.body;
  // check if user exists or not
  const findUser = await User.findOne({ email: email });

  // user ๊ฐ€ ์—†๋‹ค๋ฉด done
  if (!findUser) {
    throw new Error("That email is not registered!");
  }
  // Match password (๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฒดํฌ)
  bcrypt.compare(password, findUser.password, (err, isMatch) => {
    if (err) throw err;
    if (isMatch) {
      res.json({
        _id: findUser?._id,
        firstname: findUser?.firstname,
        lastname: findUser?.lastname,
        email: findUser?.email,
        mobile: findUser?.mobile,
        token: generateToken(findUser?._id)
      });
    } else {
      throw new Error("Email or Password is incorrect!");
    }
  });
})

// Update a user
const updateUser = asyncHandler(async (req, res) => {
  const { id } = req.params;
  try {
    const updateUser = await User.findByIdAndUpdate(id,
      {
        firstname: req?.body?.firstname,
        lastname: req?.body?.lastname,
        email: req?.body?.email,
        mobile: req?.body?.mobile,
      }, {
        new : true,
      }
  );
  res.json(updateUser);
  } catch (error) {
  throw new Error(error);
}
});


// get all users
const getAllUsers = asyncHandler(async (req, res) => {
  try {
    const getUser = await User.find();
    res.json({ getUser });
  } catch (error) {
    throw new Error(error);
  }
});

// get a single users
const getAUsers = asyncHandler(async (req, res) => {
  const { id } = req.params;
  try {
    const getUser = await User.findById(id);
    res.json({ getUser });
  } catch (error) {
    throw new Error(error);
  }
});

// delete a user
const deleteAUser = asyncHandler(async (req, res) => {
  const { id } = req.params;
  try {
    const deleteAUser = await User.findByIdAndDelete(id);
    res.json({ deleteAUser });
  } catch (error) {
    throw new Error(error);
  }
});

module.exports = {
  createUser,
  loginCheck,
  getAllUsers,
  getAUsers,
  deleteAUser,
  updateUser
};

 

โœ… routes/authRoute.js

const express = require("express");
const router = express.Router();
const {createUser, loginCheck, getAllUsers, getAUsers, deleteAUser, updateUser} = require("../controllers/userCtrl");

router.post("/register", createUser);
router.post("/login", loginCheck);
router.get("/all-users", getAllUsers);
router.get("/:id", getAUsers);
router.delete("/:id", deleteAUser);
router.put("/:id", updateUser);

module.exports = router;

 

โœ… config/jwtToken.js

const jwt = require("jsonwebtoken");
const generateToken = (id) => {
    return jwt.sign({id}, process.env.SECRET, {expiresIn : "3d"});
};

module.exports = {
    generateToken
};

 

โœ… models/User.js

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema({
  firstname: {
    type: String,
    required: true
  },
  lastname: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  mobile: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true,
  },
  role: {
    type: String,
    default: "user",
  }
}, { collection: 'Commerce' });

const User = mongoose.model("User", UserSchema);
module.exports = User;

 

728x90
๋ฐ˜์‘ํ˜•
Comments