User Authentication এবং Authorization গাইড ও নোট

Web Development - মিনজেএস (MeanJS)
248

MeanJS স্ট্যাকের মাধ্যমে User Authentication (প্রমাণীকরণ) এবং Authorization (অধিকার প্রদান) পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ এবং নিরাপদ অ্যাপ্লিকেশন তৈরি করার জন্য প্রয়োজনীয়। এখানে, আমরা কীভাবে Node.js (Express.js) এবং MongoDB ব্যবহার করে User Authentication এবং Authorization তৈরি করতে পারি তা বিস্তারিতভাবে আলোচনা করবো।


Authentication এবং Authorization: পার্থক্য

  • Authentication (প্রমাণীকরণ) হল প্রক্রিয়া যার মাধ্যমে একটি ব্যবহারকারীর পরিচয় যাচাই করা হয়, অর্থাৎ তারা দাবী করা ব্যক্তি কিনা তা নিশ্চিত করা।
  • Authorization (অধিকার প্রদান) হল প্রক্রিয়া যার মাধ্যমে একটি ব্যবহারকারী কোন তথ্য বা সেবা অ্যাক্সেস করতে পারবে কিনা তা নির্ধারণ করা হয়।

User Authentication এবং Authorization এর জন্য প্রয়োজনীয় উপাদান

  1. Node.js (Express.js): সার্ভার সাইডের জন্য।
  2. MongoDB: ডেটাবেস হিসেবে।
  3. Passport.js: Node.js-এর জন্য একটি শক্তিশালী authentication middleware
  4. JWT (JSON Web Tokens): Token-based authentication এর জন্য ব্যবহৃত হয়।
  5. bcryptjs: পাসওয়ার্ড এনক্রিপশন এবং ডিক্রিপশন এর জন্য।

User Authentication এবং Authorization এর সেটআপ

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

প্রথমে, আপনাকে কিছু প্যাকেজ ইনস্টল করতে হবে:

npm install express mongoose passport passport-jwt bcryptjs jsonwebtoken --save
  • express: ওয়েব সার্ভার তৈরি করার জন্য।
  • mongoose: MongoDB ডেটাবেসের সাথে যোগাযোগের জন্য।
  • passport: Authentication middleware।
  • passport-jwt: JWT ভিত্তিক authentication ব্যবহারের জন্য।
  • bcryptjs: পাসওয়ার্ড এনক্রিপশন ও ডিক্রিপশন।
  • jsonwebtoken: JWT টোকেন তৈরি ও যাচাই করার জন্য।

২. MongoDB User মডেল তৈরি করা

ব্যবহারকারীর তথ্য সংরক্ষণ করার জন্য প্রথমে একটি User মডেল তৈরি করতে হবে, যা MongoDB তে সংরক্ষিত হবে। এই মডেলে পাসওয়ার্ড হ্যাশিং এবং অন্যান্য তথ্য থাকবে।

models/user.model.js ফাইল তৈরি করুন:

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

// User Schema তৈরি
const userSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true
  }
});

// পাসওয়ার্ড হ্যাশিং
userSchema.pre('save', async function (next) {
  if (!this.isModified('password')) return next();
  
  // bcryptjs ব্যবহার করে পাসওয়ার্ড হ্যাশ করা
  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);
};

module.exports = mongoose.model('User', userSchema);

এখানে, পাসওয়ার্ডটি bcryptjs দিয়ে হ্যাশ করা হচ্ছে এবং matchPassword মেথডের মাধ্যমে পাসওয়ার্ড মিলানো হচ্ছে।


৩. Authentication এর জন্য Passport.js সেটআপ করা

এখন Passport.js ব্যবহার করে JWT এর মাধ্যমে Authentication সিস্টেম সেটআপ করতে হবে।

config/passport.js ফাইল তৈরি করুন:

const passport = require('passport');
const jwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user.model');

// JWT Strategy সেটআপ
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = 'your_jwt_secret'; // JWT সিক্রেট কি

