Web Development JSON Web Tokens (JWT) এর মাধ্যমে Authentication গাইড ও নোট

244

JSON Web Token (JWT) একটি ওপেন স্ট্যান্ডার্ড (RFC 7519) যা নিরাপদভাবে দুটি পক্ষের মধ্যে তথ্য এক্সচেঞ্জ করার জন্য ব্যবহৃত হয়। JWT মূলত অ্যাপ্লিকেশনের Authentication এবং Authorization এর জন্য ব্যবহৃত হয়। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদ তথ্য পাঠানোর একটি পদ্ধতি, যা সাধারণত সেশন ভিত্তিক অ্যাপ্লিকেশনগুলোর বদলে ব্যবহৃত হয়।

এখানে আমরা দেখব MeanJS এর মধ্যে JWT কিভাবে ইন্টিগ্রেট করা যায় এবং অ্যাপ্লিকেশনটির জন্য Authentication কিভাবে পরিচালিত হয়।


JWT এর কাঠামো

JWT তিনটি অংশে বিভক্ত:

  1. Header: JWT এর প্রথম অংশ, যা টাইপ (যেমন "JWT") এবং সিগনেচার এলগরিদম (যেমন HMAC SHA256 অথবা RSA) নির্ধারণ করে।
  2. Payload: এই অংশে তথ্য বা claims থাকে। Claims গুলি বিভিন্ন ধরনের হতে পারে, যেমন Registered Claims (যেমন exp এর মাধ্যমে expiry time), Public Claims, এবং Private Claims
  3. Signature: এটি header এবং payload এর সিগনেচার অংশ। এটি নিরাপত্তা নিশ্চিত করার জন্য secret key এর মাধ্যমে তৈরি হয়।

এটি তিনটি অংশের মধ্যে ডট (.) দ্বারা আলাদা করা থাকে, যেমন:
header.payload.signature


JWT Authentication MeanJS-এ কিভাবে কাজ করে?

JWT Authentication এর মাধ্যমে, সার্ভার ক্লায়েন্টকে একটি JWT টোকেন প্রদান করে। সেই টোকেন পরবর্তীতে ক্লায়েন্টের রিকুয়েস্টের সাথে সার্ভারে পাঠানো হয়। সার্ভার সেই টোকেনের মাধ্যমে ক্লায়েন্টের পরিচয় নিশ্চিত করে এবং প্রয়োজনীয় রিসোর্স অ্যাক্সেস প্রদান করে।

এখন, MeanJS স্ট্যাকের মধ্যে JWT Authentication কিভাবে সেটআপ করা যায়, তা দেখবো।


প্রথমে প্রয়োজনীয় প্যাকেজ ইনস্টল করা

JWT এবং Authentication ব্যবস্থাপনা করার জন্য আমাদের দুটি গুরুত্বপূর্ণ প্যাকেজ ইনস্টল করতে হবে:

npm install jsonwebtoken bcryptjs
  • jsonwebtoken: JWT তৈরি এবং যাচাই করার জন্য ব্যবহৃত।
  • bcryptjs: পাসওয়ার্ড হ্যাশিং এবং যাচাইয়ের জন্য ব্যবহৃত।

1. ইউজার মডেল এবং পাসওয়ার্ড হ্যাশিং

প্রথমে, আমরা User মডেলে bcryptjs ব্যবহার করে পাসওয়ার্ড হ্যাশিং সম্পন্ন করব। models/user.model.js ফাইলটি আপডেট করুন:

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const Schema = mongoose.Schema;

// ইউজার স্কিমা তৈরি
const userSchema = new Schema({
  name: {
    type: String,
    required: 'Name is required'
  },
  email: {
    type: String,
    required: 'Email is required',
    unique: true
  },
  password: {
    type: String,
    required: 'Password is required'
  }
});

// পাসওয়ার্ড হ্যাশিং ফাংশন
userSchema.pre('save', async function(next) {
  if (!this.isModified('password')) return next();

  const salt = await bcrypt.genSalt(10);
  this.password = await bcrypt.hash(this.password, salt);
  next();
});

// পাসওয়ার্ড যাচাই ফাংশন
userSchema.methods.matchPassword = async function(enteredPassword) {
  return await bcrypt.compare(enteredPassword, this.password);
};

const User = mongoose.model('User', userSchema);

module.exports = User;

এখানে, আমরা পাসওয়ার্ড হ্যাশিং এবং যাচাইয়ের জন্য bcryptjs ব্যবহার করেছি। যখন একটি ইউজার তৈরি হবে, তার পাসওয়ার্ড স্বয়ংক্রিয়ভাবে হ্যাশ হয়ে যাবে।


2. JWT টোকেন তৈরি করা এবং Authentication রুট তৈরি করা

