Socket.IO একটি রিয়েল-টাইম, ইভেন্ট-ভিত্তিক লাইব্রেরি, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে দ্রুত এবং স্থিতিশীল ডেটা ট্রান্সফার সম্ভব করে তোলে। যখন আমরা Socket.IO ব্যবহার করি, তখন রিয়েল-টাইম কমিউনিকেশন সিস্টেমে অথেনটিকেশন যোগ করা গুরুত্বপূর্ণ, যাতে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা কানেক্ট এবং ডেটা আদান-প্রদান করতে পারে। এই প্রক্রিয়াটি সাধারণত টোকেন-ভিত্তিক অথেনটিকেশন বা সেশন-ভিত্তিক অথেনটিকেশন এর মাধ্যমে করা হয়।
এখানে আমরা Socket.IO এর মাধ্যমে অথেনটিকেশন কিভাবে সেটআপ করা যায় তা বিস্তারিতভাবে আলোচনা করব।
1. Token-based Authentication
Token-based Authentication একটি জনপ্রিয় পদ্ধতি যেখানে ক্লায়েন্ট প্রথমে সার্ভার থেকে একটি JWT (JSON Web Token) অথবা অন্য কোনো অথেনটিকেশন টোকেন পায় এবং তারপর সেই টোকেন ব্যবহার করে সার্ভারের সাথে কানেক্ট হয়। এই টোকেনটি প্রতিটি ইভেন্টের সাথে সার্ভারে পাঠানো হয় এবং সার্ভার এটি যাচাই করে নিশ্চিত করে যে ক্লায়েন্টটি বৈধ কিনা।
Server-Side (Node.js) - JWT অথেনটিকেশন সেটআপ
Step 1: প্রয়োজনীয় প্যাকেজ ইনস্টল করা
প্রথমে, টোকেন অথেনটিকেশন ব্যবহারের জন্য আপনাকে কিছু প্রয়োজনীয় প্যাকেজ ইনস্টল করতে হবে:
npm install socket.io jsonwebtoken expressStep 2: JWT অথেনটিকেশন ব্যবহার করা
এখানে আমরা একটি Socket.IO সার্ভার তৈরি করব এবং JWT ব্যবহার করে ক্লায়েন্টের অথেনটিকেশন যাচাই করব।
const http = require('http');
const socketIo = require('socket.io');
const jwt = require('jsonwebtoken');
const express = require('express');
// Express অ্যাপ তৈরি করা
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
// Secret key for JWT
const secretKey = 'your-secret-key';
// Middleware to verify JWT token
function verifyToken(socket, next) {
const token = socket.handshake.query.token; // ক্লায়েন্ট থেকে টোকেন নেওয়া
if (!token) {
return next(new Error('Authentication error: No token provided'));
}
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
return next(new Error('Authentication error: Invalid token'));
}
socket.user = decoded; // ডিকোড করা ইউজার তথ্য সার্ভারে যোগ করা
next();
});
}
// Socket.IO - কানেকশন এবং অথেনটিকেশন যাচাই
io.use(verifyToken); // JWT অথেনটিকেশন যাচাই
io.on('connection', (socket) => {
console.log(`User connected with ID: ${socket.user.id}`);
// ক্লায়েন্ট থেকে মেসেজ গ্রহণ করা
socket.on('send message', (message) => {
console.log('Received message: ' + message);
socket.emit('receive message', 'Hello from server!');
});
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
// Express route to issue JWT token for testing
app.post('/login', (req, res) => {
const user = { id: 1, name: 'John Doe' }; // Dummy user data
// Create JWT token
const token = jwt.sign(user, secretKey, { expiresIn: '1h' });
res.json({ token });
});
server.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});ব্যাখ্যা:
verifyToken: একটি মিডলওয়্যার ফাংশন যা ক্লায়েন্ট থেকে পাঠানো JWT টোকেন যাচাই করে। টোকেন সঠিক হলে ইউজার ইনফরমেশনsocket.userএ স্টোর করা হয়।socket.handshake.query.token: এই অংশে ক্লায়েন্ট থেকে পাঠানো টোকেন নেওয়া হয়।jwt.verify(token, secretKey): এটি JWT টোকেন যাচাই করার জন্য ব্যবহৃত হয়।app.post('/login'): একটি/loginরাউট যেখানে একটি dummy ইউজার তৈরি করা হয়েছে এবং JWT টোকেন জেনারেট করা হচ্ছে। এই টোকেনটি ক্লায়েন্টকে রেসপন্স হিসেবে দেওয়া হয়।
Client-Side (ক্লায়েন্ট সাইড) - JWT Authentication
ক্লায়েন্ট সাইড কোড (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Socket.IO Authentication Example</title>
<script src="/socket.io/socket.io.js"></script>
<script>
let socket;
// Login function to get JWT token
async function login() {
const response = await fetch('http://localhost:3000/login', { method: 'POST' });
const data = await response.json();
const token = data.token;
// Connect to Socket.IO with JWT token
socket = io('http://localhost:3000', {
query: { token: token }
});
socket.on('connect', () => {
console.log('Connected to server');
});
socket.on('receive message', (message) => {
console.log('Message from server: ', message);
});
}
// Send message function
function sendMessage() {
const message = document.getElementById('message').value;
socket.emit('send message', message); // Send message to server
}
</script>
</head>
<body>
<h1>Socket.IO Authentication</h1>
<button onclick="login()">Login</button>
<br>
<input type="text" id="message" placeholder="Enter message">
<button onclick="sendMessage()">Send Message</button>
</body>
</html>ব্যাখ্যা:
login(): এই ফাংশনটি সার্ভারে লগইন করার জন্য ব্যবহার করা হয়। এটি সার্ভার থেকে JWT টোকেন পেয়ে, সেই টোকেন দিয়ে Socket.IO সার্ভারে কানেক্ট হয়।socket.emit('send message', message): এখানে ক্লায়েন্ট সার্ভারে একটি মেসেজ পাঠাচ্ছে।socket.on('receive message', ...): সার্ভার থেকে আসা মেসেজ শোনার জন্য ইভেন্ট হ্যান্ডল করা হচ্ছে।
2. Session-based Authentication
অথবা আপনি সেশন-ভিত্তিক অথেনটিকেশন ব্যবহার করতে পারেন, যেখানে ব্যবহারকারী লগইন করার পরে সার্ভার একটি সেশন আইডি তৈরি করে এবং সেটি ব্যবহারকারীকে পাঠায়। সেশন আইডি ক্লায়েন্টের সাথে সংরক্ষণ করা হয় এবং পরবর্তী রিকোয়েস্টে ব্যবহার করা হয়।
Server-Side (Node.js) - Session Authentication (Express + Socket.IO)
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const session = require('express-session');
// Express অ্যাপ তৈরি করা
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
// সেশন সেটআপ
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
// ক্লায়েন্টে লগইন হওয়ার পর সেশন সেট করা
app.post('/login', (req, res) => {
req.session.user = { id: 1, name: 'John Doe' }; // Dummy user session
res.send('Logged in');
});
// Socket.IO - সেশন যাচাই
io.on('connection', (socket) => {
console.log('A user connected');
// সেশন যাচাই করা
if (!socket.request.session.user) {
socket.disconnect(); // সেশন না থাকলে ডিসকানেক্ট করা
} else {
console.log('User authenticated');
}
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
server.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});এখানে, Express এবং Session ব্যবহার করা হয়েছে, এবং Socket.IO সার্ভার সেটআপে সেশন যাচাই করা হয়েছে। যদি সেশন না থাকে, তবে ক্লায়েন্টকে ডিসকানেক্ট করা হবে।
সারসংক্ষেপ
- JWT-based Authentication: Socket.IO-এর মাধ্যমে টোকেন-ভিত্তিক অথেনটিকেশন ব্যবহার করে আপনি ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদ কানেকশন স্থাপন করতে পারেন।
- Session-based Authentication: সেশন ব্যবহার করে আপনি ব্যবহারকারীদের লগইন এবং অথেনটিকেট করতে পারেন, যাতে একাধিক রিকোয়েস্টে ব্যবহারকারীর তথ্য যাচাই করা যায়।
- Socket.IO-তে Authentication
প্রক্রিয়া নিশ্চিত করতে সঠিক অথেনটিকেশন স্ট্রাটেজি নির্বাচন করা অত্যন্ত গুরুত্বপূর্ণ।
Client Authentication হল একটি নিরাপত্তা ব্যবস্থা যার মাধ্যমে সার্ভার একটি ক্লায়েন্টের পরিচয় যাচাই করে। এটি নিশ্চিত করে যে, যে ব্যক্তি বা সিস্টেম সার্ভারে প্রবেশ করার চেষ্টা করছে, সে আসলেই সেই ব্যক্তি, অ্যাপ্লিকেশন, বা ডিভাইস যা দাবি করা হচ্ছে।
Client authentication প্রক্রিয়া সাধারণত ব্যবহারকারীর আইডেন্টিটি যাচাই এবং অ্যাক্সেস কন্ট্রোল নিশ্চিত করতে ব্যবহৃত হয়, যা একটি সুরক্ষিত পরিবেশ নিশ্চিত করতে সহায়তা করে। ওয়েব অ্যাপ্লিকেশন, মোবাইল অ্যাপ্লিকেশন, এবং সার্ভিসে ক্লায়েন্টদের সঠিকভাবে যাচাই করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ।
Client Authentication এর প্রয়োজনীয়তা
- নিরাপত্তা নিশ্চিতকরণ:
- Unauthorized Access প্রতিরোধ: Client authentication অ্যাপ্লিকেশন বা সার্ভিসে অবৈধ ব্যবহারকারী বা অনাকাঙ্ক্ষিত অ্যাক্সেসের চেষ্টা প্রতিরোধ করতে সাহায্য করে। একমাত্র অনুমোদিত ব্যবহারকারীদের অ্যাপ্লিকেশন বা সিস্টেমে প্রবেশের অধিকার দেওয়া হয়।
- Data Protection: ব্যবহারকারী বা ক্লায়েন্টের তথ্য নিরাপদ রাখা। একটি অ্যাপ্লিকেশন বা ওয়েবসাইটের সার্ভারে সংরক্ষিত সংবেদনশীল তথ্য (যেমন, পাসওয়ার্ড, ক্রেডিট কার্ড তথ্য) কেবলমাত্র অনুমোদিত ব্যবহারকারীই অ্যাক্সেস করতে পারে।
- ব্যবহারকারীর আইডেন্টিটি যাচাই করা:
- Identity Verification: Client authentication এর মাধ্যমে, সার্ভার নিশ্চিত করতে পারে যে ক্লায়েন্ট বা ব্যবহারকারী সঠিক এবং বৈধ। এটি অনেক গুরুত্বপূর্ণ যখন বিভিন্ন ধরনের সুরক্ষিত তথ্য বা অ্যাক্সেস প্রয়োজন হয় (যেমন, ব্যাংক অ্যাকাউন্ট, স্বাস্থ্য সংক্রান্ত ডেটা)।
- ফিশিং ও হ্যাকারদের প্রতিরোধ: ওয়েব অ্যাপ্লিকেশন বা API এ প্রবেশ করার সময় ব্যবহারকারীর প্রকৃত পরিচয় যাচাই করা হলে, এটি হ্যাকারদের বা ফিশিংয়ের মাধ্যমে ম্যালিসিয়াস প্রবেশের চেষ্টা বন্ধ করতে সহায়তা করে।
- অ্যাক্সেস কন্ট্রোল এবং পারমিশন:
- Role-based Access Control (RBAC): Client authentication সিস্টেম ব্যবহার করে, আপনি নির্দিষ্ট ব্যবহারকারী বা ক্লায়েন্টের জন্য নির্দিষ্ট রিসোর্স বা কার্যকলাপের অনুমতি প্রদান করতে পারেন। যেমন, একজন অ্যাডমিনকে সব রিসোর্স অ্যাক্সেস করার অনুমতি দেওয়া হলেও, সাধারণ ব্যবহারকারীকে শুধুমাত্র নির্দিষ্ট তথ্য অ্যাক্সেসের অনুমতি দেওয়া হয়।
- Context-based Authorization: বিভিন্ন ধরনের ক্লায়েন্টদের জন্য বিভিন্ন স্তরের অ্যাক্সেস প্রদান করা হয়, যেমন, ক্লায়েন্টদের অবস্থান বা ডিভাইসের ধরণের উপর ভিত্তি করে বিভিন্ন অনুমতি দেওয়া।
- অ্যাকাউন্ট এবং সিস্টেম সুরক্ষা:
- Prevention of Account Takeover: Client authentication পদ্ধতি ব্যবহারের মাধ্যমে আপনি অনুমোদিত ব্যবহারকারীর অ্যাকাউন্টের নিরাপত্তা নিশ্চিত করতে পারেন, যেমন 2FA (Two-Factor Authentication) বা MFA (Multi-Factor Authentication) এর মতো অতিরিক্ত সুরক্ষা ব্যবস্থা ব্যবহৃত হয়।
- Session Management: ব্যবহারকারীর লগ ইন ও লগ আউট প্রক্রিয়া সঠিকভাবে পরিচালনা করা, এবং ব্যবহারের জন্য অ্যাক্সেস শুদ্ধভাবে নিয়ন্ত্রণ করা।
- API এবং থার্ড-পার্টি সিস্টেমে সুরক্ষা:
- Secure APIs: অনেক সিস্টেমে ক্লায়েন্ট অ্যাপ্লিকেশন বা সিস্টেমের সাথে API ইন্টিগ্রেশন প্রয়োজন হয়। API গুলির জন্য সঠিক ক্লায়েন্ট authentication ব্যবস্থা থাকা আবশ্যক, যাতে API গুলি নিরাপদ থাকে এবং শুধুমাত্র বৈধ ক্লায়েন্টদের জন্য অ্যাক্সেস অনুমোদিত হয়। উদাহরণস্বরূপ, OAuth, **JWT (JSON Web Tokens)**।
- Service Access Control: অ্যাপ্লিকেশন সার্ভিসগুলির জন্য সঠিক ক্লায়েন্ট authentication ব্যবহার করে বিভিন্ন সিস্টেম এবং থার্ড-পার্টি সার্ভিসের সাথে সংযোগ নিরাপদ করা যায়।
- ব্যবহারকারীদের আস্থা অর্জন:
- Trust and Credibility: যখন একটি সিস্টেম বা অ্যাপ্লিকেশন সঠিকভাবে ক্লায়েন্ট authentication ব্যবহৃত করে, তখন ব্যবহারকারীদের মধ্যে আস্থা সৃষ্টি হয় যে তাদের তথ্য এবং অ্যাকাউন্ট নিরাপদ। এটি সেবা প্রদানকারীর জন্য বিশ্বাসযোগ্যতা তৈরি করে এবং ব্যবহারকারীদের পুনরায় সিস্টেম ব্যবহার করার জন্য উৎসাহিত করে।
Client Authentication পদ্ধতি
- ব্যবহারকারীর নাম এবং পাসওয়ার্ড:
- সাধারণত একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড দ্বারা ক্লায়েন্ট authentication করা হয়। এটি একটি মৌলিক অথেনটিকেশন পদ্ধতি যেখানে ব্যবহারকারী একটি পাসওয়ার্ড দিয়ে সার্ভারে লগ ইন করতে পারে। তবে, শুধুমাত্র পাসওয়ার্ড দিয়ে নিরাপত্তা নিশ্চিত করা কঠিন, তাই অতিরিক্ত সুরক্ষা ব্যবস্থার প্রয়োজন।
- Two-Factor Authentication (2FA):
- এটি একটি অতিরিক্ত সুরক্ষা ব্যবস্থা, যেখানে ব্যবহারকারীদের পাসওয়ার্ড ছাড়াও, একটি অতিরিক্ত কোড (যেমন, OTP) প্রদান করতে হয়। এটি অ্যাকাউন্ট সুরক্ষা বৃদ্ধি করে এবং ফিশিং বা পাসওয়ার্ড চুরির সম্ভাবনা কমিয়ে দেয়।
- Multi-Factor Authentication (MFA):
- 2FA এর মতো, তবে এতে একাধিক প্রমাণীকরণ পদ্ধতি ব্যবহার করা হয়। যেমন, পাসওয়ার্ড, OTP এবং বায়োমেট্রিক (ফিঙ্গারপ্রিন্ট, ফেসিয়াল রিকগনিশন) সিকিউরিটি ব্যবস্থার সংমিশ্রণ।
- OAuth (Open Authorization):
- এটি একটি জনপ্রিয় অথেনটিকেশন প্রোটোকল, যা ব্যবহারকারীদের তাদের পরিচয় অন্য প্ল্যাটফর্মের (যেমন গুগল, ফেসবুক) মাধ্যমে যাচাই করার সুযোগ দেয়। এটি থার্ড-পার্টি অ্যাপ্লিকেশনগুলির জন্য নিরাপদ অথেনটিকেশন ব্যবস্থা।
- JWT (JSON Web Tokens):
- JWT একটি ওপেন স্ট্যান্ডার্ড যা সার্ভার এবং ক্লায়েন্টের মধ্যে নিরাপদভাবে তথ্য আদান-প্রদান করতে ব্যবহৃত হয়। এটি বিশেষত API সিস্টেমে ক্লায়েন্ট authentication এর জন্য ব্যবহার হয়।
- API Keys:
- API কে নিরাপদ রাখার জন্য API Keys ব্যবহার করা হয়। এই keys ক্লায়েন্টকে সার্ভারে প্রমাণীকরণ করার সুযোগ দেয় এবং API থেকে সুরক্ষিত তথ্য নেওয়ার অনুমতি দেয়।
সারসংক্ষেপ
Client authentication হল একটি নিরাপত্তা ব্যবস্থা যা সার্ভারে প্রবেশকারী ক্লায়েন্ট বা ব্যবহারকারীর পরিচয় যাচাই করে। এটি নিশ্চিত করে যে, শুধুমাত্র অনুমোদিত ব্যবহারকারী বা অ্যাপ্লিকেশনই ডেটা অ্যাক্সেস বা সিস্টেম ব্যবহার করতে পারবে। Client authentication সিস্টেমটি ওয়েব অ্যাপ্লিকেশন, মোবাইল অ্যাপ্লিকেশন, API সুরক্ষা, এবং মাল্টিপ্লেয়ার গেমের জন্য অত্যন্ত গুরুত্বপূর্ণ। সঠিক ক্লায়েন্ট authentication ব্যবহারের মাধ্যমে সিস্টেমের সুরক্ষা, অ্যাক্সেস কন্ট্রোল, এবং ডেটা প্রাইভেসি নিশ্চিত করা যায়।
Token-based authentication একটি নিরাপদ পদ্ধতি, যেখানে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ সুরক্ষিত করার জন্য একটি token (যেমন JWT, JSON Web Token) ব্যবহার করা হয়। এটি বিশেষত ওয়েব অ্যাপ্লিকেশনের নিরাপত্তা ব্যবস্থায় ব্যবহার করা হয়, যেখানে ক্লায়েন্টের পরিচয় প্রমাণ করার জন্য এই token ব্যবহার করা হয়।
Socket.IO তে Token-based authentication প্রয়োগ করার জন্য, প্রথমে ক্লায়েন্ট সার্ভারকে একটি token পাঠায় এবং সার্ভার সেটি যাচাই করে নিশ্চিত হয় যে ক্লায়েন্ট অনুমোদিত কিনা। সঠিক token পেলে, তখন ক্লায়েন্ট Socket.IO এর মাধ্যমে সংযোগ স্থাপন করতে পারে।
এখানে Token-based authentication এবং Socket.IO এর ইন্টিগ্রেশন প্রক্রিয়া নিয়ে বিস্তারিত আলোচনা করা হবে:
1. JWT (JSON Web Token) ব্যবহার করে Authentication
1.1 JWT কী?
JWT একটি ওপেন স্ট্যান্ডার্ড (RFC 7519) যা দুটি পক্ষের মধ্যে নিরাপদভাবে তথ্য আদান-প্রদান করতে ব্যবহৃত হয়। এটি তিনটি অংশে বিভক্ত:
- Header: মেটাডেটা, যেমন টোকেনের ধরন এবং এনক্রিপশন অ্যালগরিদম।
- Payload: ব্যবহারকারী সম্পর্কিত তথ্য।
- Signature: সার্ভারের গোপন কী দ্বারা সৃষ্ট একটি সিগনেচার যা টোকেনটি পরিবর্তিত হয়নি তা নিশ্চিত করে।
JWT একটি Base64Url এনকোডেড স্ট্রিং হিসেবে ক্লায়েন্ট এবং সার্ভারের মধ্যে আদান-প্রদান করা হয়।
2. Socket.IO এর সাথে JWT ইন্টিগ্রেশন
Socket.IO তে token-based authentication প্রয়োগ করার জন্য, সাধারণত connection হ্যান্ডল করার সময় JWT যাচাই করা হয়। ক্লায়েন্ট যখন সার্ভারে সংযোগ স্থাপন করে, তখন সে token পাঠায় এবং সার্ভার সেটি যাচাই করে। যদি token বৈধ হয়, তবে সংযোগ অনুমোদন করা হয়।
3. Socket.IO তে JWT Authentication প্রয়োগ করার পদক্ষেপ
3.1 Socket.IO সার্ভার (Node.js)
সার্ভারে JWT যাচাই করার জন্য jsonwebtoken প্যাকেজ ব্যবহার করা যেতে পারে। প্রথমে এই প্যাকেজটি ইন্সটল করতে হবে।
npm install socket.io jsonwebtokenএখন Socket.IO এবং JWT দিয়ে সার্ভার কোড তৈরি করা হবে।
const http = require('http');
const socketIo = require('socket.io');
const jwt = require('jsonwebtoken');
// সার্ভারের জন্য HTTP সার্ভার তৈরি
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Socket.IO Server');
});
const io = socketIo(server);
// গোপন সার্ভার কিপদ্ধতি
const SECRET_KEY = 'your_secret_key';
// JWT যাচাই করার ফাংশন
function verifyToken(socket, next) {
const token = socket.handshake.query.token; // token এখানে query প্যারামিটার হিসেবে আসে
if (!token) {
return next(new Error('Authentication error')); // token না থাকলে Error ফেরত পাঠানো
}
// JWT যাচাই করা
jwt.verify(token, SECRET_KEY, (err, decoded) => {
if (err) {
return next(new Error('Authentication error')); // token বৈধ না হলে Error ফেরত পাঠানো
}
socket.user = decoded; // যেসম্পর্কে token তথ্য থাকলে তা socket এর সাথে যুক্ত করা
next(); // যদি token বৈধ হয়, তাহলে connection অনুমোদন
});
}
// Socket.IO connection হ্যান্ডলিং
io.use(verifyToken); // Middleware হিসাবে JWT যাচাই
io.on('connection', (socket) => {
console.log('A user connected', socket.user); // decoded JWT তথ্য লগ করা
// ক্লায়েন্ট থেকে মেসেজ গ্রহণ করা
socket.on('message', (data) => {
console.log('Message from client:', data);
socket.emit('response', 'Message received');
});
socket.on('disconnect', () => {
console.log('A user disconnected');
});
});
// সার্ভার 3000 পোর্টে চলবে
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});এখানে, verifyToken ফাংশনটি ব্যবহার করা হয়েছে যেটি ক্লায়েন্টের token যাচাই করে এবং যদি তা সঠিক না হয়, তবে ক্লায়েন্টকে সংযোগ করার অনুমতি দেয় না।
3.2 ক্লায়েন্ট সাইড (HTML + JavaScript)
ক্লায়েন্টের মাধ্যমে JWT পাঠানোর জন্য, socket.io-client প্যাকেজের মাধ্যমে একটি token পাঠাতে হবে।
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Socket.IO JWT Authentication</title>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<h1>Socket.IO JWT Authentication Example</h1>
<script>
// JWT টোকেন (এটি সাধারণত সার্ভার থেকে ক্লায়েন্টকে পাঠানো হয়)
const token = 'your_jwt_token_here';
// সার্ভারের সাথে সংযোগ স্থাপন
var socket = io('http://localhost:3000', {
query: { token: token } // টোকেন এখানে query প্যারামিটার হিসেবে পাঠানো হচ্ছে
});
// সার্ভার থেকে রেসপন্স গ্রহণ
socket.on('response', function (data) {
console.log('Received from server:', data);
});
// সার্ভারে মেসেজ পাঠানো
socket.emit('message', 'Hello, Server!');
</script>
</body>
</html>এখানে, token ক্লায়েন্টে হার্ডকোড করা রয়েছে, তবে বাস্তব জীবনে এটি সাধারণত লগইন প্রক্রিয়া শেষে পাওয়া যায়। টোকেনটি সার্ভারে পাঠানো হয় query প্যারামিটার হিসেবে, এবং সার্ভার সেই token যাচাই করে।
4. JWT Token তৈরি করা (User Login)
সাধারণভাবে, JWT token একটি ব্যবহারকারী লগইন করার পর সার্ভার দ্বারা তৈরি করা হয়। নিচে একটি JWT token তৈরির উদাহরণ দেওয়া হলো:
const jwt = require('jsonwebtoken');
// ব্যবহারকারী তথ্য
const user = { id: 1, username: 'john_doe' };
// JWT টোকেন তৈরি করা
const token = jwt.sign(user, SECRET_KEY, { expiresIn: '1h' });
console.log('JWT Token:', token);এখানে, jwt.sign() ফাংশনটি ব্যবহার করে ব্যবহারকারী তথ্যের উপর ভিত্তি করে একটি token তৈরি করা হচ্ছে। এই token এর মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদ যোগাযোগ স্থাপন করা হয়।
সারসংক্ষেপ:
- Token-based Authentication ব্যবহার করে আপনি Socket.IO তে ক্লায়েন্ট এবং সার্ভারের মধ্যে সুরক্ষিত যোগাযোগ নিশ্চিত করতে পারেন।
- JWT (JSON Web Token) ক্লায়েন্টের পরিচয় নিশ্চিত করার জন্য একটি জনপ্রিয় পদ্ধতি।
socket.handshake.query.tokenদিয়ে ক্লায়েন্ট টোকেন পাঠায় এবং সার্ভার সেটি যাচাই করে।- Socket.IO এর মাধ্যমে JWT authentication যুক্ত করে রিয়েল-টাইম যোগাযোগে নিরাপত্তা বাড়ানো যায়।
এভাবে Socket.IO এর সাথে token-based authentication (বিশেষত JWT) ইন্টিগ্রেট করে নিরাপদ যোগাযোগ ব্যবস্থা তৈরি করা যায়।
Middleware হল একটি ফাংশন যা সার্ভারের রিকোয়েস্ট প্রক্রিয়ায় একাধিক স্তরের মধ্যে কাজ করে এবং সাধারণত রিকোয়েস্টের প্রাথমিক চেকিং, ভ্যালিডেশন বা প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। Authentication একটি অত্যন্ত গুরুত্বপূর্ণ কাজ, যেখানে ব্যবহারকারীদের সঠিকভাবে যাচাই করা হয়, যেন তারা অ্যাপ্লিকেশনে প্রবেশ করতে পারে।
Socket.IO এর সাথে Middleware ব্যবহার করে Authentication কিভাবে করা যায়, সেটা নিচে বিস্তারিতভাবে আলোচনা করা হয়েছে।
Middleware কী?
Middleware একটি ফাংশন যা সার্ভারে একটি রিকোয়েস্ট এবং রেসপন্সের মধ্যে কাজ করে। এটি সাধারণত কিছু কাজ যেমন লগিং, ভ্যালিডেশন, Authentication বা Authorization করতে ব্যবহৃত হয়। Socket.IO তে middleware এর মাধ্যমে আপনি একটি ক্লায়েন্টের অনুরোধ গ্রহণ করার আগে তার অ্যাক্সেস যাচাই করতে পারেন।
Authentication Middleware in Socket.IO
Socket.IO তে আপনি connection ইভেন্টের মধ্যে middleware ব্যবহার করতে পারেন, যেখানে ক্লায়েন্ট কানেক্ট করার আগে আপনার অ্যাপ্লিকেশন তার অথেনটিকেশন যাচাই করতে পারে। এখানে socket.handshake ব্যবহার করে আপনি কাস্টম অথেনটিকেশন লজিক প্রয়োগ করতে পারবেন, যেমন টোকেন যাচাই করা।
Authentication Middleware ব্যবহার করার উদাহরণ
Server-Side (Node.js)
const http = require('http');
const socketIo = require('socket.io');
const server = http.createServer((req, res) => {
res.end('Hello, Socket.IO with Authentication!');
});
const io = socketIo(server);
// Authentication Middleware
io.use((socket, next) => {
const token = socket.handshake.query.token; // token পাঠানো হতে পারে URL প্যারামিটার হিসেবে
if (token === 'valid_token') {
console.log('Authentication successful');
return next(); // Authentication successful, continue connection
}
console.log('Authentication failed');
return next(new Error('Authentication error')); // Authentication failed, reject connection
});
// Connection event
io.on('connection', (socket) => {
console.log('A user connected');
// ক্লায়েন্টকে একটি বার্তা পাঠানো
socket.emit('message', 'Welcome to the authenticated room!');
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});Client-Side (HTML + JavaScript)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Socket.IO Authentication Example</title>
<script src="https://cdn.socket.io/4.1.3/socket.io.min.js"></script>
<script>
const socket = io('http://localhost:3000', {
query: {
token: 'valid_token' // Authentication token পাঠানো হচ্ছে
}
});
socket.on('connect', () => {
console.log('Successfully connected!');
});
socket.on('message', (msg) => {
console.log('Received message:', msg);
});
socket.on('disconnect', () => {
console.log('Disconnected from server');
});
</script>
</head>
<body>
<h1>Socket.IO Authentication Example</h1>
</body>
</html>ব্যাখ্যা:
- Authentication Middleware:
- আমরা
io.use()মেথডে একটি middleware ব্যবহার করেছি যা ক্লায়েন্টেরhandshake.queryথেকেtokenগ্রহণ করে। - যদি
tokenসঠিক হয়, তবেnext()কল করা হয়, অর্থাৎ কানেকশন অনুমোদিত হয়। - যদি
tokenভুল হয়, তবে একটি Error ছুড়ে ফেলা হয়, যার মাধ্যমে ক্লায়েন্ট কানেক্ট হতে পারবে না।
- আমরা
- Client-Side:
- ক্লায়েন্ট যখন সার্ভারের সাথে কানেক্ট হয়, তখন URL প্যারামিটার হিসেবে একটি token পাঠানো হয়।
- যদি token সঠিক থাকে, তবে সার্ভার থেকে একটি "message" ইভেন্ট গ্রহন করা হয় এবং "Successfully connected!" মেসেজ প্রদর্শিত হয়।
- Socket Handshake:
- Socket.IO কানেকশনের সময়, handshake একটি অবজেক্ট হিসেবে কাজ করে যা ক্লায়েন্ট এবং সার্ভারের মধ্যে তথ্য বিনিময়ের সময় ব্যবহৃত হয়।
- এই handshake এর মধ্যে ক্লায়েন্টের query parameters, headers বা cookies সহ আরও কিছু তথ্য থাকে যা middleware এর মাধ্যমে যাচাই করা যায়।
Error Handling
যদি Authentication Middleware সফলভাবে ক্লায়েন্টকে অনুমোদিত না করে, তবে একটি Error ছোড়া হয়। এটি ব্যবহৃত হলে, ক্লায়েন্টকে কনসোলে একটি Error মেসেজ দেখানো যেতে পারে। ক্লায়েন্টে এই Error ম্যানেজ করার জন্য একটি কাস্টম error event হ্যান্ডলিং যুক্ত করা যেতে পারে।
Client-Side Error Handling
socket.on('connect_error', (err) => {
console.log('Connection Error:', err.message);
});এখানে, যদি ক্লায়েন্ট সার্ভারে কানেক্ট হতে না পারে (যেমন ভুল token), তবে connect_error ইভেন্টের মাধ্যমে "Authentication error" মেসেজ গ্রহন করবে।
Additional Security Measures:
- JWT (JSON Web Token): প্রোডাকশন পরিবেশে, টোকেন হিসেবে JWT (JSON Web Token) ব্যবহার করা আরও নিরাপদ হতে পারে। এটি সার্ভারে সেশন ব্যবস্থাপনার পরিবর্তে একটি সুরক্ষিত অথেনটিকেশন ব্যবস্থা সরবরাহ করে।
- HTTPS: সমস্ত Socket.IO কানেকশনকে নিরাপদ করতে HTTPS প্রটোকল ব্যবহার করুন, যাতে ডেটা ট্রান্সফারের সময় কোনো মিডলম্যান আক্রমণ না হয়।
সারসংক্ষেপ:
- Middleware ব্যবহার করে Socket.IO তে Authentication করা একটি সহজ এবং কার্যকর পদ্ধতি।
- Socket.IO middleware দ্বারা ক্লায়েন্টের অথেনটিকেশন যাচাই করা যায়, এবং query parameters, headers, বা cookies এর মাধ্যমে টোকেন যাচাই করা সম্ভব।
- এই পদ্ধতিটি নিরাপদভাবে রিয়েল-টাইম অ্যাপ্লিকেশনগুলির জন্য authentication নিশ্চিত করতে সহায়তা করে, যেখানে ব্যবহারকারীদের অনুমোদন দিয়ে অ্যাপ্লিকেশন অ্যাক্সেস করা হয়।
Authentication হল ব্যবহারকারীর পরিচয় যাচাই করার প্রক্রিয়া। এটি নিশ্চিত করে যে, একটি সিস্টেমে প্রবেশ করা ব্যক্তি আসলেই সেই ব্যক্তি, যিনি দাবি করছেন। Socket.IO ব্যবহারের সময়, সাধারণত ব্যবহারকারীর পরিচয় যাচাই করার জন্য Client-Side এবং Server-Side Authentication একত্রে ব্যবহৃত হয়।
নিচে একটি Socket.IO-এ Authentication এর উদাহরণ দেওয়া হলো, যেখানে ব্যবহারকারী একটি টোকেন বা কুকি দ্বারা লগইন করে এবং সার্ভার সেই টোকেন যাচাই করে।
Client-Side Authentication উদাহরণ
Client-Side Authentication-এ সাধারণত, ব্যবহারকারীকে একটি লগইন ফর্মের মাধ্যমে তার তথ্য (যেমন ইউজারনেম এবং পাসওয়ার্ড) প্রেরণ করতে হয়, এবং তারপর সেই তথ্যের ভিত্তিতে সার্ভার ব্যবহারকারীকে যাচাই করে।
Client-Side (HTML + JavaScript)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Socket.IO Authentication Example</title>
<script src="https://cdn.socket.io/4.1.3/socket.io.min.js"></script>
<script>
// সার্ভারে কানেক্ট করার জন্য socket.io ব্যবহার করা হচ্ছে
const socket = io('http://localhost:3000');
// লগইন টোকেন পাঠানো
function loginUser() {
const token = document.getElementById('token').value; // ইউজার থেকে টোকেন নেওয়া
socket.emit('authenticate', { token: token }); // সার্ভারে টোকেন পাঠানো
}
// সার্ভার থেকে নির্দিষ্ট উত্তর পাওয়া
socket.on('authenticated', () => {
console.log('User authenticated successfully');
document.getElementById('status').textContent = 'Authentication successful!';
});
socket.on('unauthorized', () => {
console.log('Authentication failed');
document.getElementById('status').textContent = 'Authentication failed!';
});
</script>
</head>
<body>
<h1>Socket.IO Authentication</h1>
<input type="text" id="token" placeholder="Enter authentication token">
<button onclick="loginUser()">Login</button>
<p id="status"></p>
</body>
</html>এখানে, ক্লায়েন্ট একটি টোকেন ইনপুট করে সার্ভারে পাঠায় এবং সার্ভার সেই টোকেন যাচাই করে, তারপরে ব্যবহারকারীকে অনুমতি বা নিষেধাজ্ঞা প্রদান করে।
Server-Side Authentication উদাহরণ
Server-Side Authentication-এ সার্ভার ইনকামিং কানেকশন বা ইভেন্টের সময় টোকেন যাচাই করে। যদি টোকেন সঠিক হয়, তাহলে সার্ভার ক্লায়েন্টকে "authenticated" ইভেন্ট পাঠিয়ে জানায়। আর যদি টোকেন ভুল হয়, তাহলে "unauthorized" ইভেন্ট পাঠায়।
Server-Side (Node.js with Socket.IO)
const http = require('http');
const socketIo = require('socket.io');
const server = http.createServer((req, res) => {
res.end('Hello, Socket.IO with Authentication!');
});
const io = socketIo(server);
// পণ্য টোকেন যাচাই করার জন্য একটি মক ফাংশন
function authenticateToken(token) {
const validTokens = ['valid_token_123', 'valid_token_456']; // এখানে আমরা একটি স্ট্যাটিক টোকেন ব্যবহার করছি
return validTokens.includes(token);
}
// ক্লায়েন্ট কানেক্ট হলে
io.on('connection', (socket) => {
console.log('A user connected');
// ক্লায়েন্ট থেকে টোকেন গ্রহণ করা
socket.on('authenticate', (data) => {
const { token } = data;
if (authenticateToken(token)) {
// যদি টোকেন সঠিক হয়, তাহলে ব্যবহারকারীকে অনুমতি দেওয়া হবে
socket.emit('authenticated');
} else {
// যদি টোকেন ভুল হয়, তাহলে unauthorized ইভেন্ট পাঠানো হবে
socket.emit('unauthorized');
}
});
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});এখানে, authenticateToken ফাংশনটি সার্ভারে ক্লায়েন্টের পাঠানো টোকেন যাচাই করে। যদি টোকেনটি বৈধ হয়, তবে সার্ভার ক্লায়েন্টকে authenticated ইভেন্ট পাঠায়, আর যদি টোকেনটি ভুল হয়, তবে unauthorized ইভেন্ট পাঠায়।
ব্যাখ্যা:
- Client-Side:
- ক্লায়েন্ট একটি টোকেন ইনপুট করে এবং এটি
socket.emit()মেথডের মাধ্যমে সার্ভারে পাঠায়। - সার্ভার থেকে যদি
authenticatedইভেন্ট পাওয়া যায়, তবে ক্লায়েন্ট নিশ্চিত হয় যে তার টোকেন বৈধ এবং সে সফলভাবে লগইন করেছে। - যদি সার্ভার থেকে
unauthorizedইভেন্ট পাওয়া যায়, তবে ক্লায়েন্ট জানবে যে তার টোকেন ভুল এবং লগইন ব্যর্থ হয়েছে।
- ক্লায়েন্ট একটি টোকেন ইনপুট করে এবং এটি
- Server-Side:
- সার্ভার
authenticateইভেন্ট গ্রহণ করে এবং ইনকামিং টোকেন যাচাই করে। যদি টোকেন সঠিক হয়, তবে সার্ভারauthenticatedইভেন্ট পাঠায়; অন্যথা,unauthorizedইভেন্ট পাঠায়।
- সার্ভার
সারাংশ:
- Client-Side Authentication: ক্লায়েন্টের দায়িত্ব হল ব্যবহারকারীর তথ্য (যেমন টোকেন) পাঠানো, এবং সার্ভার থেকে একটি সাড়া পাওয়ার মাধ্যমে জানা যে ব্যবহারকারী বৈধ কিনা।
- Server-Side Authentication: সার্ভারের দায়িত্ব হল পাঠানো টোকেন বা তথ্য যাচাই করা এবং যদি এটি সঠিক হয়, তবে ব্যবহারকারীকে অনুমোদন করা।
এই ধরনের authentication ব্যবস্থার মাধ্যমে আপনি Socket.IO অ্যাপ্লিকেশনগুলিতে ব্যবহারকারীদের নিরাপদভাবে যাচাই করতে পারেন এবং রিয়েল-টাইম যোগাযোগ সিস্টেমে তাদের অ্যাক্সেস কন্ট্রোল করতে পারেন।
Read more