passport.use(new jwtStrategy(opts, async (jwt_payload, done) => {
  try {
    const user = await User.findById(jwt_payload.id);
    if (user) {
      return done(null, user);
    } else {
      return done(null, false);
    }
  } catch (err) {
    return done(err, false);
  }
}));

module.exports = passport;

এখানে, passport-jwt ব্যবহার করে JWT টোকেন যাচাই করা হবে এবং টোকেনের মাধ্যমে ব্যবহারকারীর তথ্য পাওয়া যাবে।


৪. JWT Token তৈরি করা

এখন, আমরা JWT টোকেন তৈরি করার জন্য একটি রাউট তৈরি করবো, যা ইউজার লগইন করলে টোকেন প্রদান করবে।

routes/auth.routes.js ফাইল তৈরি করুন:

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const User = require('../models/user.model');
const passport = require('passport');
const router = express.Router();

// লগইন রুট
router.post('/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 payload = { id: user._id };
    const token = jwt.sign(payload, 'your_jwt_secret', { expiresIn: '1h' });

    res.json({ token }); // টোকেন রিটার্ন করা
  } catch (err) {
    res.status(500).json({ message: 'Server error' });
  }
});

module.exports = router;

এখানে, login API ব্যবহারকারীর ইমেইল এবং পাসওয়ার্ড যাচাই করে, যদি সব ঠিক থাকে, তাহলে JWT টোকেন তৈরি করে ক্লায়েন্টে পাঠানো হয়।


৫. Authorization: Protecting Routes with JWT

এখন, আমরা এমন রাউট তৈরি করবো যা কেবলমাত্র অথেনটিকেশন পাস করা ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য হবে। এই রাউটগুলির জন্য passport.authenticate('jwt', { session: false }) ব্যবহার করা হবে।

routes/protected.routes.js ফাইল তৈরি করুন:

const express = require('express');
const passport = require('passport');
const router = express.Router();

// Protect করা রাউট
router.get('/protected', passport.authenticate('jwt', { session: false }), (req, res) => {
  res.json({ message: 'This is a protected route', user: req.user });
});

module.exports = router;

এখানে, passport.authenticate('jwt', { session: false }) ব্যবহার করে শুধুমাত্র লগইন করা ব্যবহারকারীই /protected রুট অ্যাক্সেস করতে পারবে।


৬. Express.js সার্ভারে রাউট যোগ করা

অবশেষে, server.js ফাইলে রাউটগুলো অ্যাপ্লিকেশনে যুক্ত করা হবে:

const express = require('express');
const mongoose = require('mongoose');
const passport = require('passport');
const app = express();
const port = 3000;

// MongoDB URI
const dbURI = 'mongodb://localhost:27017/meanjs_project';
mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true });

// Middleware
app.use(express.json());
app.use(passport.initialize());

// Routes
const authRoutes = require('./routes/auth.routes');
const protectedRoutes = require('./routes/protected.routes');
app.use('/auth', authRoutes);
app.use('/api', protectedRoutes);

// Passport configuration
require('./config/passport');

// Server
app.listen(port, () => {
  console.log(`Server started on http://localhost:${port}`);
});

সারাংশ

এখন পর্যন্ত, আমরা MeanJS স্ট্যাকের মধ্যে User Authentication এবং Authorization তৈরি করেছি। আমরা JWT এবং Passport.js ব্যবহার করে Authentication সিস্টেম তৈরি করেছি এবং কিছু রাউট প্রোটেক্ট করেছি যা কেবলমাত্র অথেনটিকেটেড ইউজাররা অ্যাক্সেস করতে পারে। এটি একটি শক্তিশালী এবং নিরাপদ সিস্টেম তৈরি করার জন্য একটি ভিত্তি প্রদান করে।

Content added By

MeanJS এ Authentication এর ভূমিকা

196

