Authentication এবং Authorization হল ওয়েব অ্যাপ্লিকেশনে নিরাপত্তা ব্যবস্থা সংক্রান্ত দুটি গুরুত্বপূর্ণ প্রক্রিয়া। Authentication হল ইউজারের পরিচয় নিশ্চিত করা এবং Authorization হল ইউজারের অনুমতি যাচাই করা। ExpressJS এ এই দুটি প্রক্রিয়া কার্যকরভাবে ইমপ্লিমেন্ট করা যায়, যা অ্যাপ্লিকেশনকে নিরাপদ রাখে এবং সঠিক ব্যবহারকারীর জন্য যথাযথ এক্সেস নিশ্চিত করে।
১. Authentication (প্রমাণীকরণ)
Authentication হল একটি প্রক্রিয়া যার মাধ্যমে ব্যবহারকারীর পরিচয় যাচাই করা হয়। সাধারণত ইউজারনেম ও পাসওয়ার্ডের মাধ্যমে পরিচয় যাচাই করা হয়, তবে OAuth, JWT (JSON Web Tokens), এবং সেশনের মতো আধুনিক পদ্ধতিও ব্যবহার করা হয়।
১.১. Username এবং Password এর মাধ্যমে Authentication
ExpressJS এ সাধারণভাবে ইউজারনেম এবং পাসওয়ার্ড দিয়ে authentication পরিচালনা করা হয়। এখানে আমরা express-session এবং bcryptjs লাইব্রেরি ব্যবহার করে একটি সাধারণ authentication সিস্টেম তৈরি করতে পারি।
ইনস্টলেশন:
npm install express-session bcryptjs
কোড উদাহরণ:
const express = require('express');
const bcrypt = require('bcryptjs');
const session = require('express-session');
const app = express();
const port = 3000;
// মডিউল সেটআপ
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(session({
secret: 'secretKey',
resave: false,
saveUninitialized: true
}));
// Dummy ইউজার ডেটাবেস (প্রডাকশন এলে ডাটাবেস ব্যবহার করবেন)
const users = [
{
id: 1,
username: 'john',
password: '$2a$10$QZyp9.yM9se0cT1OWPU5UO1J2L2ecWZYp1daTb98kIu6zHdoBGz3G', // পাসওয়ার্ড: "password123"
}
];
// লগইন রাউট
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username);
if (!user) {
return res.status(401).send('User not found');
}
// পাসওয়ার্ড যাচাই করা
const isMatch = await bcrypt.compare(password, user.password);
if (isMatch) {
req.session.userId = user.id; // সেশনে ইউজারের ID সংরক্ষণ
res.send('Logged in successfully');
} else {
res.status(401).send('Invalid password');
}
});
// লগআউট রাউট
app.get('/logout', (req, res) => {
req.session.destroy((err) => {
if (err) return res.status(500).send('Logout failed');
res.send('Logged out successfully');
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে:
- ইউজার যখন সঠিক ইউজারনেম এবং পাসওয়ার্ড দেয়, তখন
bcrypt.compareপদ্ধতি ব্যবহার করে পাসওয়ার্ড যাচাই করা হয়। - সফলভাবে লগইন হলে, সেশনে ইউজারের ID সংরক্ষণ করা হয় যাতে পরবর্তী রাউটগুলোতে ইউজার পরিচয় চেক করা যায়।
১.২. JWT (JSON Web Token) এর মাধ্যমে Authentication
JWT (JSON Web Token) আধুনিক ওয়েব অ্যাপ্লিকেশনে authentication ব্যবস্থার জন্য একটি জনপ্রিয় পদ্ধতি। এটি স্ট্যাটলেস এবং নিরাপদ পদ্ধতিতে ইউজারকে অথেন্টিকেট করে।
ইনস্টলেশন:
npm install jsonwebtoken
কোড উদাহরণ:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
const users = [
{
id: 1,
username: 'john',
password: 'password123',
}
];
const secretKey = 'secretKey'; // JWT সিক্রেট কী
// ইউজার লোগইন রাউট
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
// JWT তৈরি করা
const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Invalid credentials');
}
});
// JWT দিয়ে প্রোটেক্টেড রাউট
app.get('/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('Access denied');
}
// JWT ভেরিফাই করা
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
return res.status(403).send('Invalid token');
}
res.send(`Protected content for user ID: ${decoded.userId}`);
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে:
- ইউজার সফলভাবে লগইন করলে, একটি JWT টোকেন তৈরি করা হয় এবং সেটি ইউজারকে ফেরত দেওয়া হয়।
- পরবর্তীতে ইউজার যখন
protectedরাউটে যাবে, তখন JWT টোকেন যাচাই করা হবে।
২. Authorization (অনুমোদন)
Authorization হল একটি প্রক্রিয়া যার মাধ্যমে কোনো ইউজার বা ক্লায়েন্ট নির্ধারণ করা হয় যে সে কোন রিসোর্স অ্যাক্সেস করতে পারবে কিনা। সাধারণত authentication সফল হলে, authorization এর মাধ্যমে ইউজারের রোল বা পারমিশন চেক করা হয়।
২.১. Role-Based Authorization
আপনি যদি বিভিন্ন রোল তৈরি করে, যেমন: Admin, User, এবং Guest, তবে authorization এর মাধ্যমে নির্ধারণ করতে পারেন যে কোন রোল কোন রিসোর্স অ্যাক্সেস করবে।
উদাহরণ:
const express = require('express');
const app = express();
const port = 3000;
const users = [
{ id: 1, username: 'john', role: 'admin' },
{ id: 2, username: 'jane', role: 'user' }
];
// Middleware যা ইউজারের রোল চেক করবে
const authorize = (role) => {
return (req, res, next) => {
const user = users.find(u => u.username === req.body.username);
if (user && user.role === role) {
next();
} else {
res.status(403).send('Permission denied');
}
};
};
// Admin রাউট, যা শুধু admin রোলের ইউজার অ্যাক্সেস করতে পারবে
app.get('/admin', authorize('admin'), (req, res) => {
res.send('Welcome, Admin');
});
// User রাউট
app.get('/user', (req, res) => {
res.send('Welcome, User');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে:
authorizeমেথড একটি middleware হিসেবে কাজ করে এবং ইউজারের রোল চেক করে।/adminরাউট শুধুমাত্র admin রোলের ইউজারদের জন্য উন্মুক্ত।
২.২. Permission-based Authorization
এছাড়াও, আপনি ইউজারের নির্দিষ্ট পারমিশন চেক করে authorization করতে পারেন, যেমন: read, write, delete।
const authorizePermission = (permission) => {
return (req, res, next) => {
const user = users.find(u => u.username === req.body.username);
if (user && user.permissions.includes(permission)) {
next();
} else {
res.status(403).send('Permission denied');
}
};
};
// "write" পারমিশন চেক
app.post('/create-post', authorizePermission('write'), (req, res) => {
res.send('Post created successfully');
});
এখানে:
authorizePermissionমেথড ইউজারের পারমিশন চেক করে।
সারাংশ
Authentication এবং Authorization হল ওয়েব অ্যাপ্লিকেশনের নিরাপত্তা ব্যবস্থার দুটি গুরুত্বপূর্ণ দিক। Authentication ইউজারের পরিচয় যাচাই করে, যেমন পাসওয়ার্ড বা টোকেনের মাধ্যমে। Authorization ইউজারের রোল বা পারমিশন যাচাই করে, যাতে নির্ধারণ করা যায় কোন রিসোর্স ইউজার অ্যাক্সেস করতে পারবে। ExpressJS-এ এই দুটি প্রক্রিয়া খুব সহজেই বাস্তবায়ন করা যায়, যেমন সেশন, JWT টোকেন, বা রোল-ভিত্তিক অ্যাক্সেস কন্ট্রোলের মাধ্যমে।
Authentication এবং Authorization হল ওয়েব অ্যাপ্লিকেশনের নিরাপত্তা ব্যবস্থার দুটি মৌলিক অংশ। ExpressJS-এ এই দুইটি গুরুত্বপূর্ণ কাজের মাধ্যমে ইউজারদের নিরাপদভাবে অ্যাপ্লিকেশন ব্যবহার নিশ্চিত করা যায়। Authentication নিশ্চিত করে যে ইউজারটি আসলেই কে, এবং Authorization নিশ্চিত করে যে ইউজারটি নির্দিষ্ট সম্পদে অ্যাক্সেস করতে পারবে কি না।
Authentication কী?
Authentication হল একটি প্রক্রিয়া, যার মাধ্যমে একজন ইউজার নিজেকে শনাক্ত করতে পারে। উদাহরণস্বরূপ, ইউজার যখন লগইন করে, তখন সে তার পরিচয় (যেমন, ব্যবহারকারীর নাম এবং পাসওয়ার্ড) প্রদান করে। এটি একটি প্রমাণীকরণের প্রক্রিয়া, যা নিশ্চিত করে যে ইউজারটি কে এবং তার অনুমতি রয়েছে কি না।
ExpressJS এ Authentication
ExpressJS-এ Authentication করতে আপনি সাধারণত JWT (JSON Web Token), sessions, বা OAuth ব্যবহার করতে পারেন।
১. JWT (JSON Web Token) দিয়ে Authentication
JWT হল একটি স্ট্যান্ডার্ড যা সার্ভার এবং ক্লায়েন্টের মধ্যে তথ্য নিরাপদভাবে আদান-প্রদান করতে সহায়তা করে। এটি ইউজার লগইন পরবর্তী সময়ে সার্ভারের পক্ষ থেকে একটি টোকেন তৈরি করে এবং ক্লায়েন্ট সেটি পরবর্তী রিকোয়েস্টে পাঠায়।
লগইন রিকোয়েস্ট এবং JWT টোকেন তৈরি:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
app.use(express.json());
const users = [
{ id: 1, username: 'user1', password: 'password123' }
];
// Login endpoint
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
// Create JWT token
const token = jwt.sign({ id: user.id, username: user.username }, 'your-secret-key', { expiresIn: '1h' });
return res.json({ token });
}
res.status(401).send('Authentication failed');
});
// Protected route
app.get('/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('Token required');
}
// Verify token
jwt.verify(token, 'your-secret-key', (err, decoded) => {
if (err) {
return res.status(403).send('Invalid token');
}
res.send('Protected content');
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে:
- /login রাউটে ইউজার লগইন করতে পারে এবং সঠিক ক্রেডেনশিয়াল থাকলে JWT টোকেন পাওয়া যাবে।
- /protected রাউটটি শুধুমাত্র JWT টোকেন সহ অ্যাক্সেসযোগ্য, যা Authentication নিশ্চিত করে।
২. Sessions দিয়ে Authentication
Sessions ইউজারের লগইন তথ্য সার্ভারে স্টোর করার মাধ্যমে Authentication প্রক্রিয়া সম্পন্ন করে। সাধারণত cookies-এ session ID পাঠানো হয়, যা পরবর্তী রিকোয়েস্টে ক্লায়েন্ট থেকে ফেরত আসে।
const session = require('express-session');
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
app.post('/login', (req, res) => {
const { username, password } = req.body;
// Dummy user check
if (username === 'user1' && password === 'password123') {
req.session.user = { username }; // Store user info in session
return res.send('Login successful');
}
res.status(401).send('Invalid credentials');
});
// Access protected route with session check
app.get('/protected', (req, res) => {
if (!req.session.user) {
return res.status(403).send('Unauthorized access');
}
res.send('Protected content');
});
এখানে:
- express-session middleware ব্যবহৃত হয়েছে, যা ইউজারের session কে ট্র্যাক করে।
- ইউজার লগইন করার পর
req.session.user-এ ইউজারের তথ্য স্টোর হয়, যা পরবর্তী রিকোয়েস্টে চেক করা হয়।
Authorization কী?
Authorization হল একটি প্রক্রিয়া, যার মাধ্যমে একটি ইউজারকে নির্দিষ্ট সম্পদ বা রিসোর্সে অ্যাক্সেস প্রদান করা হয়। Authentication এর মাধ্যমে ইউজারকে শনাক্ত করার পর, Authorization নিশ্চিত করে যে ইউজার নির্দিষ্ট রিসোর্সে অ্যাক্সেস করতে পারবে কি না।
ExpressJS এ Authorization
Authorization সাধারণত ইউজারের রোল বা পারমিশন চেক করার মাধ্যমে পরিচালিত হয়। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশনে দুইটি ইউজার রোল থাকতে পারে: Admin এবং User। Admin শুধুমাত্র অ্যাডমিন প্যানেলে অ্যাক্সেস পায়, এবং User সাধারণ পেজগুলো অ্যাক্সেস করতে পারে।
১. Role-based Authorization
const users = [
{ id: 1, username: 'admin', role: 'admin' },
{ id: 2, username: 'user', role: 'user' }
];
// Middleware to check role
const checkRole = (role) => {
return (req, res, next) => {
const user = users.find(u => u.username === req.session.user.username);
if (user && user.role === role) {
next(); // User has the right role, proceed to the next middleware
} else {
res.status(403).send('Forbidden');
}
};
};
// Admin route protected by role-based authorization
app.get('/admin', checkRole('admin'), (req, res) => {
res.send('Admin Dashboard');
});
// User route
app.get('/user', (req, res) => {
res.send('User Dashboard');
});
এখানে:
- checkRole() middleware ব্যবহার করে ইউজারের রোল চেক করা হয়েছে। শুধুমাত্র Admin রোলের ইউজাররা /admin রাউটে প্রবেশ করতে পারবে।
২. Permission-based Authorization
এটি তখন ব্যবহৃত হয় যখন ইউজারের কাছে নির্দিষ্ট পারমিশন থাকে, যা রোলের চেয়ে বেশি সূক্ষ্ম। উদাহরণস্বরূপ, একজন ইউজারের কাছে create, edit, বা delete পারমিশন থাকতে পারে।
const permissions = {
admin: ['create', 'edit', 'delete'],
user: ['view']
};
// Middleware to check permission
const checkPermission = (permission) => {
return (req, res, next) => {
const user = users.find(u => u.username === req.session.user.username);
if (user && permissions[user.role].includes(permission)) {
next();
} else {
res.status(403).send('Forbidden');
}
};
};
// Route with specific permission check
app.post('/create', checkPermission('create'), (req, res) => {
res.send('Resource created');
});
এখানে:
- checkPermission() middleware ইউজারের পারমিশন চেক করে, এবং যদি ইউজারের সেই পারমিশন থাকে, তবে রিকোয়েস্ট প্রসেস হয়।
সারাংশ
ExpressJS-এ Authentication এবং Authorization এর মাধ্যমে আপনি অ্যাপ্লিকেশনে নিরাপত্তা যোগ করতে পারেন। Authentication ইউজারের পরিচয় নিশ্চিত করে (যেমন, লগইন), এবং Authorization নিশ্চিত করে যে ইউজার নির্দিষ্ট সম্পদে অ্যাক্সেস পাবে কি না। ExpressJS-এ JWT, sessions, এবং role-based অথবা permission-based authorization ব্যবহার করে এই দুইটি কাজ সহজেই প্রক্রিয়া করা যায়।
Passport.js হল একটি অত্যন্ত জনপ্রিয় authentication middleware যা ExpressJS অ্যাপ্লিকেশনে সহজে ব্যবহার করা যায়। এটি বিভিন্ন ধরনের অথেনটিকেশন স্ট্র্যাটেজি (যেমন: লোকাল, ফেইসবুক, গুগল, টুইটার, ইত্যাদি) সমর্থন করে এবং খুবই মডুলার ও কনফিগারেবল। এখানে আমরা Passport.js ব্যবহার করে একটি সিম্পল অথেনটিকেশন সিস্টেম সেটআপ করার পদ্ধতি দেখব, যেখানে ইউজারনেম এবং পাসওয়ার্ড ব্যবহার করে লগইন করা যাবে।
১. Passport.js কী?
Passport.js একটি ছোট, নিরপেক্ষ, এবং সহজ অথেনটিকেশন মিডলওয়্যার যা একাধিক অথেনটিকেশন স্ট্র্যাটেজি দিয়ে কাজ করে। এটি ইউজারের পরিচয় যাচাই করতে সাহায্য করে, এবং একবার যাচাই হয়ে গেলে সেশন ম্যানেজমেন্টের জন্য কাজ করে।
২. Passport.js ইনস্টলেশন
প্রথমে, আপনার অ্যাপ্লিকেশনে Passport.js এবং এর কিছু প্রয়োজনীয় প্যাকেজ ইনস্টল করতে হবে।
npm install passport passport-local express-session
passport: Passport.js এর মূল লাইব্রেরি।passport-local: লোকাল অথেনটিকেশন স্ট্র্যাটেজি (যেমন: ইউজারনেম এবং পাসওয়ার্ড) ব্যবহারের জন্য।express-session: সেশন ব্যবস্থাপনা করতে ব্যবহৃত হবে।
৩. ExpressJS অ্যাপ্লিকেশন তৈরি করা
নতুন একটি ExpressJS অ্যাপ্লিকেশন তৈরি করুন এবং Passport.js ব্যবহার করার জন্য প্রয়োজনীয় কনফিগারেশন সেট করুন।
app.js ফাইল
const express = require('express');
const passport = require('passport');
const session = require('express-session');
const LocalStrategy = require('passport-local').Strategy;
const app = express();
const port = 3000;
// Dummy ইউজার (ডেটাবেসের পরিবর্তে এটি মেমোরিতে থাকবে)
const users = [
{ id: 1, username: 'testuser', password: 'password123' }
];
// Express-session সেটআপ
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false
}));
// Passport.js সেটআপ
passport.use(new LocalStrategy((username, password, done) => {
// Dummy ইউজারের ভ্যালিডেশন
const user = users.find(u => u.username === username);
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (user.password !== password) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
}));
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
const user = users.find(u => u.id === id);
done(null, user);
});
// Middleware
app.use(passport.initialize());
app.use(passport.session());
// ExpressJS JSON middleware (POST ডেটা পার্স করতে)
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// লগিন পেজ রাউট
app.get('/login', (req, res) => {
res.send('<form action="/login" method="post"> <input type="text" name="username" placeholder="Username"> <input type="password" name="password" placeholder="Password"> <button type="submit">Login</button> </form>');
});
// POST রিকোয়েস্টে লগিন রাউট
app.post('/login', passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/login',
failureFlash: false
}));
// ড্যাশবোর্ড (অথেনটিকেটেড ইউজারের জন্য)
app.get('/dashboard', (req, res) => {
if (!req.isAuthenticated()) {
return res.redirect('/login');
}
res.send(`Welcome ${req.user.username} to your dashboard!`);
});
// লগ আউট রাউট
app.get('/logout', (req, res) => {
req.logout((err) => {
if (err) return next(err);
res.redirect('/login');
});
});
// সার্ভার শুরু
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
৪. কোড ব্যাখ্যা
express-session: সেশন ব্যবস্থাপনা করে, যাতে লগইন করার পর ইউজারকে সেশন ধরে রাখা যায়।passport-local: লোকাল অথেনটিকেশন স্ট্র্যাটেজি ব্যবহার করা হয়েছে, যা ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে লগইন প্রক্রিয়া পরিচালনা করে।passport.serializeUser()এবংpassport.deserializeUser(): লগইন হওয়ার পরে ইউজারের তথ্য সেশন-এর মধ্যে সংরক্ষিত হয়, এবং সেশন থেকে আবার ইউজারের তথ্য পাওয়া যায়।passport.authenticate(): এটি ব্যবহার করা হয় POST রিকোয়েস্টে ইউজারের তথ্য যাচাই করতে এবং সফল হলে রিডিরেক্ট করতে।/dashboard: এই পৃষ্ঠাটি শুধুমাত্র অথেনটিকেটেড (লগইন করা) ইউজারদের জন্য অ্যাক্সেসযোগ্য।
৫. লগইন প্রক্রিয়া
/loginরাউটের মাধ্যমে ইউজার লগইন পেজে যেতে পারে, যেখানে ইউজারনেম এবং পাসওয়ার্ড ইনপুট করতে হবে।- POST রিকোয়েস্টের মাধ্যমে ইউজারনেম এবং পাসওয়ার্ড পাঠানো হলে, Passport.js তা যাচাই করবে।
- সফল হলে, ইউজারকে /dashboard পৃষ্ঠায় রিডিরেক্ট করা হবে, যেখানে ইউজারকে স্বাগত জানানো হবে।
- লগইন ব্যর্থ হলে, ইউজারকে আবার /login পৃষ্ঠায় রিডিরেক্ট করা হবে।
৬. সেশন ব্যবস্থাপনা
একবার ইউজার লগইন হলে, সেশন ব্যবহার করে ইউজারের পরিচয় সুরক্ষিত রাখা হয়। সেশন-এর মাধ্যমে ইউজারের তথ্য (যেমন ইউজারনেম) অন্যান্য রাউটেও অ্যাক্সেস করা সম্ভব।
ড্যাশবোর্ডে ইউজারের তথ্য প্রদর্শন:
res.send(`Welcome ${req.user.username} to your dashboard!`);
এখানে, req.user সেশনে থাকা ইউজারের তথ্য ধারণ করে।
৭. লগ আউট প্রক্রিয়া
লগ আউটের জন্য একটি রাউট (/logout) তৈরি করা হয়েছে, যা ইউজারকে লগ আউট করার পর লগইন পৃষ্ঠায় রিডিরেক্ট করবে:
app.get('/logout', (req, res) => {
req.logout((err) => {
if (err) return next(err);
res.redirect('/login');
});
});
এই রাউটটি req.logout() ফাংশন ব্যবহার করে ইউজারের সেশন মুছে ফেলে এবং ইউজারকে লগইন পৃষ্ঠায় রিডিরেক্ট করে।
৮. সারাংশ
Passport.js ExpressJS অ্যাপ্লিকেশনে সহজেই অথেনটিকেশন প্রক্রিয়া যোগ করার একটি শক্তিশালী ও মডুলার উপায়। আপনি passport-local স্ট্র্যাটেজি ব্যবহার করে ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে লগইন ব্যবস্থা তৈরি করতে পারেন। Passport.js ব্যবহার করলে, আপনি বিভিন্ন ধরনের অথেনটিকেশন স্ট্র্যাটেজি সহজেই অ্যাড করতে পারবেন এবং সেশন ব্যবস্থাপনা পরিচালনা করতে পারবেন।
এই উদাহরণে আমরা একটি সিম্পল ইউজারনেম/পাসওয়ার্ড ভিত্তিক অথেনটিকেশন সিস্টেম তৈরি করেছি। বাস্তব জীবনের প্রোজেক্টে এটি আরও উন্নত করতে আরও সুরক্ষা (যেমন, পাসওয়ার্ড হ্যাশিং, CORS পলিসি, এবং ফ্ল্যাশ মেসেজ) যোগ করা যেতে পারে।
JSON Web Token (JWT) হল একটি জনপ্রিয় স্ট্যান্ডার্ড যা ওয়েব অ্যাপ্লিকেশন এবং API-তে Token-based Authentication প্রক্রিয়া সহজ করতে ব্যবহৃত হয়। JWT ব্যবহারকারীদের পরিচয় যাচাই করতে এবং সুরক্ষিত তথ্য বিনিময় করতে সাহায্য করে। এটি সার্ভার সাইডের সেশন ব্যবস্থাপনা এড়িয়ে চলার জন্য উপযোগী, কারণ এর মাধ্যমে সার্ভারকে ব্যবহারকারীর তথ্য সংরক্ষণ করতে হয় না। JWT সাধারণত একটি signed token হিসেবে কাজ করে, যা ব্যবহারকারীকে একবার লগইন করার পর তৈরি হয় এবং পরবর্তী রিকোয়েস্টগুলোর সাথে পাঠানো হয়।
JWT কী?
JSON Web Token (JWT) হল একটি ওপেন স্ট্যান্ডার্ড (RFC 7519) যা JSON অবজেক্ট হিসেবে ডেটা পরিবহন করে। এটি নিরাপদভাবে দুটি পার্টির মধ্যে তথ্য ট্রান্সফার করতে ব্যবহৃত হয়। JWT সাধারণত তিনটি অংশে বিভক্ত থাকে:
- Header
- Payload
- Signature
এটি সার্ভারের সাথে রিকোয়েস্টে পাঠানো হয় এবং সার্ভার এটি ডিকোড করে যাচাই করে যে রিকোয়েস্টটি বৈধ কিনা।
JWT এর কাঠামো
Header.Payload.Signature
- Header: এটি সাধারণত এলগরিদমের তথ্য এবং টোকেনের প্রকার (যেমন
JWT) ধারণ করে। - Payload: এটি সেই ডেটা ধারণ করে যেটি আপনি পাঠাতে চান। সাধারণত ব্যবহারকারীর আইডি, রোল, অথবা অন্যান্য তথ্য এখানে থাকে।
- Signature: এটি হেডার এবং পে-লোডের উপর ভিত্তি করে একটি সিক্রেট কী দিয়ে সিগনেচার তৈরি করা হয়, যা টোকেনটির নিরাপত্তা নিশ্চিত করে।
JWT Authentication এর প্রক্রিয়া
JWT Authentication এর মূল ধারণা হলো, ব্যবহারকারী লগইন করার পর সার্ভার একটি টোকেন তৈরি করে এবং সেটি ক্লায়েন্টকে পাঠিয়ে দেয়। এরপর ক্লায়েন্ট টোকেনটি পরবর্তী রিকোয়েস্টের হেডারে পাঠায়। সার্ভার এই টোকেন যাচাই করে এবং শুধুমাত্র সঠিক টোকেনের মাধ্যমে প্রমাণিত রিকোয়েস্টগুলো গ্রহণ করে।
JWT Authentication ExpressJS-এ কিভাবে কাজ করে?
ExpressJS-এ JWT Authentication সেটআপ করতে কিছু প্যাকেজ দরকার হবে:
jsonwebtoken: JWT তৈরি এবং যাচাই করার জন্য।express: Express অ্যাপ্লিকেশন তৈরি করতে।dotenv: পরিবেশ ভেরিয়েবল ব্যবহার করার জন্য (যেমন, সিক্রেট কী সংরক্ষণের জন্য)।
JWT Authentication ব্যবহার করার জন্য প্রাথমিক পদক্ষেপ:
১. প্রয়োজনীয় প্যাকেজ ইনস্টল করা
npm install express jsonwebtoken dotenv
২. Express অ্যাপ্লিকেশন সেটআপ করা
const express = require('express');
const jwt = require('jsonwebtoken');
const dotenv = require('dotenv');
// পরিবেশ ভেরিয়েবল লোড করা
dotenv.config();
const app = express();
// JSON পার্সার middleware
app.use(express.json());
// সিক্রেট কী পরিবেশ থেকে নেওয়া হচ্ছে
const SECRET_KEY = process.env.SECRET_KEY || 'your_secret_key';
৩. ব্যবহারকারী লগইন এবং JWT টোকেন তৈরি করা
ব্যবহারকারী সঠিক লগইন তথ্য দিলে, আমরা একটি JWT টোকেন তৈরি করি যা পরবর্তী রিকোয়েস্টে ব্যবহার করা যাবে।
// লগইন রুট তৈরি করা
app.post('/login', (req, res) => {
const { username, password } = req.body;
// সাধারণত, এখানে ব্যবহারকারীর ডেটাবেস চেক করা হবে।
// এখানে শুধু উদাহরণ স্বরূপ স্ট্যাটিক ইউজার দেওয়া হলো।
const user = { id: 1, username: 'john_doe' };
// যদি ইউজার সঠিক হয়, তাহলে JWT টোকেন তৈরি করা হবে
if (username === 'john_doe' && password === 'password123') {
const token = jwt.sign({ userId: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Unauthorized');
}
});
এখানে, jwt.sign() ফাংশন ব্যবহার করে আমরা একটি JWT টোকেন তৈরি করেছি। SECRET_KEY আমাদের সিক্রেট কী, এবং টোকেনটি 1 ঘণ্টার জন্য বৈধ থাকবে।
৪. JWT দিয়ে রিকোয়েস্ট যাচাই করা
প্রতিটি সুরক্ষিত রিকোয়েস্টে, ক্লায়েন্ট টোকেন পাঠায় এবং সার্ভার এই টোকেন যাচাই করে। এটি করার জন্য আমরা একটি middleware তৈরি করব যা JWT যাচাই করবে।
// JWT যাচাই করা Middleware
function verifyToken(req, res, next) {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) {
return res.status(403).send('Access denied. No token provided.');
}
try {
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded; // ডিকোড করা তথ্য রিকোয়েস্ট অবজেক্টে সংরক্ষণ করা
next(); // পরবর্তী রাউটে যেতে বলা
} catch (error) {
res.status(400).send('Invalid token.');
}
}
// সুরক্ষিত রাউট
app.get('/protected', verifyToken, (req, res) => {
res.send(`Hello, ${req.user.username}! This is a protected route.`);
});
এখানে, verifyToken Middleware ব্যবহার করে আমরা টোকেন যাচাই করছি। যদি টোকেন সঠিক থাকে, তবে next() ফাংশন কল হয় এবং পরবর্তী রাউট হ্যান্ডলার চালু হয়।
৫. পরিবেশ ভেরিয়েবল (Environment Variables) সেট করা
আমরা dotenv প্যাকেজ ব্যবহার করে সিক্রেট কী এবং অন্যান্য গুরুত্বপূর্ণ কনফিগারেশন ভেরিয়েবল পরিবেশে রাখব। একটি .env ফাইল তৈরি করুন:
SECRET_KEY=your_jwt_secret_key
এবং তারপর dotenv.config() ব্যবহার করে সেই ভেরিয়েবলটি অ্যাপ্লিকেশন সেটআপে লোড করুন।
৬. একটি পূর্ণ ExpressJS অ্যাপ্লিকেশন উদাহরণ
const express = require('express');
const jwt = require('jsonwebtoken');
const dotenv = require('dotenv');
dotenv.config();
const app = express();
app.use(express.json());
const SECRET_KEY = process.env.SECRET_KEY || 'your_secret_key';
// লগইন রুট
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = { id: 1, username: 'john_doe' };
if (username === 'john_doe' && password === 'password123') {
const token = jwt.sign({ userId: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Unauthorized');
}
});
// JWT যাচাই করার Middleware
function verifyToken(req, res, next) {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) {
return res.status(403).send('Access denied. No token provided.');
}
try {
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded;
next();
} catch (error) {
res.status(400).send('Invalid token.');
}
}
// সুরক্ষিত রাউট
app.get('/protected', verifyToken, (req, res) => {
res.send(`Hello, ${req.user.username}! This is a protected route.`);
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
এটি একটি পূর্ণ Express অ্যাপ্লিকেশন যেখানে JWT Authentication ব্যবহার করা হয়েছে। প্রথমে ইউজার লগইন করলে একটি টোকেন প্রদান করা হয়, এবং পরবর্তীতে সুরক্ষিত রাউট অ্যাক্সেস করতে সেই টোকেনটি যাচাই করা হয়।
সারাংশ
- JWT (JSON Web Token) হল একটি স্ট্যান্ডার্ড যা নিরাপদভাবে তথ্য পরিবহন করে এবং Token-based Authentication প্রদান করে।
- ExpressJS-এ JWT Authentication ব্যবহারের মাধ্যমে, আপনি একটি stateless authentication সিস্টেম তৈরি করতে পারেন, যেখানে ব্যবহারকারীর তথ্য সার্ভারে সংরক্ষণ না করেও তাদের প্রমাণীকরণ করা হয়।
jsonwebtokenপ্যাকেজ ব্যবহার করে JWT টোকেন তৈরি এবং যাচাই করা হয়, এবংAuthorizationহেডারে টোকেন পাঠিয়ে সুরক্ষিত রাউট অ্যাক্সেস করা হয়।
Role-based Access Control (RBAC) এবং Permissions Management হল নিরাপত্তা ব্যবস্থাপনা কৌশল যা সিস্টেমে বিভিন্ন রকমের ইউজার এবং তাদের অনুমতি (permissions) নির্ধারণ করতে ব্যবহৃত হয়। এই কৌশলটি সাধারণত অ্যাপ্লিকেশনের নিরাপত্তা এবং ইউজার অ্যাক্সেস কন্ট্রোলকে সংগঠিত ও সহজ করে তোলে।
ExpressJS-এ RBAC এবং permissions ব্যবস্থাপনা প্রতিষ্ঠা করা অত্যন্ত গুরুত্বপূর্ণ যখন আপনাকে অ্যাপ্লিকেশনে বিভিন্ন ধরনের ইউজারকে বিভিন্ন স্তরের অ্যাক্সেস প্রদান করতে হয়। উদাহরণস্বরূপ, অ্যাডমিন, মডারেটর, এবং সাধারণ ইউজারের জন্য বিভিন্ন রকমের অনুমতি নির্ধারণ করা।
RBAC কি?
Role-based Access Control (RBAC) একটি নিরাপত্তা কৌশল যেখানে ইউজারদের বিভিন্ন roles (ভূমিকা) অনুযায়ী অ্যাক্সেস অনুমতি (permissions) প্রদান করা হয়। RBAC-এ মূলত দুটি উপাদান থাকে:
- Roles: বিভিন্ন ধরনের ভূমিকা (যেমন:
Admin,User,Moderator) যা ইউজারের অ্যাক্সেস স্তর নির্ধারণ করে। - Permissions: নির্দিষ্ট রিসোর্স বা অ্যাকশনগুলিতে অ্যাক্সেস প্রদানকারী অনুমতি। প্রতিটি ভূমিকার জন্য আলাদা আলাদা অনুমতি থাকতে পারে।
RBAC ব্যবহারের মাধ্যমে একটি সিস্টেমে ইউজারদের পৃথক পৃথক রোল অনুযায়ী বিভিন্ন অ্যাক্সেস প্রদান করা হয়। এটি একটি নিরাপত্তা স্তর তৈরির পাশাপাশি অ্যাপ্লিকেশনের মেইনটেনেন্স সহজ করে তোলে।
ExpressJS-এ RBAC এবং Permissions পরিচালনা করা
ExpressJS-এ RBAC এবং permissions পরিচালনা করতে আপনাকে সাধারণত middleware তৈরি করতে হবে, যা ইউজারের রোল যাচাই করবে এবং নির্দিষ্ট রাউটে অ্যাক্সেস নিয়ন্ত্রণ করবে।
১. Role-based Access Control (RBAC) উদাহরণ
১.১. RBAC ইমপ্লিমেন্টেশন
ধরা যাক, আমাদের দুটি রোল রয়েছে:
- Admin: পূর্ণ অ্যাক্সেস রয়েছে।
- User: শুধুমাত্র নির্দিষ্ট রিসোর্স অ্যাক্সেস করতে পারবে।
প্রথমে, আমরা ইউজারের রোল নির্ধারণ করব এবং পরে তা যাচাই করব যে, ওই ইউজারের নির্দিষ্ট রাউটে অ্যাক্সেস রয়েছে কি না।
const express = require('express');
const app = express();
const port = 3000;
// Dummy ইউজার ডাটা
const users = [
{ id: 1, username: 'admin', role: 'Admin' },
{ id: 2, username: 'user1', role: 'User' }
];
// Middleware: রোল যাচাই করা
function checkRole(requiredRole) {
return (req, res, next) => {
const user = users.find(u => u.username === req.body.username);
if (user && user.role === requiredRole) {
return next(); // রোল মিললে পরবর্তী middleware বা রাউটে যাও
} else {
return res.status(403).send('Access Denied');
}
};
}
// Admin রাউট
app.get('/admin', checkRole('Admin'), (req, res) => {
res.send('Welcome Admin!');
});
// User রাউট
app.get('/user', checkRole('User'), (req, res) => {
res.send('Welcome User!');
});
// সাধারণ রাউট
app.get('/', (req, res) => {
res.send('Welcome to the Home page');
});
app.listen(port, () => {
console.log(`Server is running at http://localhost:${port}`);
});
কোড ব্যাখ্যা:
checkRole(requiredRole): একটি কাস্টম middleware ফাংশন যা ইউজারের রোল যাচাই করে। যদি রোল মেলে, তবে এটিnext()ফাংশন কল করে পরবর্তী middleware বা রাউট হ্যান্ডলারকে কল করে। অন্যথায়, একটি403 Access Deniedরেসপন্স পাঠানো হয়।/adminএবং/userরাউটে বিভিন্ন রোলের জন্য অ্যাক্সেস কন্ট্রোল করা হচ্ছে।
২. Permissions Management
Permissions হল ইউজারের রোলের অধীনে কী কী কাজ করতে পারবে তা নির্ধারণ করে। প্রতিটি রোলের জন্য নির্দিষ্ট অ্যাকশন বা রিসোর্সের উপর permissions থাকতে পারে।
২.১. Permissions উদাহরণ
ধরা যাক, অ্যাডমিনের জন্য create, read, update, delete (CRUD) permissions থাকতে পারে, কিন্তু ইউজারের জন্য শুধুমাত্র read permission থাকতে পারে।
ব্যবহার:
const permissions = {
Admin: ['create', 'read', 'update', 'delete'],
User: ['read']
};
// Middleware: Permissions যাচাই
function checkPermission(permission) {
return (req, res, next) => {
const user = users.find(u => u.username === req.body.username);
if (user && permissions[user.role].includes(permission)) {
return next(); // Permission থাকলে পরবর্তী middleware বা রাউট
} else {
return res.status(403).send('Permission Denied');
}
};
}
// Admin create রাউট
app.post('/create', checkPermission('create'), (req, res) => {
res.send('Create operation performed');
});
// User read রাউট
app.get('/read', checkPermission('read'), (req, res) => {
res.send('Read operation performed');
});
app.listen(port, () => {
console.log(`Server is running at http://localhost:${port}`);
});
কোড ব্যাখ্যা:
checkPermission(permission): এই middleware ইউজারের রোল অনুযায়ী তার permissions চেক করে। যদি ইউজারের পছন্দসই permission থাকে, তবে পরবর্তী ফাংশন কল হয়, অন্যথায় 403 রেসপন্স দেওয়া হয়।
৩. Dynamic Role-based Access Control
আরও উন্নত RBAC সিস্টেমে, ইউজারের রোল এবং permissions ডাটাবেজে সংরক্ষণ করা হয় এবং সেগুলো ডাইনামিকভাবে কনফিগার করা হয়। এতে ইউজারের অ্যাক্সেস কন্ট্রোলের মান আরও ফ্লেক্সিবল এবং পরিবর্তনযোগ্য হয়।
উদাহরণ:
// Dummy DB সিমুলেশন
let roles = {
Admin: ['create', 'read', 'update', 'delete'],
User: ['read']
};
let users = [
{ username: 'admin', role: 'Admin' },
{ username: 'user1', role: 'User' }
];
// রোল পরিবর্তন ফাংশন
function updateRole(username, newRole) {
const user = users.find(u => u.username === username);
if (user) {
user.role = newRole;
}
}
// Permissions যাচাই
function checkPermissions(permission) {
return (req, res, next) => {
const user = users.find(u => u.username === req.body.username);
if (user && roles[user.role].includes(permission)) {
return next();
} else {
return res.status(403).send('Permission Denied');
}
};
}
// রাউট সেটআপ
app.post('/create', checkPermissions('create'), (req, res) => {
res.send('Create operation performed');
});
app.get('/read', checkPermissions('read'), (req, res) => {
res.send('Read operation performed');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে, ইউজারের রোল পরিবর্তন করা যেতে পারে এবং সেই অনুযায়ী permissions অ্যাক্সেস নিয়ন্ত্রণ করা হয়।
সারাংশ
Role-based Access Control (RBAC) এবং Permissions Management ExpressJS-এ একটি শক্তিশালী নিরাপত্তা কৌশল। RBAC ইউজারের রোলের ভিত্তিতে অ্যাক্সেস কন্ট্রোল পরিচালনা করতে সাহায্য করে, এবং Permissions ইউজারের নির্দিষ্ট অ্যাক্সেস অনুমতি নির্ধারণ করে। ExpressJS-এ, আপনি কাস্টম middleware ব্যবহার করে রোল এবং permissions যাচাই করতে পারেন এবং অ্যাপ্লিকেশনটির নিরাপত্তা এবং ইউজার অ্যাক্সেস কন্ট্রোল আরও উন্নত করতে পারেন।
Read more