RESTful API এর Authentication এবং Authorization
RESTful APIs হল এমন একটি Web API যা HTTP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা এক্সচেঞ্জ করার জন্য ডিজাইন করা হয়েছে। কিন্তু যখনই আপনি কোনো সিস্টেমে ডেটা পরিচালনা বা অ্যাক্সেস করবেন, তখন Authentication এবং Authorization বিষয় দুটি অত্যন্ত গুরুত্বপূর্ণ হয়ে ওঠে।
- Authentication: এটি নিশ্চিত করে যে যে ব্যক্তি বা অ্যাপ্লিকেশন সিস্টেমে প্রবেশ করছে, সে আসলেই সেই ব্যক্তি বা অ্যাপ্লিকেশন কিনা।
- Authorization: এটি নির্ধারণ করে যে একটি নির্দিষ্ট ইউজার বা অ্যাপ্লিকেশন কি ধরনের অ্যাক্সেস বা অনুমতি পাচ্ছে।
RESTful API তৈরি করতে হলে, বিশেষ করে যখন সিস্টেমে সুরক্ষা প্রয়োজন, তখন আপনি Authentication এবং Authorization সঠিকভাবে হ্যান্ডল করতে হবে।
Authentication: কীভাবে কাজ করে?
Authentication হচ্ছে একটি প্রক্রিয়া যার মাধ্যমে সার্ভার নিশ্চিত করে যে ক্লায়েন্ট আসলেই সেই ব্যক্তি বা অ্যাপ্লিকেশন কিনা। সাধারণত, এটি ইউজারনেম এবং পাসওয়ার্ড, API কীগুলি, অথবা টোকেন ব্যবহার করে করা হয়।
১. Basic Authentication
Basic Authentication একটি সহজ অথচ নিরাপত্তাহীন পদ্ধতি, যেখানে ইউজারনেম এবং পাসওয়ার্ড হেডারে পাঠানো হয়।
Request Example:
GET /protected-resource HTTP/1.1
Host: example.com
Authorization: Basic base64encodedusername:password
যদিও এটি সহজ, তবে এটি নিরাপদ নয় কারণ তথ্যটি সহজেই ডিকোড করা যায় এবং HTTPS ছাড়া ব্যবহৃত হলে Man-in-the-Middle আক্রমণের শিকার হতে পারে।
২. Bearer Token Authentication
Bearer Token Authentication বা Token-based Authentication একটি নিরাপদ পদ্ধতি যেখানে একটি Token ব্যবহার করে ক্লায়েন্ট সার্ভারের কাছে তার পরিচিতি প্রদান করে।
একটি Token সাধারণত JWT (JSON Web Token) এর মাধ্যমে সৃষ্ট হয়, এবং এই Token ব্যবহারকারীকে পরবর্তী রিকোয়েস্টগুলির জন্য পরিচয় প্রমাণ করতে সাহায্য করে।
Request Example:
GET /protected-resource HTTP/1.1
Host: example.com
Authorization: Bearer <JWT_TOKEN>
JWT (JSON Web Token) একটি ইন্টারনাল ডেটা যা ইউজার ইনফরমেশন এবং সার্ভারের জন্য নিশ্চিতকরণ প্রদান করে।
Authorization: কীভাবে কাজ করে?
Authorization হল সেই প্রক্রিয়া যা নির্ধারণ করে যে কোনো নির্দিষ্ট ইউজার বা অ্যাপ্লিকেশন কোন ডেটাতে বা সার্ভিসে অ্যাক্সেস করতে পারবে। এটি সাধারণত Role-based Access Control (RBAC) এর মাধ্যমে পরিচালিত হয়।
১. Role-based Access Control (RBAC)
RBAC হল একটি পদ্ধতি যেখানে ইউজারদের রোল এবং পারমিশন ভিত্তিক অ্যাক্সেস দেওয়া হয়। উদাহরণস্বরূপ, আপনি একটি অ্যাডমিন রোল তৈরি করতে পারেন যাদের সর্বোচ্চ অ্যাক্সেস থাকবে এবং একটি সাধারণ ইউজার রোল যাদের সীমিত অ্যাক্সেস থাকবে।
Example:
- Admin রোল: সকল ডেটাতে সম্পূর্ণ অ্যাক্সেস।
- User রোল: শুধুমাত্র তাদের নিজস্ব ডেটাতে অ্যাক্সেস।
২. Scopes and Permissions
Scopes হল API এর নির্দিষ্ট অংশ বা ফিচার যা ইউজারদের অ্যাক্সেস করার অনুমতি দেয়া হয়। উদাহরণস্বরূপ, একটি API ফাংশন যা শুধুমাত্র ইউজারদের অ্যাক্সেসের জন্য প্রযোজ্য, অন্য একটি API ফাংশন যা অ্যাডমিনদের জন্য।
Example:
read:user: ইউজারের ডেটা পড়ার অনুমতি।write:admin: অ্যাডমিনের ডেটা সম্পাদনা করার অনুমতি।
Authentication এবং Authorization এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Authentication | Authorization |
|---|---|---|
| বর্ণনা | এটি যাচাই করে যে ইউজার বা অ্যাপ্লিকেশন কে। | এটি যাচাই করে যে ইউজার বা অ্যাপ্লিকেশন কোন অ্যাক্সেস পাবে। |
| উদাহরণ | ইউজারনেম এবং পাসওয়ার্ড | রোল, পারমিশন বা স্কোপ |
| প্রক্রিয়া | ইউজারের পরিচয় যাচাই করা | ইউজারকে নির্দিষ্ট সম্পদ বা রিসোর্স অ্যাক্সেস করার অনুমতি দেওয়া |
| নিরাপত্তা | পাসওয়ার্ড বা টোকেনের মাধ্যমে | রোল এবং পারমিশন দ্বারা |
RESTful API এর Authentication এবং Authorization সেটআপ: একটি সাধারণ উদাহরণ
এখানে একটি সাধারণ Bearer Token Authentication এবং Role-based Authorization পদ্ধতি সেটআপের উদাহরণ দেয়া হলো, যেখানে JWT Token এবং RBAC ব্যবহৃত হয়েছে।
১. JWT Token Generation (Node.js Example)
const jwt = require('jsonwebtoken');
// ইউজারের তথ্য
const user = { id: 1, role: 'admin' };
// JWT টোকেন তৈরি করা
const token = jwt.sign(user, 'secretKey', { expiresIn: '1h' });
console.log(token);
এখানে, jwt.sign() ফাংশনটি একটি টোকেন তৈরি করছে যা ইউজারের role এবং id এর ভিত্তিতে একটি সিকিউর টোকেন তৈরি করবে।
২. JWT Token Validation (Express.js Example)
const jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
// Middleware for authentication
const authenticate = (req, res, next) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) return res.status(401).send('Access denied');
jwt.verify(token, 'secretKey', (err, user) => {
if (err) return res.status(403).send('Invalid token');
req.user = user;
next();
});
};
// Middleware for authorization (role-based)
const authorize = (role) => {
return (req, res, next) => {
if (req.user.role !== role) {
return res.status(403).send('Access denied: insufficient permissions');
}
next();
};
};
// Protected route
app.get('/admin', authenticate, authorize('admin'), (req, res) => {
res.send('Welcome Admin');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
এখানে, JWT Token Validation এবং Role-based Authorization ব্যবহৃত হয়েছে। authenticate middleware টোকেন যাচাই করে এবং authorize middleware নির্ধারণ করে যে ইউজারের role সঠিক কি না।
সারাংশ
Authentication এবং Authorization RESTful APIs এ সিকিউরিটি নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। Authentication যাচাই করে যে ইউজার কে, এবং Authorization নির্ধারণ করে ইউজার কী করতে পারবে। বিভিন্ন পদ্ধতির মাধ্যমে এই দুটি নিরাপত্তা প্রক্রিয়া সঠিকভাবে প্রয়োগ করা হয়, যেমন Bearer Token Authentication, JWT, এবং Role-based Authorization। এই সমস্ত পদ্ধতি ব্যবহার করে আপনি আপনার API সিকিউর করতে পারেন এবং প্রয়োজনীয় অনুমতি প্রদান করতে পারেন।
API Security এর গুরুত্ব
API Security হল একটি অপরিহার্য বিষয় যখন আপনি ওয়েব অ্যাপ্লিকেশন বা মোবাইল অ্যাপ্লিকেশন তৈরি করেন। ওয়েব সার্ভিস বা API (Application Programming Interface) দিয়ে অ্যাপ্লিকেশনগুলোর মধ্যে যোগাযোগ হয়, এবং যদি API নিরাপদ না থাকে, তবে এটি সাইবার আক্রমণকারীদের জন্য একটি সহজ টার্গেট হতে পারে। তাই API-এর সিকিউরিটি নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ।
API সিকিউরিটির মূল উদ্দেশ্য হল ডেটা প্রাইভেসি এবং ডেটা ইন্টিগ্রিটি নিশ্চিত করা, অর্থাৎ API এর মাধ্যমে যোগাযোগ করা ডেটা সঠিক ও নিরাপদ হতে হবে।
RESTful API Security কৌশল
RESTful API সিকিউরিটি নিশ্চিত করতে কিছু বিশেষ কৌশল এবং প্রযুক্তি রয়েছে, যেমন Authentication (সংশ্লিষ্ট ব্যক্তি নিশ্চিতকরণ), Authorization (কারণ যিনি অনুমতি দিয়েছেন তার সাথে মিলিয়ে এক্সেস দেয়া), Data Encryption (ডেটা এনক্রিপশন), এবং Rate Limiting (অতিরিক্ত রিকোয়েস্টের বিরুদ্ধে সীমাবদ্ধতা)।
১. Authentication এবং Authorization কৌশল
Authentication এবং Authorization হল API সিকিউরিটির অন্যতম প্রধান স্তম্ভ। এখানে ব্যাখ্যা করা হয়েছে কীভাবে এগুলো কাজ করে এবং API-র জন্য কীভাবে এগুলি প্রয়োগ করা যেতে পারে।
Authentication:
Authentication হল প্রক্রিয়া যার মাধ্যমে API-তে সংযুক্ত ব্যবহারকারীর পরিচয় নিশ্চিত করা হয়। এটি নিশ্চিত করে যে ব্যবহারকারী প্রকৃত ব্যবহারকারী কিনা।
এটি বিভিন্নভাবে করা যেতে পারে:
- Basic Authentication: এতে ব্যবহারকারী তার ব্যবহারকারীর নাম এবং পাসওয়ার্ডের মাধ্যমে API-তে প্রবেশ করে।
- Token-based Authentication: এখানে, ব্যবহারকারী লগইন করার পর একটি টোকেন প্রদান করা হয় যা পরবর্তী API রিকোয়েস্টের সাথে পাঠানো হয়। সবচেয়ে জনপ্রিয় JWT (JSON Web Tokens) ব্যবহার করা হয়।
JWT Authentication Example:
JWT এর মাধ্যমে, আপনি ব্যবহারকারীর লগইন হওয়ার পর একটি টোকেন তৈরি করে তাকে প্রদান করেন এবং পরবর্তীতে API রিকোয়েস্টের মাধ্যমে এই টোকেনটি ব্যবহার করে পরিচয় নিশ্চিত করা হয়।
// Server-side (Node.js example)
const jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
// Secret key
const secretKey = 'your-secret-key';
// Endpoint to authenticate and send token
app.post('/login', (req, res) => {
const username = req.body.username;
const password = req.body.password;
// Assume we validated username and password
const token = jwt.sign({ username: username }, secretKey, { expiresIn: '1h' });
res.json({ token: token });
});
// Middleware to verify the token
const verifyToken = (req, res, next) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('Token is required');
}
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
return res.status(500).send('Failed to authenticate token');
}
req.user = decoded;
next();
});
};
// Secured endpoint
app.get('/dashboard', verifyToken, (req, res) => {
res.send('Welcome to the dashboard!');
});
এখানে, ব্যবহারকারী যখন লগইন করে তখন একটি JWT টোকেন তৈরি করা হয় এবং পরবর্তীতে সেই টোকেন দিয়ে API রিকোয়েস্টগুলো অ্যাক্সেস করা যায়।
Authorization:
Authorization হল একটি প্রক্রিয়া যার মাধ্যমে একবার পরিচয় নিশ্চিত হওয়ার পর নির্ধারণ করা হয় যে ব্যবহারকারী কোন রিসোর্স অ্যাক্সেস করতে পারে। এটি নির্ধারণ করে, কোনো ব্যবহারকারী কোন তথ্য বা অ্যাকশন করতে পারবে।
Role-based Access Control (RBAC) বা Permission-based Access Control এর মাধ্যমে Authorization পরিচালিত হয়।
RBAC Example:
const verifyAdminRole = (req, res, next) => {
if (req.user.role !== 'admin') {
return res.status(403).send('Access denied');
}
next();
};
// Secured admin endpoint
app.get('/admin-dashboard', verifyToken, verifyAdminRole, (req, res) => {
res.send('Welcome to the admin dashboard!');
});
এখানে, verifyAdminRole মেথড ব্যবহারকারী যদি admin না হয় তবে রিকোয়েস্ট রিজেক্ট করবে।
২. Data Encryption (ডেটা এনক্রিপশন)
Data Encryption হল API এর মাধ্যমে প্রেরিত ডেটাকে এনক্রিপ্ট করা, যাতে আক্রমণকারীরা ডেটাকে হ্যাক করে পড়তে না পারে।
প্রধান দুটি এনক্রিপশন কৌশল হলো:
- TLS/SSL Encryption: এটি HTTP রিকোয়েস্ট এবং রেসপন্সের মধ্যে ডেটা এনক্রিপ্ট করার জন্য ব্যবহৃত হয়। এটি HTTPS প্রোটোকল হিসাবে পরিচিত এবং API এর মাধ্যমে ডেটা ট্রান্সফার নিরাপদ রাখে।
- Payload Encryption: API রিকোয়েস্টে বা রেসপন্সে পাঠানো ডেটাকে এনক্রিপ্ট করা।
HTTPS ব্যবহার করা:
API গুলিকে HTTPS প্রোটোকলের মাধ্যমে সংরক্ষণ করা খুবই গুরুত্বপূর্ণ, কারণ এটি end-to-end encryption প্রদান করে।
৩. Rate Limiting (রিকোয়েস্ট সীমাবদ্ধকরণ)
Rate Limiting হল একটি কৌশল যার মাধ্যমে প্রতিটি IP বা ইউজার এক দিনে বা এক ঘণ্টায় সর্বোচ্চ কতবার API রিকোয়েস্ট করতে পারবে তা নির্ধারণ করা হয়। এটি API-তে অতিরিক্ত রিকোয়েস্ট প্রতিরোধ করতে এবং Denial of Service (DoS) আক্রমণ প্রতিরোধ করতে সহায়তা করে।
Rate Limiting Example (Node.js):
const rateLimit = require('express-rate-limit');
// Define rate limiter
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // Limit each IP to 100 requests per window
message: 'Too many requests from this IP, please try again after 15 minutes',
});
// Apply to all routes
app.use(limiter);
এখানে, প্রতি ১৫ মিনিটে ১০০টি রিকোয়েস্ট সীমাবদ্ধ করা হয়েছে।
৪. API Gateway Security
API Gateway হল একটি সার্ভিস যা বিভিন্ন API রিকোয়েস্টকে পরিচালনা করে এবং নিরাপত্তা নিশ্চিত করার জন্য Authentication, Authorization, Rate Limiting, এবং Logging এর মতো বৈশিষ্ট্যগুলি প্রয়োগ করে।
একটি API Gateway API সিকিউরিটি নিশ্চিত করতে বিভিন্ন কৌশল ব্যবহার করে:
- Authentication: API Gateway ব্যবহারকারীর সঠিকতা যাচাই করে।
- Authorization: API Gateway ব্যবহারকারীকে অনুমতি দেয় নির্দিষ্ট রিসোর্স অ্যাক্সেস করার জন্য।
- Logging and Monitoring: API Gateway API রিকোয়েস্টের লগ রাখে এবং অনুপ্রবেশ শনাক্তকরণ প্রক্রিয়া চালায়।
৫. Security Best Practices
- Use HTTPS: API-তে HTTPS ব্যবহার করা উচিত, যাতে ট্রান্সমিশন চলাকালীন ডেটা সুরক্ষিত থাকে।
- Validate Inputs: ইনপুট যাচাই করা API সিকিউরিটির জন্য গুরুত্বপূর্ণ। ডেটা সঠিক এবং নিরাপদ কিনা তা নিশ্চিত করতে ইনপুট ভ্যালিডেশন করা উচিত।
- Use Strong Authentication Mechanisms: JWT, OAuth, এবং API কীগুলির মতো শক্তিশালী অথেন্টিকেশন ব্যবস্থার ব্যবহার করুন।
- Limit API Access: Role-based access control (RBAC) এবং permissions ব্যবহার করে API অ্যাক্সেস সীমিত করুন।
- Regularly Update Dependencies: আপনার API এবং লাইব্রেরির নিরাপত্তা প্যাচগুলি নিয়মিত আপডেট করুন।
সারাংশ
API সিকিউরিটি এবং অথেন্টিকেশন কৌশলগুলির মধ্যে Authentication এবং Authorization মূল ভূমিকা পালন করে। JWT এবং OAuth 2.0 এর মতো আধুনিক অথেন্টিকেশন প্রোটোকলগুলি ব্যবহার করা উচিত। Data Encryption ডেটা সুরক্ষিত রাখতে সাহায্য করে এবং Rate Limiting API-তে অতিরিক্ত রিকোয়েস্ট প্রতিরোধ করতে কার্যকর। API গেটওয়ে সিকিউরিটি এবং অন্যান্য সিকিউরিটি বেস্ট প্র্যাকটিসগুলির মাধ্যমে API এর সুরক্ষা আরও শক্তিশালী করা যেতে পারে।
RESTful Web Services: একটি পরিচিতি
REST (Representational State Transfer) হল একটি আর্কিটেকচারাল স্টাইল যা ওয়েব সার্ভিস ডিজাইনে ব্যবহৃত হয়। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে হালকা এবং স্কেলেবল যোগাযোগের জন্য ডিজাইন করা হয়েছে। RESTful সার্ভিসে HTTP এর বিভিন্ন মেথড (যেমন: GET, POST, PUT, DELETE) ব্যবহার করে ডেটা এক্সচেঞ্জ করা হয়।
একটি RESTful সার্ভিস সাধারণত ইউআরএল (URL) এর মাধ্যমে অ্যাক্সেস করা যায় এবং এটি বিভিন্ন অথেন্টিকেশন মেথড ব্যবহার করে নিরাপত্তা নিশ্চিত করে। এর মধ্যে Basic Authentication এবং Token-Based Authentication দুটি জনপ্রিয় অথেন্টিকেশন পদ্ধতি।
১. Basic Authentication
Basic Authentication হল একটি সাধারণ অথেন্টিকেশন মেকানিজম, যেখানে ইউজারের ইউজারনেম এবং পাসওয়ার্ড ব্যবহার করে তাদের পরিচয় যাচাই করা হয়। HTTP রিকোয়েস্টের Authorization হেডারে Base64 এনকোড করা ইউজারনেম এবং পাসওয়ার্ড পাঠানো হয়।
Basic Authentication এর সুবিধা:
- সহজ এবং দ্রুত সেটআপ
- সাধারণ প্রজেক্ট বা প্রোটোটাইপের জন্য উপযুক্ত
কীভাবে Basic Authentication কাজ করে:
- ক্লায়েন্ট একটি রিকোয়েস্ট পাঠায়, যাতে ইউজারনেম এবং পাসওয়ার্ড Base64 এনকোডেড আকারে পাঠানো হয়।
- সার্ভার ঐ তথ্য যাচাই করে এবং যদি সঠিক হয়, তবে অ্যাক্সেস প্রদান করা হয়।
- ক্লায়েন্ট প্রতিটি রিকোয়েস্টে তাদের ইউজারনেম এবং পাসওয়ার্ড অন্তর্ভুক্ত করে (যে পর্যন্ত সেশনটি শেষ না হয়)।
উদাহরণ:
Client-side (JavaScript example using fetch):
const username = "user";
const password = "password";
const headers = new Headers();
headers.set('Authorization', 'Basic ' + btoa(username + ':' + password));
fetch('https://api.example.com/data', {
method: 'GET',
headers: headers
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
এখানে, btoa() ফাংশনটি ইউজারনেম এবং পাসওয়ার্ডকে Base64 এনকোড করে এবং তা HTTP রিকোয়েস্টের Authorization হেডারে পাঠানো হয়।
২. Token-Based Authentication
Token-Based Authentication আধুনিক ওয়েব অ্যাপ্লিকেশনে খুবই জনপ্রিয়, যেখানে সিস্টেমে লগ ইন করার পর একটি Token (যেমন JWT - JSON Web Token) প্রদান করা হয়। এই টোকেন ব্যবহারকারীকে পরবর্তী রিকোয়েস্টে যাচাই করার জন্য ব্যবহার করা হয়। এই পদ্ধতি সাধারণত stateless authentication নামে পরিচিত, কারণ সার্ভার কোনও সেশন ডেটা রাখে না।
Token-Based Authentication এর সুবিধা:
- সেশন ম্যানেজমেন্টের প্রয়োজন নেই (stateless)
- নিরাপদ এবং স্কেলেবল
- মোবাইল অ্যাপ্লিকেশন বা ক্রস-প্ল্যাটফর্ম অ্যাপ্লিকেশনগুলির জন্য আদর্শ
কীভাবে Token-Based Authentication কাজ করে:
- ব্যবহারকারী প্রথমে ইউজারনেম এবং পাসওয়ার্ড দিয়ে লগ ইন করেন।
- সার্ভার ইউজার যাচাই করার পর একটি টোকেন তৈরি করে এবং ক্লায়েন্টে পাঠায়।
- ক্লায়েন্ট পরবর্তী সকল রিকোয়েস্টে এই টোকেনকে HTTP হেডারে প্রেরণ করে, যাতে সার্ভার ব্যবহারকারীকে যাচাই করতে পারে।
- সার্ভার টোকেন যাচাই করে এবং টোকেন সঠিক হলে রিকোয়েস্টটি প্রক্রিয়া করে।
উদাহরণ:
Client-side (JavaScript using fetch for Token Authentication):
const token = "your-jwt-token"; // JWT token from login
const headers = new Headers();
headers.set('Authorization', 'Bearer ' + token);
fetch('https://api.example.com/protected-data', {
method: 'GET',
headers: headers
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
এখানে, Authorization হেডারে Bearer শব্দটি যোগ করা হয় এবং এর সাথে JWT টোকেন প্রেরণ করা হয়।
JWT (JSON Web Token)
JWT একটি জনপ্রিয় টোকেন ফর্ম্যাট যা ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদ তথ্য আদান প্রদান করতে ব্যবহৃত হয়। এটি তিনটি অংশে বিভক্ত:
- Header: এটি টোকেনের ধরন এবং সাইনিং এলগরিদম উল্লেখ করে।
- Payload: এটি ইউজারের তথ্য ধারণ করে (যেমন ইউজার আইডি, রোল, এক্সপিরেশন টাইম)।
- Signature: এটি টোকেনের সুরক্ষা নিশ্চিত করতে একটি সিক্রেট কিবোর্ড বা কিপে সাইন করা হয়।
JWT উদাহরণ:
JWT Header এবং Payload:
{
"alg": "HS256",
"typ": "JWT"
}
JWT Payload:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
JWT Signature: Signature হল এক ধরনের সুরক্ষা কোড যা সার্ভার তৈরি করে এবং এটি যাচাই করতে ব্যবহৃত হয়।
বিভিন্ন Authentication পদ্ধতির তুলনা
| বৈশিষ্ট্য | Basic Authentication | Token-Based Authentication (JWT) |
|---|---|---|
| নিরাপত্তা | কম, কারণ ইউজারনেম এবং পাসওয়ার্ড প্রতি রিকোয়েস্টে পাঠাতে হয় | উচ্চ, কারণ টোকেন এনক্রিপ্ট করা এবং এটি এক্সপায়ার হতে পারে |
| স্টেটলেস | নয়, কারণ সার্ভার সেশন ম্যানেজ করে | হ্যাঁ, কারণ সার্ভার কোন সেশন রাখে না |
| রিসোর্স | সাধারণ অ্যাপ্লিকেশন ও প্রোটোটাইপের জন্য উপযুক্ত | বৃহত্তর, স্কেলেবল অ্যাপ্লিকেশনের জন্য উপযুক্ত |
| অপব্যবহার সম্ভাবনা | বেশি, যদি HTTP কানেকশন সুরক্ষিত না থাকে | কম, কারণ টোকেন সাধারণত সুরক্ষিত এবং সময়সীমা নির্ধারিত থাকে |
সারাংশ
Basic Authentication এবং Token-Based Authentication হল RESTful ওয়েব সার্ভিসে ব্যবহৃত দুটি জনপ্রিয় অথেন্টিকেশন পদ্ধতি। Basic Authentication সহজ এবং দ্রুত সেটআপ হলেও কম নিরাপদ এবং একাধিক রিকোয়েস্টে ইউজারনেম ও পাসওয়ার্ড পাঠানোর প্রয়োজন হয়। অপরদিকে, Token-Based Authentication অধিক নিরাপদ এবং স্কেলেবল, কারণ এটি JWT (JSON Web Token) এর মাধ্যমে স্টেটলেস অথেন্টিকেশন এবং সেশন ম্যানেজমেন্টের প্রয়োজনীয়তা কমায়। এটি আধুনিক ওয়েব অ্যাপ্লিকেশন এবং মোবাইল অ্যাপ্লিকেশনের জন্য আদর্শ।
OAuth 2.0: একটি পরিচিতি
OAuth 2.0 হল একটি ওপেন স্ট্যান্ডার্ড প্রোটোকল যা অ্যাপ্লিকেশনগুলিকে ব্যবহারকারীদের সংবেদনশীল তথ্য অ্যাক্সেস করার অনুমতি দেয়, কিন্তু ব্যবহারকারীর পাসওয়ার্ড সরাসরি প্রদান না করেই। এটি authentication এবং authorization প্রদান করে। OAuth 2.0 প্রোটোকল সাধারণত থার্ড-পার্টি অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত হয় যাতে তারা একজন ব্যবহারকারীর পাসওয়ার্ড ছাড়া অ্যাক্সেস টোকেনের মাধ্যমে নির্দিষ্ট তথ্য পেতে পারে।
OAuth 2.0 এর প্রধান উপাদান
OAuth 2.0 এর প্রক্রিয়া বিভিন্ন উপাদানের সমন্বয়ে কাজ করে:
- Client: যে অ্যাপ্লিকেশনটি অ্যাক্সেস টোকেনের মাধ্যমে API ব্যবহার করতে চায়।
- Authorization Server: এটি ব্যবহারকারীর পরিচয় যাচাই করে এবং অ্যাক্সেস টোকেন প্রদান করে।
- Resource Server: এটি ডেটাবেস বা তথ্যের উৎস, যেখানে রিকোয়েস্ট করা ডেটা সংরক্ষিত থাকে।
- User: যিনি অ্যাপ্লিকেশনে লগ ইন করে অ্যাক্সেস টোকেনের অনুমতি দেন।
OAuth 2.0 দুটি প্রধান ভূমিকা পালন করে:
- Authentication: এটি ব্যবহারকারীর পরিচয় যাচাই করে।
- Authorization: এটি ব্যবহারকারীর অনুমতি নিয়ে রিসোর্স অ্যাক্সেস করতে দেয়।
OAuth 2.0 Flow
OAuth 2.0 সাধারণত Authorization Code Flow ব্যবহার করে যেখানে প্রথমে ব্যবহারকারী একটি অ্যাপ্লিকেশনে লগ ইন করে, তারপর একটি authorization code প্রদান করা হয়। এরপর সেই authorization code ব্যবহার করে অ্যাক্সেস টোকেন এবং রিফ্রেশ টোকেন নেওয়া হয়।
OAuth 2.0 Flow:
- Authorization Request: ব্যবহারকারীকে একটি login page এ রিডিরেক্ট করা হয়।
- Authorization Grant: একবার লগ ইন করার পরে, ব্যবহারকারী অ্যাপ্লিকেশনকে অনুমতি দেয়।
- Access Token Request: authorization code দিয়ে অ্যাক্সেস টোকেন চাওয়া হয়।
- Access Token Response: অ্যাক্সেস টোকেন এবং রিফ্রেশ টোকেন প্রদান করা হয়।
- API Access: অ্যাপ্লিকেশন এখন API তে অ্যাক্সেস করতে পারে।
OAuth 2.0 Authentication Implementation
OAuth 2.0 Authentication ইমপ্লিমেন্ট করার জন্য কিছু প্রয়োজনীয় পদক্ষেপ আছে যা আমরা নিচে আলোচনা করব। সাধারণত, OAuth 2.0 পদ্ধতিতে ব্যবহারকারীকে সাইন ইন করার পর অ্যাপ্লিকেশন একটি Access Token পায়, যা API কলের জন্য প্রমাণীকরণ হিসেবে ব্যবহার করা হয়।
Step 1: OAuth 2.0 Authorization Server সেটআপ
প্রথমে, একটি OAuth 2.0 সার্ভার প্রয়োজন যা ব্যবহারকারীর অনুমতি গ্রহণ করবে এবং তাদের থেকে অ্যাক্সেস টোকেন প্রদান করবে। এই সার্ভার সাধারণত একটি Authorization Server হিসেবে কাজ করবে।
OAuth 2.0 সার্ভারের জন্য আপনি কিছু কমন টুলস যেমন Auth0, Keycloak, Okta, বা নিজস্ব সার্ভার সেটআপ করতে পারেন।
Step 2: Client অ্যাপ্লিকেশন তৈরি করা
OAuth 2.0 প্রোটোকল ব্যবহার করে একটি ক্লায়েন্ট অ্যাপ্লিকেশন তৈরি করতে হবে। এখানে একটি Node.js ক্লায়েন্ট অ্যাপ্লিকেশনের উদাহরণ দেওয়া হয়েছে যা OAuth 2.0 টোকেন রিভোক ও রিভাইজ করে।
ক্লায়েন্ট অ্যাপ্লিকেশন কোড (Node.js Example):
- প্রথমে NPM প্যাকেজ ইনস্টল করুন:
npm install express axios dotenv
- OAuth 2.0 Authorization Code Flow সেটআপ করা:
// app.js
const express = require('express');
const axios = require('axios');
const dotenv = require('dotenv');
dotenv.config();
const app = express();
// OAuth2.0 settings
const authServerUrl = "https://your-authorization-server.com";
const clientId = process.env.CLIENT_ID;
const clientSecret = process.env.CLIENT_SECRET;
const redirectUri = process.env.REDIRECT_URI;
// Step 1: Redirect to OAuth2 authorization page
app.get('/auth', (req, res) => {
const authorizationUrl = `${authServerUrl}/authorize?response_type=code&client_id=${clientId}&redirect_uri=${redirectUri}&scope=read`;
res.redirect(authorizationUrl);
});
// Step 2: Handle authorization callback and exchange code for access token
app.get('/callback', async (req, res) => {
const { code } = req.query;
try {
const response = await axios.post(`${authServerUrl}/token`, {
client_id: clientId,
client_secret: clientSecret,
code: code,
redirect_uri: redirectUri,
grant_type: 'authorization_code'
});
const { access_token, refresh_token } = response.data;
res.send(`Access Token: ${access_token}`);
} catch (error) {
res.status(500).send('Error while retrieving access token');
}
});
// Start the server
app.listen(3000, () => {
console.log('OAuth 2.0 client app running on http://localhost:3000');
});
এখানে, /auth রুটটি ব্যবহারকারীকে OAuth 2.0 সার্ভারে রিডিরেক্ট করে, এবং ব্যবহারকারী অনুমতি দিলে /callback রুটটি অ্যাক্সেস টোকেন গ্রহণ করে।
Step 3: API Access Using Access Token
একবার অ্যাক্সেস টোকেন পেলে, সেই টোকেনটি API কল করার জন্য ব্যবহার করা যাবে। সাধারণত, অ্যাক্সেস টোকেন হেডারে পাঠানো হয়।
// Step 3: Access API with the token
app.get('/profile', async (req, res) => {
const accessToken = 'YOUR_ACCESS_TOKEN'; // Get the token after authentication
try {
const response = await axios.get('https://api.example.com/profile', {
headers: {
Authorization: `Bearer ${accessToken}`
}
});
res.json(response.data);
} catch (error) {
res.status(500).send('Error accessing the API');
}
});
এখানে, Bearer token হেডারে অ্যাক্সেস টোকেন পাস করা হয়েছে, যা API অ্যাক্সেস করতে ব্যবহৃত হয়েছে।
OAuth 2.0 এর বিভিন্ন Flow
OAuth 2.0 প্রোটোকলের মধ্যে কয়েকটি ভিন্ন ধরনের Flow রয়েছে, যেমন:
- Authorization Code Flow: এটি সর্বাধিক ব্যবহৃত ফ্লো, যেখানে ব্যবহারকারী প্রথমে লগ ইন করে এবং অ্যাক্সেস কোডটি ব্যবহার করে অ্যাক্সেস টোকেন নেওয়া হয়।
- Implicit Flow: এটি ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয় (যেমন JavaScript অ্যাপ্লিকেশন)। এটি দ্রুত কিন্তু কম নিরাপদ।
- Client Credentials Flow: এটি সার্ভিস টু সার্ভিস প্রমাণীকরণের জন্য ব্যবহৃত হয়, যেখানে ব্যবহারকারী নেই, তবে অ্যাপ্লিকেশন নিজেই অ্যাক্সেস টোকেন পায়।
- Resource Owner Password Credentials Flow: এই ফ্লোতে ব্যবহারকারী সরাসরি তাদের পাসওয়ার্ড প্রদান করে অ্যাক্সেস টোকেন নেয়, তবে এটি বেশি নিরাপদ নয়।
সারাংশ
OAuth 2.0 একটি শক্তিশালী এবং নিরাপদ প্রোটোকল যা আধুনিক ওয়েব অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়, বিশেষ করে যখন আপনি থার্ড-পার্টি সিস্টেম থেকে নিরাপদে ডেটা অ্যাক্সেস করতে চান। OAuth 2.0 authentication ইমপ্লিমেন্ট করতে, প্রথমে আপনাকে একটি authorization server সেটআপ করতে হবে, তারপর ক্লায়েন্ট অ্যাপ্লিকেশন তৈরি করে ব্যবহারকারীর অনুমতি নিতে হবে এবং অ্যাক্সেস টোকেনের মাধ্যমে API অ্যাক্সেস করতে হবে। Authorization Code Flow হল সবচেয়ে নিরাপদ এবং ব্যবহৃত ফ্লো, তবে অন্য ফ্লোগুলোও নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ত হতে পারে।
Role-Based Access Control (RBAC) কি?
Role-Based Access Control (RBAC) হল একটি নিরাপত্তা পদ্ধতি যা ব্যবহারকারীদের নির্দিষ্ট ভূমিকা (role) অনুযায়ী তাদের অ্যাক্সেস অনুমতি নিয়ন্ত্রণ করে। এটি একটি জনপ্রিয় মডেল যা ব্যবহারকারীদের বিভিন্ন গ্রুপে ভাগ করে, এবং প্রতি গ্রুপের জন্য নির্দিষ্ট অনুমতি নির্ধারণ করে। RBAC এর মাধ্যমে সহজেই অ্যাপ্লিকেশন বা সিস্টেমে কনফিডেনশিয়াল ডেটা বা ফিচারের অ্যাক্সেস নিয়ন্ত্রণ করা যায়।
RBAC সাধারণত তিনটি প্রধান উপাদান নিয়ে গঠিত:
- Roles (ভূমিকা): ব্যবহারকারীকে যে ভূমিকা দেয়া হয়, যেমন অ্যাডমিন, ইউজার, ম্যানেজার ইত্যাদি।
- Permissions (অনুমতি): ভূমিকা অনুযায়ী ব্যবহারকারীকে কি অপারেশন (যেমন পড়া, লেখা, ডিলিট করা) করার অনুমতি দেয়া হয়েছে।
- Users (ব্যবহারকারী): সিস্টেমে নিবন্ধিত ব্যবহারকারী, যারা নির্দিষ্ট ভূমিকার অধিকারী।
RBAC এর মাধ্যমে Authorization কিভাবে কাজ করে?
Authorization হল সেই প্রক্রিয়া যার মাধ্যমে নির্ধারণ করা হয় যে একটি নির্দিষ্ট ব্যবহারকারী বা গ্রুপ কোন রিসোর্স বা ফিচারের অ্যাক্সেস করতে পারবে কি না। RBAC-এর মধ্যে Authorization ব্যবহৃত হয় ভূমিকা এবং অনুমতির মধ্যে সম্পর্ক স্থাপন করার জন্য।
এখানে, একটি ব্যবহারকারী যখন লগইন করবে, তখন তার ভূমিকাটি যাচাই করা হবে এবং ভূমিকাটি অনুযায়ী সে কী ধরনের অ্যাক্সেস পাবেন তা নির্ধারণ করা হবে। উদাহরণস্বরূপ:
- Admin: সমস্ত রিসোর্স এবং অপারেশন এক্সেস করতে পারবেন।
- User: শুধুমাত্র কিছু নির্দিষ্ট রিসোর্স বা অপারেশন এক্সেস করতে পারবেন।
- Guest: খুব সীমিত রিসোর্স এক্সেস করতে পারবেন।
RESTful Web Services-এ RBAC এবং Authorization প্রয়োগ করা
RESTful Web Services এ RBAC এবং Authorization ব্যবহারের জন্য সাধারণত JWT (JSON Web Token) বা OAuth এর মতো টোকেন বেসড অথেন্টিকেশন ব্যবহার করা হয়। এর মাধ্যমে প্রতিটি API কলের সাথে একটি টোকেন পাস করা হয়, যা ব্যবহারকারীর ভূমিকা এবং অনুমতি যাচাই করতে ব্যবহৃত হয়।
১. JWT (JSON Web Token) এবং RBAC
JWT হল একটি ওপেন স্ট্যান্ডার্ড যা তথ্য পরিবহন করতে ব্যবহৃত হয়। এটি প্রমাণীকরণ (authentication) এবং অনুমোদন (authorization) জন্য খুবই কার্যকরী। JWT-তে ব্যবহারকারীর ভূমিকা এবং অনুমতি তথ্য সংরক্ষিত থাকতে পারে, যা সিস্টেমের বিভিন্ন অংশে ব্যবহার করা হয়।
উদাহরণ: JWT-এ RBAC
- ব্যবহারকারী লগইন এবং JWT তৈরি করা: যখন ব্যবহারকারী লগইন করে, তখন তার Role সহ JWT তৈরি করা হয়, যা পরবর্তী API রিকোয়েস্টে পাঠানো হয়।
const jwt = require('jsonwebtoken');
function login(req, res) {
const user = { id: 1, username: 'john', role: 'admin' }; // ব্যবহারকারী ভূমিকা
const token = jwt.sign(user, 'your_secret_key', { expiresIn: '1h' });
res.json({ token });
}
- API Endpoint-এ Authorization চেক করা: API রিকোয়েস্টে JWT টোকেন পাঠানো হয় এবং টোকেনের ভিতরে থাকা role যাচাই করে যে ব্যবহারকারী সেই রিসোর্সে অ্যাক্সেস করতে পারবে কিনা।
const jwt = require('jsonwebtoken');
function authorizeRole(role) {
return function(req, res, next) {
const token = req.headers['authorization'];
if (!token) return res.status(403).send('Token required');
jwt.verify(token, 'your_secret_key', (err, decoded) => {
if (err) return res.status(403).send('Invalid token');
if (decoded.role !== role) {
return res.status(403).send('You do not have access to this resource');
}
req.user = decoded;
next();
});
};
}
// Admin-only route
app.get('/admin-dashboard', authorizeRole('admin'), (req, res) => {
res.send('Welcome to Admin Dashboard');
});
এখানে, authorizeRole('admin') হল একটি middleware যা শুধুমাত্র admin ভূমিকার ব্যবহারকারীকে অ্যাক্সেস দেয়। অন্যান্য ভূমিকা বা টোকেন ভুল হলে অ্যাক্সেস নিষিদ্ধ হয়।
২. OAuth এবং RBAC
OAuth হল একটি অথেন্টিকেশন এবং অথরাইজেশন প্রোটোকল যা তৃতীয় পক্ষের সিস্টেমে অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। RBAC-এর সাথে OAuth ব্যবহারের মাধ্যমে আপনি আরও শক্তিশালী নিরাপত্তা ব্যবস্থা গঠন করতে পারেন, যেখানে আপনার অ্যাপ্লিকেশনকে তৃতীয় পক্ষের সেবা বা অ্যাপ্লিকেশন (যেমন Google, Facebook) দিয়ে অ্যাক্সেস অনুমতি দেয়া হয় এবং অ্যাক্সেস টোকেনের ভিত্তিতে অ্যাক্সেস নিয়ন্ত্রণ করা হয়।
RBAC ব্যবহারের সুবিধা
- সিস্টেমের নিরাপত্তা উন্নত করে: RBAC ব্যবহার করার মাধ্যমে আপনি সিস্টেমের নিরাপত্তা নিশ্চিত করতে পারেন, কারণ এটি প্রতিটি ব্যবহারকারীর অ্যাক্সেস নিয়ন্ত্রণ করে।
- সহজ ভূমিকা ভিত্তিক নিয়ন্ত্রণ: এটি সহজেই পরিচালনা করা যায় কারণ আপনি শুধুমাত্র নির্দিষ্ট ভূমিকা সেট করে দেয়ার মাধ্যমে একাধিক ব্যবহারকারীর জন্য অনুমতি প্রদান করতে পারেন।
- ডেটার সুরক্ষা: RBAC এর মাধ্যমে আপনি ডেটাবেস এবং সিস্টেমের অন্যান্য সংবেদনশীল রিসোর্সগুলোর অ্যাক্সেস কেবলমাত্র নির্দিষ্ট ব্যবহারকারী বা গ্রুপের জন্য সীমাবদ্ধ রাখতে পারেন।
- স্কেলেবিলিটি: বড় সিস্টেমে, যেখানে হাজার হাজার ব্যবহারকারী এবং একাধিক ভুমিকা থাকতে পারে, RBAC আপনাকে সহজে ব্যবহারকারীর ভূমিকা নির্ধারণ এবং অনুমতি নিয়ন্ত্রণ করতে সাহায্য করে।
সারাংশ
Role-Based Access Control (RBAC) এবং Authorization হল নিরাপত্তার গুরুত্বপূর্ণ উপাদান যা RESTful Web Services-এ ব্যবহারকারীর অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। RBAC ব্যবহার করে আপনি ব্যবহারকারীদের ভূমিকা অনুযায়ী তাদের অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন এবং JWT বা OAuth ব্যবহারের মাধ্যমে তাদের অনুমতি যাচাই করতে পারেন। এটি নিরাপত্তা, স্কেলেবিলিটি এবং ব্যবস্থাপনা সহজ করে তোলে।
Read more