MeanJS স্ট্যাক, যা MongoDB, Express.js, AngularJS, এবং Node.js এর সমন্বয়ে তৈরি, আধুনিক ওয়েব অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। যেকোনো ওয়েব অ্যাপ্লিকেশনের জন্য Authentication একটি গুরুত্বপূর্ণ ফিচার, যা ব্যবহারকারীদের শনাক্ত এবং প্রমাণীকরণ করতে সহায়ক। MeanJS অ্যাপ্লিকেশনেও Authentication নিশ্চিত করতে বিভিন্ন টেকনোলজি ও পদ্ধতি ব্যবহার করা হয়। এর মাধ্যমে, আপনি শুধুমাত্র বৈধ ব্যবহারকারীদের অ্যাপ্লিকেশনে প্রবেশাধিকার দিতে পারেন এবং ডেটা নিরাপত্তা বজায় রাখতে পারেন।


Authentication কী?

Authentication হল একটি প্রক্রিয়া যার মাধ্যমে সিস্টেম নিশ্চিত করে যে ব্যবহারকারী যে দাবি করছেন, তিনি আসলেই সেই ব্যক্তি কিনা। এটি সাধারণত username এবং password এর মাধ্যমে সম্পন্ন হয়, তবে বর্তমানে multi-factor authentication (MFA), JWT (JSON Web Token), এবং OAuth এর মতো উন্নত পদ্ধতি ব্যবহারও বেড়েছে।

MeanJS এ Authentication ব্যবহৃত হয় ব্যবহারকারীদের নিরাপদভাবে অ্যাক্সেস দেওয়ার জন্য এবং তাদের তথ্য সুরক্ষিত রাখার জন্য।


MeanJS এ Authentication এর প্রক্রিয়া

MeanJS এ সাধারণত JWT (JSON Web Token) বা Session-based authentication ব্যবহৃত হয়, তবে এখানে JWT ব্যবহারের মাধ্যমে Authentication সেটআপ করার পদ্ধতি বর্ণনা করা হচ্ছে।


১. JWT (JSON Web Token) এর মাধ্যমে Authentication

JWT হল একটি ওপেন স্ট্যান্ডার্ড (RFC 7519), যা দুটি পক্ষের মধ্যে নিরাপদ তথ্য স্থানান্তর করতে ব্যবহৃত হয়। JWT মূলত একটি ইন্টারনেট প্রটোকল যা ব্যবহারকারীদের লগইন স্ট্যাটাস ট্র্যাক করার জন্য ব্যবহৃত হয়। এটি সাধারণত Access Token হিসেবে ব্যবহৃত হয়।

JWT Authentication প্রক্রিয়া:

  1. ব্যবহারকারী লগইন করে:
    • ব্যবহারকারী তার username এবং password দিয়ে লগইন করতে পারে।
    • সঠিক তথ্য প্রবেশ করলে, সার্ভার একটি JWT জেনারেট করে।
  2. JWT সঞ্চালন:
    • এই JWT টোকেনটি সার্ভার থেকে ব্যবহারকারীকে প্রেরিত হয় এবং ব্যবহারকারী সেটি তার পরবর্তী প্রতিটি রিকুয়েস্টের সাথে পাঠায়।
  3. Token ভেরিফিকেশন:
    • সার্ভার যখন ব্যবহারকারীর রিকুয়েস্ট পায়, তখন JWT টোকেনটি ভেরিফাই করে দেখবে এটি বৈধ কিনা।
    • যদি টোকেনটি বৈধ হয়, তবে ব্যবহারকারীকে অ্যাক্সেস দেওয়া হয়, অন্যথায় 401 Unauthorized রেসপন্স পাঠানো হয়।

২. MeanJS এ JWT Authentication সেটআপ

Step 1: JWT লাইব্রেরি ইনস্টল করা

প্রথমে jsonwebtoken এবং bcryptjs ইনস্টল করতে হবে, যা JWT টোকেন জেনারেট এবং পাসওয়ার্ড হ্যাশিং জন্য ব্যবহৃত হবে।

npm install jsonwebtoken bcryptjs --save

Step 2: JWT ব্যবহার করে মডেল তৈরি করা

ব্যবহারকারীর মডেল তৈরি করতে হবে যাতে password hashing এবং JWT টোকেন জেনারেশন করা যায়।

// models/user.model.js
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

const userSchema = new mongoose.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();
  this.password = await bcrypt.hash(this.password, 10);
  next();
});

