MERN

⌘K
  1. Home
  2. Docs
  3. MERN
  4. অথেনটিকেশন তৈরী করবো

অথেনটিকেশন তৈরী করবো


একটি এপ্লিকেশন এর মূল প্রাণ এর অথেনটিকেশন এটা আমরা এখন বানাবো।

models ফোল্ডার

models নামে একটি ফোল্ডার তৈরী করি এর মধ্যে এর মধ্যে ডেটাবেজ মডেল থাকবে

user মডেল

user.js নামে ফাইল তৈরী করি

const { DataTypes } = require('sequelize');
const sequelize = require('../config/db');

const User = sequelize.define('User', {
  username: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
  },
  password: {
    type: DataTypes.STRING,
    allowNull: false,
  },
});

module.exports = User;

controllers ফোল্ডার

মডেলের reate read update delete ইত্যাদি মেথড গুলি আমরা controlers ফোল্ডারে ফাইলে রাখবো

userController

উপরের user মডেলের create read update delete ইত্যাদি মেথড গুলি আমরা controlers ফোল্ডারে userController.js ফাইলে রাখবো।

.env তে jwt এর জন্য আমাদের সিক্রেট কোড সংরক্ষণ করি

JWT_SECRET=dgdgdgdgdgr5
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const User = require('../models/user');

exports.register = async (req, res) => {
    try {
      const { username, password } = req.body;
  
      if (!password) {
        return res.status(400).json({ error: 'Password is required' });
      }
  
      const hashedPassword = await bcrypt.hash(password, 10);
  
      // Now create the user with the hashed password
      const user = await User.create({ username, password: hashedPassword });
  
      res.json({ user, message: 'User registered successfully' });
    } catch (error) {
      res.status(500).json({ error: error.message });
    }
  };

// Login user and generate JWT
exports.login = async (req, res) => {
  try {
    const { username, password } = req.body;
    const user = await User.findOne({ where: { username } });

    if (!user) {
      return res.status(401).json({ message: 'Invalid credentials' });
    }

    const isValidPassword = await bcrypt.compare(password, user.password);

    if (!isValidPassword) {
      return res.status(401).json({ message: 'Invalid credentials' });
    }

    const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: '1h' });

    res.json({ token, message: 'Login successful' });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};


// Update user
exports.updateUser = async (req, res) => {
  try {
    const { userId } = req.user;
    const { username, password } = req.body;

    // Check if the user exists
    const existingUser = await User.findByPk(userId);

    if (!existingUser) {
      return res.status(404).json({ message: 'User not found' });
    }

    // Update user details
    existingUser.username = username;
    existingUser.password = await bcrypt.hash(password, 10);
    await existingUser.save();

    res.json({ user: existingUser, message: 'User updated successfully' });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

// Delete user by admin
exports.deleteUserByAdmin = async (req, res) => {
  try {
    const { userId } = req.params;

    // Check if the user exists
    const userToDelete = await User.findByPk(userId);

    if (!userToDelete) {
      return res.status(404).json({ message: 'User not found' });
    }

    // Check if the requester is an admin
    if (req.user.role !== 'admin') {
      return res.status(403).json({ message: 'Forbidden: Only admin can delete users' });
    }

    // Delete the user
    await userToDelete.destroy();

    res.json({ message: 'User deleted successfully' });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

// Read single user
exports.getSingleUser = async (req, res) => {
  try {
    const { userId } = req.params;

    // Check if the user exists
    const user = await User.findByPk(userId);

    if (!user) {
      return res.status(404).json({ message: 'User not found' });
    }

    res.json({ user });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

Routes ফোল্ডার

userRoutes.js

const express = require('express');
const userController = require('../controllers/userController');
const { authenticateJWT } = require('../middleware/authMiddleware'); // Import the middleware

const router = express.Router();

router.post('/register', userController.register);
router.post('/login', userController.login);
router.put('/update', authenticateJWT, updateUser);
router.get('/:userId', authenticateJWT, getSingleUser);
router.delete('/:userId', authenticateJWT, deleteUserByAdmin);

module.exports = router;

index.js

index.js ফাইলে আমাদের route টি ইম্পোর্ট করুন এবং ব্যবহার করুন

const userRoutes = require('./routes/userRoutes');
app.use('/api/users', userRoutes);

এবার আমরা আমাদের ডেটাবেজ এ মডেল অনুযায়ী টেবিল দেখতে পারবো এখন আমরা api পরীক্ষা করতে পারি

Url

127.0.0.1:3000/api/users/register
127.0.0.1:3000/api/users/login

How can we help?