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 একত্রে ব্যবহৃত হলে, এটি একটি শক্তিশালী অথেন্টিকেশন এবং অথরাইজেশন সিস্টেম তৈরি করতে সহায়ক।
Read more