// JWT টোকেন জেনারেট করা
userSchema.methods.generateAuthToken = function () {
  const token = jwt.sign({ _id: this._id }, 'secretkey', { expiresIn: '1h' });
  return token;
};

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

Step 3: Authentication Controller তৈরি করা

এখন, Authentication Controller তৈরি করতে হবে যেখানে লগইন করার জন্য JWT টোকেন জেনারেট করা হবে।

// controllers/auth.controller.js
const User = require('../models/user.model');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');

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

  // ব্যবহারকারী খোঁজা
  const user = await User.findOne({ email });
  if (!user) return res.status(400).send('Invalid email or password.');

  // পাসওয়ার্ড যাচাই
  const isMatch = await bcrypt.compare(password, user.password);
  if (!isMatch) return res.status(400).send('Invalid email or password.');

  // JWT টোকেন তৈরি
  const token = user.generateAuthToken();
  res.send({ token });
};

Step 4: রাউট সেটআপ করা

এখন, লগইন রাউট তৈরি করতে হবে যেখানে ব্যবহারকারী POST রিকুয়েস্ট দিয়ে তার email এবং password পাঠাবে।

// 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;

Step 5: JWT Middleware তৈরি করা

এখন, JWT Middleware তৈরি করতে হবে, যা ব্যবহারকারীর JWT টোকেন ভেরিফাই করবে।

// middleware/auth.middleware.js
const jwt = require('jsonwebtoken');

const authenticate = (req, res, next) => {
  const token = req.header('Authorization').replace('Bearer ', '');

  if (!token) {
    return res.status(401).send('Access denied. No token provided.');
  }

  try {
    const decoded = jwt.verify(token, 'secretkey');
    req.user = decoded;
    next();
  } catch (error) {
    return res.status(400).send('Invalid token.');
  }
};

module.exports = authenticate;

Step 6: Middleware ব্যবহার করা

আপনি যেখানে authentication প্রয়োজন, সেখানে এই authenticate middleware ব্যবহার করতে পারবেন।

// routes/protected.routes.js
const express = require('express');
const router = express.Router();
const authenticate = require('../middleware/auth.middleware');

// একটি প্রটেক্টেড রাউট
router.get('/protected', authenticate, (req, res) => {
  res.send('This is a protected route!');
});

module.exports = router;

সারাংশ

MeanJSAuthentication অত্যন্ত গুরুত্বপূর্ণ, এবং JWT (JSON Web Token) ব্যবহার করে এটি কার্যকরভাবে বাস্তবায়ন করা যায়। JWT টোকেন ব্যবহারকারীদের সুরক্ষিতভাবে লগইন করার অনুমতি দেয় এবং তাদের পরবর্তী রিকুয়েস্টের জন্য সিস্টেমে অ্যাক্সেস নিশ্চিত করে। এই পদ্ধতি ব্যবহার করে, আপনি আপনার অ্যাপ্লিকেশনে নিরাপদ ও সুরক্ষিত Authentication প্রক্রিয়া সহজেই সেটআপ করতে পারেন।

Content added By

JSON Web Tokens (JWT) এর মাধ্যমে Authentication

234

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

User Registration, Login, এবং Logout ব্যবস্থা

181

MeanJS স্ট্যাক ব্যবহার করে User Registration, Login, এবং Logout ব্যবস্থা তৈরি করা একটি সাধারণ, কিন্তু গুরুত্বপূর্ণ কার্যকলাপ। এটি সাধারণত Express.js (সার্ভার সাইড) এবং AngularJS (ফ্রন্টএন্ড) এর মাধ্যমে পরিচালিত হয়। এই ব্যবস্থাগুলোর মধ্যে Authentication এবং Authorization ব্যবহৃত হয়, যাতে ব্যবহারকারীর তথ্য নিরাপদ থাকে এবং শুধুমাত্র অনুমোদিত ব্যবহারকারীরাই সিস্টেমে লগইন করতে পারে।

এখানে আমরা JWT (JSON Web Token) ভিত্তিক সিকিউরিটি ব্যবহার করব, যা একটি নিরাপদ এবং জনপ্রিয় উপায় ব্যবহারকারীদের সেশন পরিচালনা করার জন্য।


