API Authentication এবং Rate Limiting হল দুটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য যা ওয়েব API এর নিরাপত্তা এবং পারফরম্যান্স বজায় রাখতে সাহায্য করে। Phalcon ফ্রেমওয়ার্ক এই দুটি ফিচারকে সহজ এবং কার্যকরীভাবে ইমপ্লিমেন্ট করতে সক্ষম, যা ডেভেলপারদের API সিকিউরিটি ও ব্যবহারের সীমাবদ্ধতা কার্যকরভাবে পরিচালনা করতে সাহায্য করে।
এই গাইডে, আমরা Phalcon এ API Authentication এবং Rate Limiting কিভাবে ইমপ্লিমেন্ট করতে পারি, তা নিয়ে বিস্তারিত আলোচনা করব।
API Authentication
API Authentication হলো প্রক্রিয়া যার মাধ্যমে একটি API রিকোয়েস্টের আসল ব্যবহারকারী বা অ্যাপ্লিকেশন চিহ্নিত করা হয়। API এর মাধ্যমে সাধারণত দুটি প্রধান ধরণের অটেনটিকেশন ব্যবহৃত হয়:
- Token-based Authentication (Bearer Token): এই ধরনের অটেনটিকেশন সাধারণত JWT (JSON Web Token) বা OAuth2 এর মাধ্যমে করা হয়, যেখানে ব্যবহারকারী লগইন হওয়ার পর একটি টোকেন প্রদান করা হয় এবং সেই টোকেন API রিকোয়েস্টের সাথে পাঠানো হয়।
- Basic Authentication: এটি ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে অটেনটিকেশন করতে ব্যবহৃত হয়। এই পদ্ধতিতে পাসওয়ার্ড সাধারণত HTTP হেডারে পাঠানো হয়।
1. Token-based Authentication (JWT)
Phalcon-এ JWT ভিত্তিক অটেনটিকেশন ইমপ্লিমেন্ট করার জন্য, আপনি JWT লাইব্রেরি ব্যবহার করতে পারেন এবং API রিকোয়েস্টে Authorization হেডারের মাধ্যমে টোকেন পাঠাতে পারেন।
JWT Authentication Example:
use Phalcon\Mvc\Controller;
use Firebase\JWT\JWT;
class AuthController extends Controller
{
public function loginAction()
{
$username = $this->request->getPost('username');
$password = $this->request->getPost('password');
// Validate username and password
if ($username == "user" && $password == "password") {
// Create JWT token
$payload = [
"iss" => "http://example.com", // Issuer
"aud" => "http://example.com", // Audience
"iat" => time(), // Issued at
"exp" => time() + 3600 // Expiry time (1 hour)
];
$key = "secret_key";
$jwt = JWT::encode($payload, $key);
// Return the token
return json_encode(["token" => $jwt]);
} else {
return json_encode(["error" => "Invalid credentials"]);
}
}
public function secureAction()
{
$authHeader = $this->request->getHeader('Authorization');
if (!$authHeader) {
return json_encode(["error" => "Authorization header missing"]);
}
$authHeaderParts = explode(' ', $authHeader);
$jwt = $authHeaderParts[1];
try {
$decoded = JWT::decode($jwt, "secret_key", ['HS256']);
return json_encode(["message" => "Access granted", "user" => $decoded]);
} catch (Exception $e) {
return json_encode(["error" => "Invalid or expired token"]);
}
}
}
এখানে, loginAction ইউজারনেম এবং পাসওয়ার্ড যাচাই করে JWT টোকেন তৈরি করছে এবং সেটি রিটার্ন করছে। পরে, secureAction রিকোয়েস্টের হেডারে টোকেন যাচাই করছে এবং ডেটা রিটার্ন করছে।
2. Basic Authentication
Basic Authentication ব্যবহার করলে ইউজারনেম এবং পাসওয়ার্ড HTTP হেডারে পাঠানো হয়।
Basic Authentication Example:
use Phalcon\Mvc\Controller;
class AuthController extends Controller
{
public function beforeExecuteRoute()
{
$authHeader = $this->request->getHeader('Authorization');
if ($authHeader) {
$authHeaderParts = explode(' ', $authHeader);
$credentials = base64_decode($authHeaderParts[1]);
list($username, $password) = explode(':', $credentials);
if ($username == "user" && $password == "password") {
return true;
}
}
$this->response->setStatusCode(401, "Unauthorized");
return false;
}
public function secureAction()
{
return "Access granted!";
}
}
এখানে, beforeExecuteRoute মেথডে Authorization হেডারের মাধ্যমে ইউজারের পাসওয়ার্ড যাচাই করা হয়েছে।
API Rate Limiting
Rate Limiting হল একটি পদ্ধতি যা API-তে আসা রিকোয়েস্টের সংখ্যা নির্দিষ্ট সময়ের মধ্যে সীমাবদ্ধ করে। এটি API-এর উপর অতিরিক্ত লোড পড়া থেকে রক্ষা করে এবং ডিডস (DDoS) আক্রমণের বিরুদ্ধে সুরক্ষা প্রদান করে। Phalcon-এ Rate Limiting ইমপ্লিমেন্ট করার জন্য আপনি Redis বা Memcached এর মত ইন-মেমরি স্টোরেজ ব্যবহার করতে পারেন।
Phalcon এ, Rate Limiting করতে Redis ব্যবহার করার উদাহরণ নিচে দেওয়া হলো।
Rate Limiting with Redis Example
use Phalcon\Mvc\Controller;
class ApiController extends Controller
{
public function beforeExecuteRoute()
{
$clientIp = $this->request->getClientAddress();
$rateLimitKey = "rate_limit:" . $clientIp;
// Get the current count from Redis
$currentCount = $this->redis->get($rateLimitKey);
if ($currentCount && $currentCount >= 100) {
// If the count exceeds 100 requests per minute, deny the request
$this->response->setStatusCode(429, "Too Many Requests");
return false;
}
// Increment the request count
if (!$currentCount) {
$this->redis->set($rateLimitKey, 1);
} else {
$this->redis->incr($rateLimitKey);
}
// Set an expiry time for the rate limit key (1 minute)
$this->redis->expire($rateLimitKey, 60);
}
public function getDataAction()
{
return "Here is your data!";
}
}
এখানে, আমরা Redis ব্যবহার করে রেট লিমিটিং ইমপ্লিমেন্ট করেছি, যেখানে প্রতিটি ক্লায়েন্ট আইপির জন্য ১ মিনিটে ১০০ রিকোয়েস্ট সীমিত করা হয়েছে। যদি রিকোয়েস্ট সংখ্যা ১০০ ছাড়িয়ে যায়, তাহলে 429 Too Many Requests রেসপন্স কোড রিটার্ন করা হবে।
সারাংশ
Phalcon ফ্রেমওয়ার্কে API Authentication এবং Rate Limiting ইমপ্লিমেন্ট করা অত্যন্ত সহজ এবং কার্যকর। JWT বা Basic Authentication ব্যবহার করে আপনি API রিকোয়েস্টে নিরাপত্তা যোগ করতে পারেন এবং Redis বা Memcached ব্যবহার করে Rate Limiting নিশ্চিত করতে পারেন। এর মাধ্যমে আপনার API নিরাপদ এবং স্কেলেবল হবে, এবং অতিরিক্ত রিকোয়েস্ট থেকে সুরক্ষিত থাকবে।
Read more