CakePHP 4.x থেকে Authentication এবং Authorization ব্যবস্থাপনা অনেক সহজ এবং শক্তিশালী করা হয়েছে, এবং এটি API ভিত্তিক অ্যাপ্লিকেশনের জন্য বিশেষভাবে উপযোগী। এখানে আমরা CakePHP তে Authentication এবং Authorization সেটআপ করার প্রক্রিয়া এবং API এর মাধ্যমে এই দুটি কিভাবে কার্যকরভাবে ব্যবহার করা যায় তা দেখব।
Authentication in CakePHP API
Authentication হল একটি প্রক্রিয়া যা ব্যবহারকারীর পরিচয় যাচাই করে। এটি নিশ্চিত করে যে শুধুমাত্র বৈধ ব্যবহারকারী আপনার অ্যাপ্লিকেশন ব্যবহার করতে পারে। CakePHP তে, Authentication প্লাগইন দিয়ে API ভিত্তিক অ্যাপ্লিকেশনে খুব সহজে ব্যবহারকারীদের লগইন এবং সেশন পরিচালনা করা যায়।
১. Authentication কম্পোনেন্ট ইনস্টল এবং কনফিগারেশন
প্রথমে, CakePHP অ্যাপ্লিকেশনে Authentication প্লাগইন ইনস্টল করতে হবে। এটি Composer এর মাধ্যমে ইনস্টল করা যায়।
composer require cakephp/authentication
এরপর, AppController.php ফাইলে Authentication কম্পোনেন্ট লোড করুন।
// src/Controller/AppController.php
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller
{
public function initialize(): void
{
parent::initialize();
// Authentication কম্পোনেন্ট লোড করা
$this->loadComponent('Authentication.Authentication');
}
}
২. Authentication সেটআপ
API এর জন্য সাধারণত Token-based Authentication বা Session-based Authentication ব্যবহৃত হয়। এখানে আমরা একটি সাধারন Token-based Authentication দেখাবো।
Token-based Authentication
আপনি API তে ব্যবহারকারীর লগইন এবং টোকেন প্রজন্ম করতে চাইলে JWT (JSON Web Tokens) ব্যবহার করতে পারেন। প্রথমে, CakePHP তে JWT প্লাগইন ইনস্টল করুন।
composer require cakephp/jwt-auth
এরপর, AppController.php এ JWT Authentication সেটআপ করুন:
// src/Controller/AppController.php
namespace App\Controller;
use Cake\Controller\Controller;
use Cake\Http\Exception\UnauthorizedException;
class AppController extends Controller
{
public function initialize(): void
{
parent::initialize();
// Authentication কম্পোনেন্ট লোড করা
$this->loadComponent('Authentication.Authentication', [
'unauthorizedRedirect' => false,
'queryParam' => 'token', // API এ টোকেন পাঠানোর জন্য
'headers' => ['Authorization' => 'Bearer'],
]);
}
// JWT Authentication এর জন্য custom method
public function isAuthorized($user)
{
// এখানে ইউজারের রোল বা অনুমতি চেক করা যাবে
return true; // এখানে সকল ব্যবহারকারীকে অনুমতি দেওয়া হয়েছে
}
}
এখানে, আমরা Authentication কম্পোনেন্টে JWT টোকেন চেক করতে বলেছি এবং Authorization হেডারের মাধ্যমে টোকেন পাস করার জন্য Bearer ব্যবহৃত হয়েছে।
৩. API Login এবং Token Generation
এখন আমরা একটি Login API তৈরি করব যা ব্যবহারকারীর ইউজারনেম এবং পাসওয়ার্ড যাচাই করবে এবং একটি টোকেন প্রদান করবে।
// src/Controller/UsersController.php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Http\Exception\UnauthorizedException;
use Cake\Event\EventInterface;
class UsersController extends AppController
{
public function login()
{
$this->request->allowMethod(['post']); // শুধুমাত্র POST রিকোয়েস্ট গ্রহণ
$user = $this->Authentication->getResult()->getData();
if (!$user) {
throw new UnauthorizedException('Invalid login credentials');
}
$this->loadComponent('JwtAuth'); // JWT Auth কম্পোনেন্ট লোড
$token = $this->JwtAuth->generateToken($user);
$this->set([
'token' => $token,
'_serialize' => ['token']
]);
}
}
এখানে, login() ফাংশনে ইউজার নাম এবং পাসওয়ার্ড যাচাই করা হয় এবং সঠিক হলে JWT টোকেন প্রদান করা হয়।
Authorization in CakePHP API
Authorization হল একটি প্রক্রিয়া যা যাচাই করে যে, ইউজার অ্যাপ্লিকেশনের নির্দিষ্ট অ্যাকশন বা রিসোর্স অ্যাক্সেস করতে পারে কি না। CakePHP তে, Authorization সিস্টেমটি ইউজারের রোল এবং পারমিশন চেক করার জন্য ব্যবহৃত হয়।
১. Authorization কম্পোনেন্ট ইনস্টল এবং কনফিগারেশন
CakePHP তে Authorization প্লাগইন ইনস্টল করতে হবে:
composer require cakephp/authorization
এরপর, AppController.php ফাইলে Authorization কম্পোনেন্ট লোড করুন:
// src/Controller/AppController.php
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller
{
public function initialize(): void
{
parent::initialize();
// Authentication এবং Authorization কম্পোনেন্ট লোড করা
$this->loadComponent('Authentication.Authentication');
$this->loadComponent('Authorization.Authorization');
}
}
২. Authorization এর জন্য কাস্টম পলিসি তৈরি
CakePHP তে Authorization ব্যবহারের জন্য পলিসি ব্যবহার করা হয়। আমরা একটি কাস্টম পলিসি তৈরি করব, যা ইউজারের রোল অনুযায়ী অনুমতি প্রদান করবে।
// src/Policy/UserPolicy.php
namespace App\Policy;
use App\Model\Entity\User;
use Authorization\Policy\ContextInterface;
class UserPolicy
{
public function canView(User $user, ContextInterface $context)
{
// শুধুমাত্র অ্যাডমিন রোলের ব্যবহারকারীরা ইউজার দেখতে পারবে
return $user->role === 'admin';
}
}
এখানে, canView() ফাংশন ব্যবহারকারীকে দেখতে পারবে কিনা তা যাচাই করে।
৩. Authorization চেক করা
অথরাইজেশন চেক করার জন্য, কন্ট্রোলারে Authorization কম্পোনেন্ট ব্যবহার করা হয়।
// src/Controller/UsersController.php
namespace App\Controller;
use App\Controller\AppController;
use Authorization\AuthorizationServiceInterface;
class UsersController extends AppController
{
public function view($id)
{
$user = $this->Users->get($id);
// Authorization চেক করা
$this->Authorization->authorize($user);
$this->set('user', $user);
}
}
এখানে, authorize() মেথড ব্যবহার করে ইউজারের অনুমতি চেক করা হচ্ছে। যদি ইউজার অনুমোদিত না হয়, তাহলে একটি ForbiddenException ছোড়া হবে।
API Authentication এবং Authorization এর জন্য Best Practices
- Token-based Authentication: API গুলির জন্য JWT ব্যবহার করা সবচেয়ে জনপ্রিয় এবং সুরক্ষিত উপায়। এটি স্ট্যাটলেস এবং স্কেলেবল।
- HTTPS ব্যবহার করুন: API এ সব ধরনের সুরক্ষা নিশ্চিত করতে HTTPS ব্যবহার করা উচিত।
- Token Expiry: JWT টোকেনের মেয়াদ সীমিত করুন, এবং সেশন টোকেন ব্যবহারের ক্ষেত্রে একটি দীর্ঘ মেয়াদ নিশ্চিত করুন।
- Role-based Authorization: ইউজারদের রোল অনুসারে অনুমতি প্রদান করুন এবং কাস্টম পলিসি ব্যবহার করে অ্যাক্সেস কন্ট্রোল করুন।
- Rate Limiting: অতিরিক্ত রিকোয়েস্টের বিরুদ্ধে সুরক্ষিত থাকতে রেট লিমিটিং প্রয়োগ করুন।
উপসংহার
CakePHP তে Authentication এবং Authorization ব্যবস্থাপনা API ভিত্তিক অ্যাপ্লিকেশন তৈরির জন্য অত্যন্ত গুরুত্বপূর্ণ। Authentication ব্যবহারকারীর লগইন এবং সেশন যাচাই করে, এবং Authorization ইউজারের রোল এবং পারমিশন চেক করে তাদের অ্যাক্সেস নিয়ন্ত্রণ করে। JWT টোকেন ব্যবহারের মাধ্যমে API তে Token-based Authentication খুবই কার্যকরী। এই দুটি কম্পোনেন্টের সমন্বয়ে একটি সুরক্ষিত এবং শক্তিশালী API তৈরি করা সম্ভব।