১. Back-End (Express.js): User Registration, Login, এবং Logout

MongoDB মডেল তৈরি করা:

প্রথমে, User মডেল তৈরি করতে হবে যাতে ব্যবহারকারীদের নাম, ইমেইল, এবং পাসওয়ার্ড সংরক্ষণ করা হবে।

// models/user.model.js

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

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true }
});

// পাসওয়ার্ড হ্যাশ করা
userSchema.pre('save', async function(next) {
  if (!this.isModified('password')) return next();
  this.password = await bcrypt.hash(this.password, 10);
  next();
});

// পাসওয়ার্ড তুলনা করার মেথড
userSchema.methods.comparePassword = async function(candidatePassword) {
  return await bcrypt.compare(candidatePassword, this.password);
};

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

module.exports = User;

এখানে, bcryptjs ব্যবহার করা হয়েছে পাসওয়ার্ড হ্যাশিং করার জন্য। আমরা pre('save') হুক ব্যবহার করে পাসওয়ার্ড সেভ করার আগে হ্যাশ করেছি এবং comparePassword মেথড ব্যবহার করে পাসওয়ার্ডের মিল চেক করব।

JWT টোকেন ক্রিয়েশন:

এখন, আমরা jsonwebtoken প্যাকেজ ব্যবহার করে লগইন করার পর একটি JWT টোকেন তৈরি করব।

npm install jsonwebtoken bcryptjs

Authentication রাউট তৈরি করা:

এখন আমরা POST রাউট তৈরি করব যা ব্যবহারকারীকে রেজিস্টার এবং লগইন করতে সহায়ক হবে।

// routes/auth.route.js

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const User = require('../models/user.model');
const router = express.Router();

// JWT সিক্রেট কী
const JWT_SECRET = 'your-secret-key';

// রেজিস্ট্রেশন রাউট
router.post('/register', async (req, res) => {
  const { name, email, password } = req.body;

  try {
    const userExists = await User.findOne({ email });
    if (userExists) {
      return res.status(400).json({ message: 'User already exists' });
    }

    const newUser = new User({ name, email, password });
    await newUser.save();
    res.status(201).json({ message: 'User registered successfully' });
  } catch (err) {
    res.status(500).json({ message: 'Error in registration' });
  }
});

// লগইন রাউট
router.post('/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 email or password' });
    }

    const isMatch = await user.comparePassword(password);
    if (!isMatch) {
      return res.status(400).json({ message: 'Invalid email or password' });
    }

    const token = jwt.sign({ userId: user._id }, JWT_SECRET, { expiresIn: '1h' });
    res.status(200).json({ token });
  } catch (err) {
    res.status(500).json({ message: 'Error in login' });
  }
});

// লগআউট রাউট (JWT টোকেন রিভোকেশন)
router.post('/logout', (req, res) => {
  // ক্লায়েন্ট সাইডে টোকেন মুছে ফেলা হবে, এখানে সার্ভারে কোনো টোকেন রিভোকেশন দরকার নেই।
  res.status(200).json({ message: 'Logged out successfully' });
});

module.exports = router;

এখানে:

  • /register রাউট ব্যবহারকারীদের নিবন্ধন করার জন্য,
  • /login রাউট ব্যবহারকারীদের লগইন করার জন্য,
  • /logout রাউট ব্যবহারকারীদের লগআউট করার জন্য (এই ক্ষেত্রে, ক্লায়েন্ট সাইডে টোকেন রিভোকেশন করতে হবে)।

২. Front-End (Angular): User Registration, Login, এবং Logout

HTTPClient মডিউল ব্যবহার করা:

এখানে, আমরা Angular অ্যাপ্লিকেশন তৈরি করব যেখানে ব্যবহারকারী রেজিস্ট্রেশন, লগইন এবং লগআউট করতে পারবেন।

প্রথমে HttpClientModule ইম্পোর্ট করুন:

// app.module.ts

import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [HttpClientModule],
})
export class AppModule {}

API সার্ভিস তৈরি করা:

// src/app/auth.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  private apiUrl = 'http://localhost:3000/api';

  constructor(private http: HttpClient) {}

  // রেজিস্ট্রেশন ফাংশন
  register(name: string, email: string, password: string): Observable<any> {
    return this.http.post(`${this.apiUrl}/register`, { name, email, password });
  }

  // লগইন ফাংশন
  login(email: string, password: string): Observable<any> {
    return this.http.post(`${this.apiUrl}/login`, { email, password });
  }

  // লগআউট ফাংশন
  logout() {
    localStorage.removeItem('token');
  }

  // টোকেন গ্রহণ
  getToken() {
    return localStorage.getItem('token');
  }
}

AuthComponent তৈরি করা:

// src/app/auth/auth.component.ts

import { Component } from '@angular/core';
import { AuthService } from '../auth.service';
import { Router } from '@angular/router';

@Component({
  selector: 'app-auth',
  template: `
    <div>
      <h2>Login</h2>
      <form (submit)="login()">
        <input [(ngModel)]="email" type="email" placeholder="Email" required />
        <input [(ngModel)]="password" type="password" placeholder="Password" required />
        <button type="submit">Login</button>
      </form>
    </div>
  `
})
export class AuthComponent {
  email: string;
  password: string;

  constructor(private authService: AuthService, private router: Router) {}

  login() {
    this.authService.login(this.email, this.password).subscribe(response => {
      localStorage.setItem('token', response.token);
      this.router.navigate(['/dashboard']);
    });
  }
}

এখানে, AuthComponent ব্যবহারকারীর login ফর্ম গ্রহণ করে এবং AuthService এর মাধ্যমে লগইন রিকোয়েস্ট পাঠায়।


৩. JWT এর সাহায্যে সুরক্ষিত রুট

Angular অ্যাপ্লিকেশন থেকে সুরক্ষিত রুট অ্যাক্সেস করার জন্য, আমরা JWT টোকেন ব্যবহার করব। AuthGuard ব্যবহার করে, আমরা চেক করব যে ইউজারের টোকেন রয়েছে কি না।

// src/app/auth.guard.ts

import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
import { Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(): boolean {
    if (!this.authService.getToken()) {
      this.router.navigate(['/login']);
      return false;
    }
    return true;
  }
}

এটি চেক করবে যে ব্যবহারকারী লগইন অবস্থায় আছেন কিনা, এবং যদি না থাকেন, তবে /login পেজে রিডাইরেক্ট করবে।


সারাংশ

এই উদাহরণে, আমরা MeanJS স্ট্যাক ব্যবহার করে একটি User Registration, Login, এবং Logout ব্যবস্থা তৈরি করেছি। Express.js ব্যবহার করে JWT ভিত্তিক অথেনটিকেশন তৈরি করা হয়েছে এবং Angular এ লগইন, রেজিস্ট্রেশন, এবং লগআউটের ব্যবস্থাপনা করা হয়েছে। JWT টোকেন ব্যবহার করে নিরাপদভাবে ব্যবহারকারীদের লগইন এবং লগআউট পরিচালিত হয়েছে, যা সুরক্ষিত অ্যাপ্লিকেশন তৈরি করতে সহায়ক।

Content added By

Role-based Access Control (RBAC) এবং Authorization

257

Role-based Access Control (RBAC) এবং Authorization ওয়েব অ্যাপ্লিকেশনে নিরাপত্তা ব্যবস্থার গুরুত্বপূর্ণ উপাদান। MeanJS ব্যবহার করে সহজেই RBAC ইমপ্লিমেন্ট করা যায়। এতে ব্যবহারকারীর বিভিন্ন রোলের ওপর ভিত্তি করে অ্যাপ্লিকেশন এর বিভিন্ন অংশে অ্যাক্সেস নিয়ন্ত্রণ করা হয়।

এখানে, আমরা দেখবো কিভাবে RBAC এবং Authorization MeanJS অ্যাপ্লিকেশনে ইমপ্লিমেন্ট করা যায়।