এখন, আমরা JWT টোকেন তৈরি করার জন্য একটি ফাংশন তৈরি করব, যা ইউজারের লগইন রিকুয়েস্ট হ্যান্ডেল করবে এবং টোকেন রিটার্ন করবে। এটি controllers/auth.controller.js ফাইলে তৈরি করা হবে:

const jwt = require('jsonwebtoken');
const User = require('../models/user.model');

// JWT সিক্রেট কী
const JWT_SECRET = 'your_secret_key'; // এটি পরিবেশগত ভেরিয়েবল দ্বারা নিরাপদ রাখা উচিত

// ইউজার লগইন ফাংশন
exports.login = async (req, res) => {
  const { email, password } = req.body;

  try {
    // ইউজার খোঁজা
    const user = await User.findOne({ email });
    if (!user) {
      return res.status(400).json({ message: 'Invalid credentials' });
    }

    // পাসওয়ার্ড যাচাই করা
    const isMatch = await user.matchPassword(password);
    if (!isMatch) {
      return res.status(400).json({ message: 'Invalid credentials' });
    }

    // JWT টোকেন তৈরি করা
    const token = jwt.sign(
      { id: user._id, name: user.name, email: user.email },
      JWT_SECRET,
      { expiresIn: '1h' } // 1 ঘণ্টা পর টোকেন এক্সপায়ার হবে
    );

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

এখানে, login ফাংশন ইউজারের ইমেইল এবং পাসওয়ার্ড যাচাই করে এবং সঠিক হলে একটি JWT টোকেন প্রদান করে।


3. রাউট তৈরি করা

এখন, login রাউটটি routes/auth.routes.js ফাইলে তৈরি করা হবে:

const express = require('express');
const router = express.Router();
const authController = require('../controllers/auth.controller');

// ইউজার লগইন রাউট
router.post('/login', authController.login);

module.exports = router;

এখানে, POST /login রিকুয়েস্ট ইউজার লগইন করার জন্য ব্যবহার হবে।


4. JWT অথেনটিকেশন Middleware

যেহেতু আমরা টোকেনের মাধ্যমে Authentication করতে যাচ্ছি, আমাদের একটি Middleware তৈরি করতে হবে যা রিকুয়েস্টে JWT টোকেন যাচাই করবে। middleware/authMiddleware.js ফাইলে এটি তৈরি করা হবে:

const jwt = require('jsonwebtoken');
const JWT_SECRET = 'your_secret_key'; // এটি পরিবেশগত ভেরিয়েবল দ্বারা নিরাপদ রাখা উচিত

// JWT অথেনটিকেশন Middleware
const protect = (req, res, next) => {
  let token;

  // রিকুয়েস্টের হেডারে টোকেন থাকলে তা বের করা
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
    try {
      token = req.headers.authorization.split(' ')[1];

      // টোকেন যাচাই করা
      const decoded = jwt.verify(token, JWT_SECRET);

      // ইউজারের ডেটা রিকোয়েস্ট অবজেক্টে যোগ করা
      req.user = decoded;
      next(); // পরবর্তী মডিউলে যেতে দেয়া
    } catch (error) {
      res.status(401).json({ message: 'Not authorized, token failed' });
    }
  }

  if (!token) {
    res.status(401).json({ message: 'Not authorized, no token' });
  }
};

module.exports = protect;

এটি ব্যবহার করে যেকোন রাউটে JWT Authentication প্রয়োগ করা যাবে।


5. রাউটে JWT Authentication প্রয়োগ করা

যেকোন রাউটে Authentication প্রয়োগ করতে, আমরা protect middleware ব্যবহার করব। যেমন:

const express = require('express');
const router = express.Router();
const protect = require('../middleware/authMiddleware');
const someController = require('../controllers/some.controller');

// JWT Authentication প্রয়োগ করা রাউটে
router.get('/protected-route', protect, someController.protectedRoute);

module.exports = router;

এখানে, /protected-route রাউটটি JWT Authentication প্রয়োজন, এবং protect middleware এর মাধ্যমে টোকেন যাচাই করা হবে।


সারাংশ

এখন, MeanJS স্ট্যাকের মধ্যে JWT Authentication ইন্টিগ্রেট করা হয়েছে। আমরা একটি login রাউট তৈরি করেছি যা ইউজারকে JWT টোকেন প্রদান করে এবং এই টোকেন ব্যবহার করে পরবর্তী রিকুয়েস্টের সাথে Authentication করা হয়। JWT এর মাধ্যমে আপনি সহজেই সেশন-ভিত্তিক অ্যাপ্লিকেশন থেকে সেশন-কম্প্যাক্ট, নিরাপদ এবং স্কেলেবল সমাধানে রূপান্তরিত হতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...