KoaJS একটি শক্তিশালী এবং লঘু Node.js ফ্রেমওয়ার্ক, যা ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য অত্যন্ত উপযোগী। KoaJS-এ Authentication (অথেনটিকেশন) এবং Authorization (অথরাইজেশন) ব্যবস্থাপনা করতে কিছু জনপ্রিয় টুলস এবং মিডলওয়্যার ব্যবহৃত হয়। এই টিউটোরিয়ালে, আমরা কিভাবে KoaJS অ্যাপে Authentication এবং Authorization ইমপ্লিমেন্ট করা যায় তা আলোচনা করব।
১. Authentication (অথেনটিকেশন)
Authentication (অথেনটিকেশন) হলো একটি প্রক্রিয়া যেখানে আপনি ইউজারের পরিচয় যাচাই করেন, অর্থাৎ, ইউজারটি কে তা নির্ধারণ করা হয়। সাধারণভাবে, JWT (JSON Web Tokens), Session-based Authentication, এবং OAuth ইত্যাদি পদ্ধতি ব্যবহার করা হয়।
১.১ JWT (JSON Web Token) Authentication
JWT (JSON Web Token) হলো একটি জনপ্রিয় অথেনটিকেশন পদ্ধতি যেখানে ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি টোকেন শেয়ার করা হয়। এটি Stateless অথেনটিকেশন পদ্ধতি হিসেবে ব্যবহৃত হয়, যেখানে সার্ভার কোনও স্টেট বা সেশন রেকর্ড রাখে না।
১.১.১ jsonwebtoken প্যাকেজ ইনস্টল করা
JWT ব্যবহার করার জন্য প্রথমে jsonwebtoken প্যাকেজটি ইনস্টল করতে হবে:
npm install jsonwebtoken
১.১.২ JWT অথেনটিকেশন কনফিগারেশন
const Koa = require('koa');
const Router = require('koa-router');
const jwt = require('jsonwebtoken');
const app = new Koa();
const router = new Router();
// Secret Key
const secretKey = 'your_secret_key';
// Middleware for checking JWT token
const authenticate = async (ctx, next) => {
const token = ctx.headers.authorization?.split(' ')[1]; // Bearer <token>
if (!token) {
ctx.status = 401;
ctx.body = { message: 'No token provided' };
return;
}
try {
const decoded = jwt.verify(token, secretKey);
ctx.state.user = decoded;
await next();
} catch (err) {
ctx.status = 403;
ctx.body = { message: 'Invalid token' };
}
};
// Login route to generate JWT token
router.post('/login', async (ctx) => {
const { username, password } = ctx.request.body;
// Authenticate user (simplified example)
if (username === 'admin' && password === 'password') {
const token = jwt.sign({ username }, secretKey, { expiresIn: '1h' });
ctx.body = { message: 'Authentication successful', token };
} else {
ctx.status = 401;
ctx.body = { message: 'Invalid credentials' };
}
});
// Protected route
router.get('/protected', authenticate, async (ctx) => {
ctx.body = { message: 'Welcome to the protected route', user: ctx.state.user };
});
app
.use(require('koa-bodyparser')()) // To parse JSON body
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
১.১.৩ ব্যাখ্যা:
/loginরুটে, ব্যবহারকারীর ইউজারনেম এবং পাসওয়ার্ড যাচাই করা হয় এবং সঠিক হলে JWT টোকেন তৈরি করা হয়।/protectedরুটে,authenticateমিডলওয়্যার ব্যবহার করা হয়েছে, যা ক্লায়েন্ট থেকে টোকেন চেক করে, এবং যদি টোকেন বৈধ হয়, তাহলে ইউজারের তথ্য রিকোয়েস্টেctx.state.userহিসেবে পাস করা হয়।
১.২ Session-based Authentication
Session-based Authentication পদ্ধতিতে ইউজারের লগইন তথ্য সার্ভারে সেশন হিসেবে সংরক্ষিত থাকে। সাধারণত কুকি ব্যবহার করে সেশন আইডি ক্লায়েন্টে সংরক্ষিত করা হয়। KoaJS-এ koa-session মিডলওয়্যার ব্যবহার করা হয় সেশন ম্যানেজমেন্টের জন্য।
১.২.১ koa-session ইনস্টল করা
npm install koa-session
১.২.২ Session-based Authentication কনফিগারেশন
const Koa = require('koa');
const Router = require('koa-router');
const session = require('koa-session');
const app = new Koa();
const router = new Router();
// Koa Session কনফিগারেশন
app.keys = ['your_secret_key']; // Secret key for cookie signing
app.use(session(app));
router.post('/login', async (ctx) => {
const { username, password } = ctx.request.body;
if (username === 'admin' && password === 'password') {
ctx.session.user = { username }; // Save user info in session
ctx.body = { message: 'Authentication successful' };
} else {
ctx.status = 401;
ctx.body = { message: 'Invalid credentials' };
}
});
// Protected route
router.get('/protected', async (ctx) => {
if (!ctx.session.user) {
ctx.status = 401;
ctx.body = { message: 'Unauthorized' };
} else {
ctx.body = { message: 'Welcome to the protected route', user: ctx.session.user };
}
});
app
.use(require('koa-bodyparser')())
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
১.২.৩ ব্যাখ্যা:
koa-sessionমিডলওয়্যার সেশন পরিচালনা করে এবং ইউজারকে লগইন করার পর সেশন তৈরি হয়।/protectedরাউটে, সেশন যাচাই করা হয়। যদি সেশন না থাকে, তাহলে ইউজারকে401 Unauthorizedরেসপন্স দেওয়া হয়।
২. Authorization (অথরাইজেশন)
Authorization হলো প্রক্রিয়া যেখানে আপনি যাচাই করেন যে, একটি ইউজার একটি নির্দিষ্ট রিসোর্স বা রাউটে অ্যাক্সেস পাবে কিনা। Authorization সাধারণত Role-based Access Control (RBAC) বা Permission-based Access Control (PBAC) ব্যবহার করে করা হয়।
২.১ Role-based Authorization
Role-based Authorization এ, ইউজারের একটি নির্দিষ্ট রোল (যেমন Admin, User, Editor) থাকে এবং বিভিন্ন রোলের জন্য আলাদা-আলাদা অ্যাক্সেস নির্ধারিত থাকে।
২.১.১ Role-based Authorization কনফিগারেশন
const Koa = require('koa');
const Router = require('koa-router');
const jwt = require('jsonwebtoken');
const app = new Koa();
const router = new Router();
const secretKey = 'your_secret_key';
// Middleware to check role
const authorizeRole = (role) => {
return async (ctx, next) => {
const token = ctx.headers.authorization?.split(' ')[1];
if (!token) {
ctx.status = 401;
ctx.body = { message: 'No token provided' };
return;
}
try {
const decoded = jwt.verify(token, secretKey);
if (decoded.role !== role) {
ctx.status = 403;
ctx.body = { message: 'Forbidden' };
return;
}
ctx.state.user = decoded;
await next();
} catch (err) {
ctx.status = 403;
ctx.body = { message: 'Invalid token' };
}
};
};
// Login route to generate JWT with role
router.post('/login', async (ctx) => {
const { username, password } = ctx.request.body;
if (username === 'admin' && password === 'password') {
const token = jwt.sign({ username, role: 'admin' }, secretKey, { expiresIn: '1h' });
ctx.body = { message: 'Authentication successful', token };
} else if (username === 'user' && password === 'password') {
const token = jwt.sign({ username, role: 'user' }, secretKey, { expiresIn: '1h' });
ctx.body = { message: 'Authentication successful', token };
} else {
ctx.status = 401;
ctx.body = { message: 'Invalid credentials' };
}
});
// Protected route with role-based authorization
router.get('/admin', authorizeRole('admin'), async (ctx) => {
ctx.body = { message: 'Welcome to the admin area', user: ctx.state.user };
});
router.get('/user', authorizeRole('user'), async (ctx) => {
ctx.body = { message: 'Welcome to the user area', user: ctx.state.user };
});
app
.use(require('koa-bodyparser')())
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
২.১.২ ব্যাখ্যা:
authorizeRoleমিডলওয়্যার রোল চেক করে, এবং যদি ইউজারের রোল সঠিক না হয়, তাহলে403 Forbiddenরেসপন্স পাঠানো হয়।jwtটোকেনের মধ্যেroleপ্যারামিটার অন্তর্ভুক্ত করা হয়েছে এবং তা যাচাই করা হয়।
সারাংশ
KoaJS-এ Authentication এবং Authorization ব্যবস্থাপনা করার জন্য বিভিন্ন পদ্ধতি রয়েছে। আপনি JWT বা Session-based Authentication ব্যবহার করে ইউজারের অথেনটিকেশন করতে পারেন এবং Role-based Authorization দিয়ে বিভিন্ন রোল অনুযায়ী অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। koa-jwt, koa-session এবং কাস্টম মিডলওয়্যার ব্যবহার করে আপনি KoaJS অ্যাপে শক্তিশালী অথেনটিকেশন ও অথরাইজেশন সিস্টেম তৈরি করতে পারবেন।
KoaJS-এ JWT (JSON Web Tokens) ব্যবহার করে অথেন্টিকেশন একটি শক্তিশালী এবং সিকিউর ওয়েব অ্যাপ্লিকেশন তৈরি করার একটি পদ্ধতি। JWT-কে আধুনিক অথেন্টিকেশন সিস্টেমে খুবই জনপ্রিয় ভাবে ব্যবহার করা হয় কারণ এটি নিরাপদ এবং স্কেলযোগ্য। JWT-এ সাধারণত একটি টোকেন তৈরি করা হয়, যা ইউজারের অথেন্টিকেশন নিশ্চিত করার জন্য সার্ভার এবং ক্লায়েন্টের মধ্যে আদান-প্রদান করা হয়। এই টোকেনটি ইউজারের পরিচয় নিশ্চিত করার জন্য বিভিন্ন এপিআই রিকোয়েস্টে পাঠানো হয়।
এখানে আমরা কিভাবে KoaJS-এ JWT ব্যবহার করে অথেন্টিকেশন তৈরি করা যায় তা দেখব।
JWT কি এবং কিভাবে কাজ করে?
JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড (RFC 7519) যা নিরাপদ উপায়ে তথ্য বিনিময়ের জন্য ব্যবহৃত হয়। এটি মূলত তিনটি অংশে বিভক্ত:
- Header: টোকেনের মেটাডেটা, যেমন সিগনেচার অ্যালগরিদম।
- Payload: ইউজারের তথ্য বা কাস্টম ক্লেইমস (claims), যেমন ইউজারের আইডি।
- Signature: টোকেনের নিরাপত্তা নিশ্চিত করে, যাতে এটি মডিফাই না হয়।
KoaJS-এ JWT Authentication সেটআপ করা
KoaJS-এ JWT অথেন্টিকেশন সেটআপ করার জন্য কিছু প্যাকেজ ইনস্টল করতে হবে। আমরা jsonwebtoken প্যাকেজটি ব্যবহার করব টোকেন তৈরি এবং ভেরিফাই করার জন্য, এবং koa-jwt প্যাকেজটি ব্যবহার করব JWT অথেন্টিকেশন মিডলওয়্যার হিসেবে।
১. JWT প্যাকেজ ইনস্টল করা
প্রথমে jsonwebtoken এবং koa-jwt প্যাকেজ ইনস্টল করুন:
npm install jsonwebtoken koa-jwt
jsonwebtoken: এটি JWT টোকেন তৈরি এবং ভেরিফাই করতে ব্যবহৃত হবে।koa-jwt: এটি KoaJS-এর জন্য একটি মিডলওয়্যার, যা JWT টোকেন ভেরিফাই করতে ব্যবহৃত হয়।
২. KoaJS অ্যাপে JWT Authentication সেটআপ করা
এখন, KoaJS অ্যাপ্লিকেশন তৈরি করে JWT অথেন্টিকেশন যুক্ত করা যাক।
const Koa = require('koa');
const Router = require('koa-router');
const jwt = require('jsonwebtoken');
const koaJwt = require('koa-jwt');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
const router = new Router();
// সিক্রেট কী (এটি একটি গোপন কী, যা টোকেনের সিগনেচার তৈরিতে ব্যবহৃত হবে)
const SECRET_KEY = 'your-secret-key';
// কনফিগারেশন এবং মিডলওয়্যার
app.use(bodyParser()); // ফর্ম ডেটা বা JSON ডেটা হ্যান্ডল করার জন্য
// JWT অথেন্টিকেশন মিডলওয়্যার
app.use(koaJwt({ secret: SECRET_KEY }).unless({ path: ['/login', '/register'] }));
// রাউট তৈরি করা
router.post('/login', async (ctx) => {
const { username, password } = ctx.request.body;
// এখানে ইউজারনেম এবং পাসওয়ার্ড যাচাই করা হবে
if (username === 'user' && password === 'password') {
// ইউজার অথেন্টিকেশন সফল হলে একটি JWT টোকেন তৈরি করা হবে
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
// টোকেন রেসপন্স হিসেবে পাঠানো হচ্ছে
ctx.body = { message: 'Authentication successful!', token };
} else {
ctx.status = 401;
ctx.body = { message: 'Invalid username or password!' };
}
});
router.get('/protected', async (ctx) => {
// যদি JWT টোকেন ভ্যালিড হয়, তাহলে এই রাউটে অ্যাক্সেস পাওয়া যাবে
ctx.body = { message: 'You have access to this protected route!', user: ctx.state.user };
});
// মিডলওয়্যার এবং রাউট সেট করা
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
কোড বিশ্লেষণ:
- JWT টোকেন তৈরি করা:
/loginরাউটে ইউজারনেম এবং পাসওয়ার্ড যাচাই করার পরে, যদি সেটি সঠিক হয়, তবেjwt.sign()মেথড ব্যবহার করে একটি JWT টোকেন তৈরি করা হয়। এই টোকেনটি ক্লায়েন্টকে ফেরত পাঠানো হয়, যাতে ক্লায়েন্ট পরবর্তী রিকোয়েস্টে এটি পাঠাতে পারে। - JWT ভেরিফিকেশন:
koa-jwtমিডলওয়্যারটি JWT টোকেন ভেরিফাই করার জন্য ব্যবহৃত হয়। যখনই ইউজার একটি রিকোয়েস্ট পাঠায়,koa-jwtস্বয়ংক্রিয়ভাবেAuthorizationহেডারে থাকা টোকেনটি ভেরিফাই করবে। যদি টোকেন ভ্যালিড হয়, তবেctx.state.userএ ইউজারের তথ্য পেয়ে যাবে এবং সুরক্ষিত রাউটের অ্যাক্সেস পাবেন। - /protected রাউট: এই রাউটটি সুরক্ষিত (protected) এবং শুধুমাত্র একটি ভ্যালিড JWT টোকেন সহ অ্যাক্সেসযোগ্য। যখন একটি টোকেন পাঠানো হয়, KoaJS এটি ভেরিফাই করবে এবং সঠিক হলে
ctx.state.userথেকে ইউজারের তথ্য ফেরত দেবে।
৩. কিভাবে JWT টোকেন পাঠানো যায়?
JWT টোকেন সাধারণত HTTP রিকোয়েস্টের Authorization হেডারে পাঠানো হয়:
Authorization: Bearer <your-jwt-token>
আপনি axios বা fetch এর মতো ফ্রন্টএন্ড লাইব্রেরি ব্যবহার করে এই টোকেনটি সার্ভারে পাঠাতে পারেন।
উদাহরণ (JavaScript - ফ্রন্টএন্ড):
fetch('http://localhost:3000/protected', {
method: 'GET',
headers: {
'Authorization': 'Bearer <your-jwt-token>',
}
})
.then(response => response.json())
.then(data => console.log(data));
৪. JWT টোকেন ভেরিফিকেশন এবং এক্সপায়ারেশন
JWT-এ অপশনাল expiresIn প্রপার্টি থাকে, যা টোকেনের মেয়াদ নির্ধারণ করে। যেমন, এখানে expiresIn: '1h' ব্যবহার করা হয়েছে, যা টোকেনের মেয়াদ এক ঘণ্টা। এক ঘণ্টা পর টোকেনটি এক্সপায়ার হয়ে যাবে এবং ব্যবহারকারীদের আবার লগইন করতে হবে।
সারাংশ
KoaJS-এ JWT (JSON Web Tokens) ব্যবহার করে অথেন্টিকেশন একটি শক্তিশালী এবং নিরাপদ উপায়। আমরা jsonwebtoken এবং koa-jwt প্যাকেজের সাহায্যে JWT তৈরি এবং ভেরিফাই করেছি, এবং সুরক্ষিত রাউট তৈরির মাধ্যমে অথেন্টিকেশন নিশ্চিত করেছি। এটি একটি সহজ এবং স্কেলেবল অথেন্টিকেশন সিস্টেম তৈরি করতে সহায়তা করে যা ক্লায়েন্ট এবং সার্ভারের মধ্যে সুরক্ষিতভাবে তথ্য আদান-প্রদান করতে পারে।
KoaJS একটি লঘু এবং কাস্টমাইজযোগ্য ওয়েব ফ্রেমওয়ার্ক যা Node.js এর উপর তৈরি। KoaJS-এ ব্যবহারকারীদের অথেন্টিকেশন এবং অথরাইজেশন পরিচালনা করতে Passport.js ব্যবহার করা হয়, যা একটি শক্তিশালী এবং অত্যন্ত কাস্টমাইজযোগ্য অথেন্টিকেশন মেথড। Passport.js বিভিন্ন ধরণের অথেন্টিকেশন স্ট্রাটেজি সমর্থন করে, যেমন লোকাল অথেন্টিকেশন (username/password), OAuth, JWT ইত্যাদি।
এই টিউটোরিয়ালে, আমরা KoaJS এবং Passport.js এর মাধ্যমে ব্যবহারকারীদের অথেন্টিকেশন এবং অথরাইজেশন হ্যান্ডল করার প্রক্রিয়া দেখব।
১. Passport.js এবং অন্যান্য প্রয়োজনীয় প্যাকেজ ইনস্টল করা
প্রথমে, KoaJS অ্যাপ্লিকেশনে Passport.js এবং অন্যান্য প্রয়োজনীয় প্যাকেজ ইনস্টল করতে হবে:
npm install koa-passport passport passport-local koa-session
koa-passport: KoaJS-এ Passport.js ব্যবহার করার জন্য।passport: Passport.js যা বিভিন্ন অথেন্টিকেশন স্ট্রাটেজি সরবরাহ করে।passport-local: লোকাল অথেন্টিকেশনের জন্য।koa-session: সেশন পরিচালনার জন্য, যাতে লগ ইন করা ব্যবহারকারীর তথ্য সংরক্ষণ করা যায়।
২. KoaJS-এ Passport.js কনফিগারেশন
এখন আমরা KoaJS অ্যাপ্লিকেশনে Passport.js কনফিগার করব এবং একটি লোকাল অথেন্টিকেশন স্ট্রাটেজি সেট আপ করব। উদাহরণস্বরূপ, ব্যবহারকারী নাম এবং পাসওয়ার্ডের মাধ্যমে লগইন।
২.১. Passport.js কনফিগারেশন
const Koa = require('koa');
const Router = require('koa-router');
const passport = require('koa-passport');
const session = require('koa-session');
const LocalStrategy = require('passport-local').Strategy;
const app = new Koa();
const router = new Router();
// কুকি এবং সেশন সেটআপ
app.keys = ['some secret key'];
app.use(session(app));
// Passport কনফিগারেশন
passport.use(new LocalStrategy((username, password, done) => {
// উদাহরণস্বরূপ, একটি ফিক্সড ব্যবহারকারী যাচাই করা হচ্ছে
const user = { username: 'testuser', password: 'password123' };
if (username === user.username && password === user.password) {
return done(null, user);
} else {
return done(null, false, { message: 'Invalid username or password' });
}
}));
passport.serializeUser((user, done) => {
done(null, user.username);
});
passport.deserializeUser((username, done) => {
const user = { username: 'testuser' }; // ডেটাবেস থেকে ব্যবহারকারী পুনরুদ্ধার করা যেতে পারে
done(null, user);
});
// Passport মিডলওয়্যার অ্যাড করা
app.use(passport.initialize());
app.use(passport.session());
// রাউট তৈরি করা
router.get('/', async (ctx) => {
if (ctx.isAuthenticated()) {
ctx.body = `Hello ${ctx.state.user.username}, you're logged in!`;
} else {
ctx.body = 'You are not logged in';
}
});
router.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
}));
router.get('/login', async (ctx) => {
ctx.body = `
<form method="post" action="/login">
<label for="username">Username:</label><br>
<input type="text" name="username"><br>
<label for="password">Password:</label><br>
<input type="password" name="password"><br><br>
<input type="submit" value="Login">
</form>
`;
});
// অ্যাপ মাউন্ট করা
app
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
ব্যাখ্যা:
passport.use(new LocalStrategy(...)): আমরা একটি লোকাল অথেন্টিকেশন স্ট্রাটেজি ব্যবহার করছি যেখানে ব্যবহারকারীর নাম এবং পাসওয়ার্ড যাচাই করা হয়।passport.serializeUserএবংpassport.deserializeUser: সেশন তৈরি এবং পুনরুদ্ধারের জন্য ব্যবহার করা হয়। সেশনের মধ্যে শুধু ব্যবহারকারীর নাম সংরক্ষণ করা হয় এবং পরে তা পুনরুদ্ধার করা হয়।passport.authenticate('local', {...}): লগইন ফর্মের সাবমিট করার সময় এটি লোকাল স্ট্রাটেজি ব্যবহার করে অথেন্টিকেশন পরীক্ষা করে। সফল হলে/রাউটে রিডিরেক্ট হবে, নতুবা/loginরাউটে রিডিরেক্ট হবে।ctx.isAuthenticated(): এটি চেক করে যে ব্যবহারকারী লগইন করেছে কিনা। যদি লগইন করা থাকে, তবে তার ব্যবহারকারী নাম দেখানো হবে।
৩. Authorization (অথরাইজেশন) হ্যান্ডলিং
অথরাইজেশন হ্যান্ডল করার জন্য, আপনি ctx.isAuthenticated() চেক করতে পারেন এবং এরপর ব্যবহারকারীর অধিকার যাচাই করতে পারেন। উদাহরণস্বরূপ, কিছু রাউট কেবল লগইন করা ব্যবহারকারীর জন্য প্রবেশযোগ্য হতে পারে।
৩.১. Authorization চেক করা
router.get('/protected', async (ctx) => {
if (ctx.isAuthenticated()) {
ctx.body = 'This is a protected route!';
} else {
ctx.status = 403;
ctx.body = 'You need to log in to access this page';
}
});
এখানে, /protected রাউটটি কেবল তখনই অ্যাক্সেস করা যাবে যখন ব্যবহারকারী লগইন থাকবে। যদি ব্যবহারকারী লগইন না থাকে, তবে এটি একটি 403 Forbidden ত্রুটি রেসপন্স করবে।
৪. Logout (লগআউট) কার্যকর করা
ব্যবহারকারী লগইন হওয়ার পর, তারা একটি লগআউট রাউটে গিয়ে সেশন শেষ করতে পারে।
৪.১. Logout রাউট
router.get('/logout', async (ctx) => {
ctx.logout(); // লগআউট
ctx.redirect('/'); // লগআউট হওয়ার পর হোম পেজে রিডিরেক্ট করা
});
এখানে, ctx.logout() ব্যবহার করে সেশন ক্লিয়ার করা হয় এবং তারপর ব্যবহারকারীকে হোম পেজে রিডিরেক্ট করা হয়।
সারাংশ
KoaJS-এ Passport.js ব্যবহার করে সহজেই authentication এবং authorization হ্যান্ডল করা যায়। passport-local স্ট্রাটেজি ব্যবহার করে ব্যবহারকারীর নাম এবং পাসওয়ার্ডের মাধ্যমে লগইন করা যায় এবং koa-session ব্যবহার করে লগইন স্টেট বজায় রাখা যায়। Authorization হ্যান্ডল করার জন্য, আপনি ctx.isAuthenticated() চেক করে ব্যবহারকারীকে রিসোর্স অ্যাক্সেস দেওয়ার অনুমতি দিতে পারেন। KoaJS এবং Passport.js একত্রে ব্যবহৃত হলে, এটি একটি শক্তিশালী অথেন্টিকেশন এবং অথরাইজেশন সিস্টেম তৈরি করতে সহায়ক।
Role-Based Access Control (RBAC) একটি নিরাপত্তা মডেল যা ব্যবহারকারীদের নির্দিষ্ট ভূমিকার ভিত্তিতে অনুমতি দেয়। এই মডেলটি অ্যাপ্লিকেশনে বিভিন্ন ইউজার গ্রুপের জন্য বিভিন্ন ধরনের অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। KoaJS-এ RBAC ইমপ্লিমেন্ট করা সম্ভব এবং এটি নিরাপত্তা সংক্রান্ত বিভিন্ন কাজ যেমন অথেন্টিকেশন এবং অথরাইজেশনে সহায়তা করে।
RBAC এর মূল ধারণা হলো:
- Roles: বিভিন্ন ধরনের রোল তৈরি করা হয়, যেমন Admin, User, Moderator ইত্যাদি।
- Permissions: প্রতিটি রোলের জন্য বিভিন্ন অনুমতি (access) নির্ধারণ করা হয়, যেমন ডেটা দেখা, সম্পাদনা করা বা মুছে ফেলা।
- Users: ব্যবহারকারীকে একটি নির্দিষ্ট রোল দিয়ে গ্রুপ করা হয় এবং সেই রোলের উপর ভিত্তি করে তাদের অনুমতি দেওয়া হয়।
এখানে, আমরা KoaJS-এ RBAC সেটআপ এবং কনফিগারেশন করার জন্য একটি উদাহরণ দেখব।
১. RBAC কনসেপ্ট ইমপ্লিমেন্টেশন
১.১. Role-Based Access Control কিভাবে কাজ করে?
ধরি, আমাদের একটি অ্যাপ্লিকেশন রয়েছে যেখানে Admin রোল সম্পূর্ণ অ্যাক্সেস পায়, User রোল শুধুমাত্র নিজের তথ্য দেখতে পারে এবং Moderator কিছু কনটেন্ট মডারেট করতে পারে। এর জন্য আমাদের কনফিগারেশন দরকার হবে:
- Admin: সমস্ত রিসোর্স অ্যাক্সেস করতে পারে (View, Edit, Delete)।
- User: শুধুমাত্র নিজেদের তথ্য দেখতে পারে।
- Moderator: নির্দিষ্ট কনটেন্ট মডারেট করতে পারে (View, Delete কিন্তু Edit নয়)।
১.২. প্রাথমিক সেটআপ:
KoaJS-এ RBAC সেটআপ করতে প্রথমে koa-router এবং koa-jwt (JWT অথেনটিকেশন ব্যবহারের জন্য) ইনস্টল করতে হবে।
npm install koa-router koa-jwt jsonwebtoken
১.৩. RBAC এর জন্য কাস্টম মিডলওয়্যার তৈরি করা
আমরা প্রথমে একটি মিডলওয়্যার তৈরি করব যা ব্যবহারকারীর রোলের ভিত্তিতে রিকোয়েস্ট পরিচালনা করবে।
const Koa = require('koa');
const Router = require('koa-router');
const jwt = require('koa-jwt');
const jsonwebtoken = require('jsonwebtoken');
const app = new Koa();
const router = new Router();
// RBAC রোলসের একটি উদাহরণ
const roles = {
admin: ['view', 'edit', 'delete'],
user: ['view'],
moderator: ['view', 'delete'],
};
// কাস্টম মিডলওয়্যার: Role-Based Access Control (RBAC)
const checkPermission = (requiredRole) => {
return async (ctx, next) => {
const user = ctx.state.user; // JWT থেকে ইউজার ইনফরমেশন পেতে
if (!user || !roles[user.role] || !roles[user.role].includes(requiredRole)) {
ctx.status = 403;
ctx.body = { message: 'Forbidden: You do not have permission to access this resource' };
return;
}
await next();
};
};
// JWT অথেনটিকেশন
app.use(jwt({ secret: 'your_secret_key' }).unless({ path: [/^\/login/] }));
// ডেমো রাউট
router.get('/admin', checkPermission('edit'), (ctx) => {
ctx.body = 'Admin Access Granted';
});
router.get('/user', checkPermission('view'), (ctx) => {
ctx.body = 'User Access Granted';
});
router.get('/moderator', checkPermission('delete'), (ctx) => {
ctx.body = 'Moderator Access Granted';
});
// রাউট মাউন্ট করা
app.use(router.routes()).use(router.allowedMethods());
// JWT Login Endpoint (অথেনটিকেশন)
router.post('/login', async (ctx) => {
const { username, password } = ctx.request.body;
// সঠিক ইউজার ভ্যালিডেশন চেক (এটি কেবল একটি উদাহরণ)
if (username === 'admin' && password === 'admin') {
const token = jsonwebtoken.sign({ username, role: 'admin' }, 'your_secret_key', { expiresIn: '1h' });
ctx.body = { message: 'Login successful', token };
} else if (username === 'user' && password === 'user') {
const token = jsonwebtoken.sign({ username, role: 'user' }, 'your_secret_key', { expiresIn: '1h' });
ctx.body = { message: 'Login successful', token };
} else if (username === 'moderator' && password === 'moderator') {
const token = jsonwebtoken.sign({ username, role: 'moderator' }, 'your_secret_key', { expiresIn: '1h' });
ctx.body = { message: 'Login successful', token };
} else {
ctx.status = 401;
ctx.body = { message: 'Invalid credentials' };
}
});
// অ্যাপ চালু করা
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
১.৪. JWT Token তৈরি এবং রিকোয়েস্টে পাঠানো
যখন ইউজার লগ ইন করে, তখন তার রোল অনুযায়ী একটি JWT টোকেন তৈরি করা হয়, যা রিকোয়েস্টের সাথে সার্ভারে পাঠানো হয়।
Login Request Example:
POST http://localhost:3000/login
{
"username": "admin",
"password": "admin"
}
যদি সঠিক ক্রেডেনশিয়াল দেওয়া হয়, তাহলে একটি JWT টোকেন তৈরি হবে যা পরবর্তী রিকোয়েস্টের সাথে পাঠানো যাবে। এরপর, RBAC কাস্টম মিডলওয়্যারটি ইউজারের রোল চেক করবে এবং নির্দিষ্ট অনুমতি প্রদান করবে।
১.৫. Role-Based Access Check
নির্দিষ্ট রোলের জন্য permission চেক করতে checkPermission() মিডলওয়্যার ব্যবহার করা হয়েছে। এই মিডলওয়্যার ব্যবহার করে আপনি একটি রিকোয়েস্টের ক্ষেত্রে রোল ভিত্তিক অনুমতি দিতে পারেন, যেমন admin এর জন্য "edit", user এর জন্য "view"।
২. আরও নিরাপত্তা ও অ্যাক্সেস কনট্রোল
RBAC-এর মাধ্যমে আপনি কেবল ইউজারদের বিভিন্ন রোল প্রদানই করবেন না, বরং তাদের অ্যাক্সেস নিয়ন্ত্রণ করবেন এবং অনুমতিগুলি কাস্টমাইজ করতে পারবেন। যেমন:
- আপনি route-level নিরাপত্তা নির্ধারণ করতে পারেন।
- নির্দিষ্ট HTTP methods যেমন
POST,GET,DELETE, ইত্যাদি সংরক্ষণ করতে পারেন।
সারাংশ
KoaJS-এ Role-Based Access Control (RBAC) ইমপ্লিমেন্টেশন খুবই সহজ। এটি আপনাকে অ্যাপ্লিকেশনের বিভিন্ন অংশের জন্য নিরাপত্তা প্রদান করতে সাহায্য করে, যেখানে আপনি ইউজারের রোলের উপর ভিত্তি করে তাদের অ্যাক্সেস নিয়ন্ত্রণ করতে পারবেন। JWT ব্যবহার করে আপনি নিরাপদভাবে ইউজারের রোল যাচাই করে নির্দিষ্ট রিসোর্স অ্যাক্সেস করতে পারবেন। KoaJS-এ RBAC সিস্টেম সেটআপ করার মাধ্যমে আপনি অ্যাপ্লিকেশনে শক্তিশালী নিরাপত্তা প্রদান করতে পারবেন।
KoaJS একটি শক্তিশালী ওয়েব ফ্রেমওয়ার্ক, যা Node.js পরিবেশে ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্টে ব্যবহৃত হয়। কখনও কখনও আপনার ওয়েব অ্যাপ্লিকেশনে কিছু রাউটকে নিরাপদ বা সুরক্ষিত রাখতে হয়, যাতে সেগুলি শুধুমাত্র অথেনটিকেটেড বা অথরাইজড ব্যবহারকারীরা অ্যাক্সেস করতে পারে। KoaJS এ সিকিউর রাউট তৈরি করতে আপনি সাধারণত অথেনটিকেশন এবং অথরাইজেশন ব্যবস্থাপনা ব্যবহার করেন, যেমন JWT (JSON Web Tokens) বা সেশন বেসড অথেনটিকেশন।
এই টিউটোরিয়ালে, আমরা KoaJS-এ সুরক্ষিত রাউট তৈরি করার পদ্ধতি দেখব, যেখানে JWT (JSON Web Token) ব্যবহার করে অথেনটিকেশন এবং অথরাইজেশন করা হবে।
১. JWT (JSON Web Token) ব্যবহারের মাধ্যমে Secure Routes তৈরি করা
১.১. JWT এবং প্রয়োজনীয় প্যাকেজ ইনস্টল করা
প্রথমে আপনাকে JWT জেনারেট এবং ভেরিফাই করতে কিছু প্যাকেজ ইনস্টল করতে হবে:
npm install koa-jwt jsonwebtoken
এখানে:
koa-jwt: এটি KoaJS-এর জন্য একটি মিডলওয়্যার যা JWT টোকেন ভ্যালিডেট করতে সাহায্য করে।jsonwebtoken: এটি JWT টোকেন তৈরি এবং ভেরিফাই করার জন্য ব্যবহৃত হয়।
১.২. JWT তৈরির জন্য একটি রাউট তৈরি করা
এখন, আমরা একটি রাউট তৈরি করব যেখান থেকে ব্যবহারকারী লগ ইন করার সময় একটি JWT টোকেন পাবেন।
const Koa = require('koa');
const Router = require('koa-router');
const jwt = require('jsonwebtoken');
const app = new Koa();
const router = new Router();
// Secret key (আপনার পরিবেশে এটি নিরাপদ স্থানে রাখুন)
const secretKey = 'your_secret_key';
// Login রাউট - যেখানে JWT তৈরি করা হবে
router.post('/login', async (ctx) => {
const { username, password } = ctx.request.body;
// উদাহরণস্বরূপ, সঠিক ইউজারনেম এবং পাসওয়ার্ড যাচাই করা
if (username === 'user' && password === 'password123') {
const token = jwt.sign({ username: username }, secretKey, { expiresIn: '1h' });
ctx.body = { message: 'Login successful', token: token };
} else {
ctx.status = 401;
ctx.body = { message: 'Invalid credentials' };
}
});
// রাউট মাউন্ট করা
app.use(router.routes()).use(router.allowedMethods());
// অ্যাপ চালু করা
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
এখানে, /login রাউটে একটি ইউজারনেম এবং পাসওয়ার্ড যাচাই করা হচ্ছে। যদি এটি সঠিক হয়, তবে একটি JWT টোকেন তৈরি করা হবে, যা ব্যবহারকারী পরবর্তী রিকোয়েস্টে পাঠাতে পারবেন।
১.৩. Secure Routes (অথেনটিকেটেড রাউট) তৈরি করা
এখন, আমরা একটি সুরক্ষিত রাউট তৈরি করব যেখানে JWT টোকেন যাচাই করা হবে। এই রাউটটি শুধুমাত্র তখনই অ্যাক্সেসযোগ্য হবে যখন ইউজার একটি বৈধ JWT টোকেন প্রদান করবে।
const koaJwt = require('koa-jwt');
// Secure রাউট - JWT যাচাই করা হবে
router.get('/secure', koaJwt({ secret: secretKey }), async (ctx) => {
ctx.body = { message: 'This is a secure route', user: ctx.state.user };
});
// রাউট মাউন্ট করা
app.use(router.routes()).use(router.allowedMethods());
এখানে, koa-jwt মিডলওয়্যারটি ব্যবহার করা হচ্ছে, যা রিকোয়েস্টের Authorization হেডারে দেওয়া টোকেনের মাধ্যমে ব্যবহারকারীর অথেনটিকেশন চেক করবে। যদি টোকেন বৈধ হয়, তবে ব্যবহারকারী অ্যাক্সেস পাবে এবং ctx.state.user এর মধ্যে ব্যবহারকারীর তথ্য পাওয়া যাবে।
২. JWT টোকেন ভ্যালিডেশন
koa-jwt মিডলওয়্যার রিকোয়েস্টের Authorization হেডারে থাকা JWT টোকেন স্বয়ংক্রিয়ভাবে যাচাই করে। আপনি যদি কাস্টম ভ্যালিডেশন যুক্ত করতে চান, তবে আপনি jwt.verify() ব্যবহার করতে পারেন।
router.get('/secure', async (ctx, next) => {
const token = ctx.headers.authorization && ctx.headers.authorization.split(' ')[1];
if (!token) {
ctx.status = 401;
ctx.body = { message: 'Token missing' };
return;
}
try {
// JWT টোকেন যাচাই
const decoded = jwt.verify(token, secretKey);
ctx.state.user = decoded; // ব্যবহারকারীর তথ্য ctx.state.user এ সংরক্ষণ
await next();
} catch (err) {
ctx.status = 401;
ctx.body = { message: 'Invalid or expired token' };
}
}, async (ctx) => {
ctx.body = { message: 'This is a secure route', user: ctx.state.user };
});
এখানে:
ctx.headers.authorization.split(' ')[1]দিয়েAuthorizationহেডারে থাকা টোকেনটি অ্যাক্সেস করা হচ্ছে।jwt.verify()ব্যবহার করে টোকেনটি যাচাই করা হচ্ছে।
৩. Logout রাউট
JWT এর জন্য একটি সাধারণ logout রাউট তৈরি করা হয় না, কারণ JWT স্টোরেজে সাধারণত কোন সার্ভার সাইড সেশন থাকে না। তবে, আপনি ক্লায়েন্ট সাইডে টোকেন মুছে ফেলতে পারেন।
router.post('/logout', async (ctx) => {
ctx.body = { message: 'Logged out successfully' };
});
এখানে, ক্লায়েন্টের টোকেন মুছে ফেলতে হবে (যেমন LocalStorage বা Cookie থেকে)। সার্ভার সাইডে সেশন ব্যবস্থাপনা নেই, তাই টোকেনটি মুছে ফেললেই ইউজার লগ আউট হয়ে যাবে।
সারাংশ
KoaJS-এ সুরক্ষিত রাউট তৈরি করতে JWT (JSON Web Token) একটি শক্তিশালী উপায়। koa-jwt মিডলওয়্যার ব্যবহার করে আপনি JWT ভ্যালিডেশন করতে পারেন এবং শুধুমাত্র অথেনটিকেটেড ব্যবহারকারীদের জন্য রাউট এক্সেসযোগ্য করতে পারেন। এই পদ্ধতিটি রাউট সিকিউরিটি এবং অথোরাইজেশন সুবিধা প্রদান করে, এবং খুবই সহজভাবে অ্যাপ্লিকেশনে নিরাপত্তা ব্যবস্থা যুক্ত করা সম্ভব হয়।
Read more