RBAC এবং Authorization কী?

  • RBAC (Role-based Access Control) হল একটি সিস্টেম যেখানে ব্যবহারকারীর বিভিন্ন রোলের ওপর ভিত্তি করে অ্যাপ্লিকেশনের অংশগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করা হয়।
  • Authorization হল একটি প্রক্রিয়া যা নিশ্চিত করে যে একটি ব্যবহারকারী শুধুমাত্র অনুমোদিত রিসোর্স বা কার্যকলাপে অ্যাক্সেস পায়।

MeanJS এ RBAC এবং Authorization ইমপ্লিমেন্টেশন

MeanJS অ্যাপ্লিকেশনে RBAC সেটআপ করার জন্য নিম্নলিখিত পদক্ষেপ অনুসরণ করা হয়:


১. ব্যবহারকারী মডেল এবং রোল ফিল্ড তৈরি করা

প্রথমে, একটি User মডেল তৈরি করা হবে যেখানে ব্যবহারকারীর রোল সংরক্ষিত থাকবে। এর মাধ্যমে নির্ধারণ করা যাবে যে, কোন ব্যবহারকারী কোন ধরনের অ্যাক্সেস পাবে।

user.model.js

'use strict';

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

// User Schema তৈরি করা
var UserSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        unique: true,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    roles: {
        type: [String],  // ব্যবহারকারী একাধিক রোল ধারণ করতে পারে
        default: ['user'],  // ডিফল্ট রোল 'user'
        enum: ['user', 'admin', 'moderator']  // রোলের সীমা
    }
});

// মডেল তৈরি করা
var User = mongoose.model('User', UserSchema);

module.exports = User;

এখানে, roles ফিল্ডটি ব্যবহারকারীর রোল সংরক্ষণ করবে, এবং ব্যবহারকারী একাধিক রোল পেতে পারে (যেমন user, admin, বা moderator)।


২. Role-based Access Control (RBAC) Middleware তৈরি করা

এখন, একটি middleware তৈরি করতে হবে যা অ্যাক্সেস নিয়ন্ত্রণ করবে। এই middleware এর মাধ্যমে আমরা চেক করতে পারবো যে, কোন ব্যবহারকারী নির্দিষ্ট রোল ছাড়া অ্যাক্সেস করার চেষ্টা করছে কি না।

rbac.middleware.js

'use strict';

var User = require('../models/user.model');  // User মডেলটি আমদানি করা

// RBAC Middleware - রোল যাচাই করা
exports.hasRole = function(requiredRole) {
    return function(req, res, next) {
        if (req.user && req.user.roles && req.user.roles.includes(requiredRole)) {
            return next();  // রোল মিলে গেলে পরবর্তী প্রসেসে যাবে
        } else {
            return res.status(403).send({ message: 'You do not have permission to access this resource.' });  // অনুমতি না থাকলে 403 রেসপন্স
        }
    };
};

এখানে, hasRole ফাংশনটি একটি নির্দিষ্ট রোল যাচাই করবে এবং যদি ব্যবহারকারীর রোল মিলে যায়, তবে অ্যাপ্লিকেশনে সেই রিসোর্স অ্যাক্সেস করা যাবে।


৩. Authorization রাউট এবং RBAC Middleware ব্যবহার করা

এখন, আপনি আপনার রাউটে RBAC middleware ব্যবহার করতে পারেন যাতে রোল চেক করা যায়। নিচে একটি উদাহরণ দেওয়া হলো, যেখানে Admin রোলের জন্য একটি সুরক্ষিত রাউট তৈরি করা হয়েছে।

admin.routes.js

'use strict';

var express = require('express');
var router = express.Router();
var rbacMiddleware = require('../middlewares/rbac.middleware');  // RBAC middleware

// Admin রাউট - এখানে Admin রোল চেক করা হবে
router.get('/admin', rbacMiddleware.hasRole('admin'), function(req, res) {
    res.send({ message: 'Welcome Admin! You have access to this resource.' });
});

module.exports = router;

এখানে, /admin রাউটে শুধুমাত্র Admin রোলের ব্যবহারকারীই অ্যাক্সেস পাবে।


৪. Authentication এবং Authorization যুক্ত করা

