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হেডারে টোকেন পাঠিয়ে সুরক্ষিত রাউট অ্যাক্সেস করা হয়।
Read more