RBAC এর সাথে authentication যোগ করা প্রয়োজন। ব্যবহারকারীর login হওয়া নিশ্চিত করে এবং তার পর authorization চেক করা হয়। সাধারণত, JWT (JSON Web Token) ব্যবহার করা হয়।

authentication.controller.js

'use strict';

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

// লগইন ফাংশন
exports.login = function(req, res) {
    User.findOne({ email: req.body.email })
        .then(user => {
            if (!user || user.password !== req.body.password) {
                return res.status(401).send({ message: 'Invalid credentials.' });
            }

            // JWT টোকেন জেনারেট করা
            var token = jwt.sign({ id: user._id, roles: user.roles }, 'secret_key', { expiresIn: '1h' });
            res.send({ token: token });  // JWT রিটার্ন
        })
        .catch(err => {
            res.status(500).send({ message: 'Server error.' });
        });
};

এখানে, লগইন করার পর, ব্যবহারকারীর রোলের সাথে একটি JWT টোকেন জেনারেট করা হচ্ছে। এই টোকেন পরে ব্যবহারকারীকে তার অ্যাক্সেস অনুমতি দেয়।


৫. Authorization Middleware এবং Token যাচাই করা

এখন, ব্যবহারকারীর JWT টোকেন যাচাই করার জন্য একটি middleware তৈরি করতে হবে। এই middleware ব্যবহারকারীকে সঠিক রোল যাচাই করে অ্যাক্সেস দেওয়ার জন্য ব্যবহৃত হবে।

authorization.middleware.js

'use strict';

var jwt = require('jsonwebtoken');

// JWT টোকেন যাচাই করা
exports.verifyToken = function(req, res, next) {
    var token = req.headers['authorization'];

    if (!token) {
        return res.status(403).send({ message: 'No token provided.' });
    }

    jwt.verify(token, 'secret_key', function(err, decoded) {
        if (err) {
            return res.status(401).send({ message: 'Unauthorized access.' });
        }

        req.user = decoded;  // ইউজারের তথ্য সংরক্ষণ করা
        next();
    });
};

এখানে, verifyToken middleware প্রথমে টোকেন যাচাই করে এবং যদি সঠিক থাকে, তাহলে ব্যবহারকারীর ডেটা req.user তে সেট করা হয়।


৬. সম্পূর্ণ রাউট ও Middleware সংযোগ করা

এখন আপনি RBAC এবং Authorization middleware যুক্ত করে রাউটগুলিতে নিরাপত্তা প্রয়োগ করতে পারেন।

server.js

var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var authMiddleware = require('./middlewares/authorization.middleware');
var rbacMiddleware = require('./middlewares/rbac.middleware');
var userRoutes = require('./routes/user.routes');
var adminRoutes = require('./routes/admin.routes');

var app = express();
app.use(bodyParser.json());

// MongoDB কানেকশন
mongoose.connect('mongodb://localhost:27017/meanjs', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('MongoDB connected'))
    .catch(err => console.log('MongoDB connection error:', err));

// Middleware
app.use(authMiddleware.verifyToken);  // Token যাচাই করা

// রাউট
app.use('/api/users', userRoutes);
app.use('/api', adminRoutes);  // Admin রাউট যেখানে RBAC middleware ব্যবহৃত হবে

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

এখানে verifyToken middleware সমস্ত রাউটে ব্যবহৃত হচ্ছে, এবং RBAC middleware শুধুমাত্র admin রাউটে অ্যাক্সেস নিয়ন্ত্রণ করবে।


সারাংশ

RBAC এবং Authorization MeanJS অ্যাপ্লিকেশনে ব্যবহারকারী রোল অনুযায়ী অ্যাক্সেস নিয়ন্ত্রণ করার একটি শক্তিশালী পদ্ধতি। JWT (JSON Web Token) ব্যবহার করে authentication এবং authorization করার মাধ্যমে আপনি নিরাপদ এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করতে পারেন। RBAC এর মাধ্যমে আপনি কাস্টম রোল তৈরি করে বিভিন্ন অংশের অ্যাক্সেস নিয়ন্ত্রণ করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...