Symfony-তে API Authentication ব্যবস্থাপনা একটি গুরুত্বপূর্ণ বিষয়, বিশেষ করে যখন আপনি একটি ওয়েব অ্যাপ্লিকেশন বা মোবাইল অ্যাপ্লিকেশন তৈরি করছেন যা API এর মাধ্যমে ইন্টারঅ্যাক্ট করে। JWT (JSON Web Token) হলো API Authentication-এর জন্য একটি জনপ্রিয় এবং নিরাপদ পদ্ধতি, যা আপনাকে Stateless Authentication এর সুবিধা দেয়। এর মাধ্যমে ব্যবহারকারীদের API-তে নিরাপদভাবে লগ ইন করা এবং তাদের পরিচয় যাচাই করা সম্ভব।
Symfony-তে JWT Authentication সেটআপ করা সাধারণত LexikJWTAuthenticationBundle এর মাধ্যমে করা হয়, যা Symfony API Authentication-এর জন্য একটি সহজ সমাধান প্রদান করে।
এই গাইডে আমরা API Authentication এবং JWT কনফিগারেশন এবং সেটআপ করার পদ্ধতি বিস্তারিতভাবে দেখব।
JWT Authentication কী?
JWT (JSON Web Token) একটি স্টেটলেস অথেন্টিকেশন পদ্ধতি, যেখানে ব্যবহারকারীর লগ ইন করার পর একটি টোকেন তৈরি হয় এবং সেই টোকেনটি পরবর্তী API রিকোয়েস্টে পাঠানো হয়। JWT-তে সাধারণত তিনটি অংশ থাকে:
- Header: যেটি এন্ড এনকোডিং এবং সাইনিং অ্যালগোরিদম নির্দেশ করে।
- Payload: এটি ইউজারের তথ্য, যেমন ইউজার আইডি, রোল, অথবা অন্যান্য কাস্টম তথ্য ধারণ করে।
- Signature: এটি নিরাপত্তা নিশ্চিত করার জন্য হেডার এবং পে-লোডের সিগনেচার যা একটি গোপন কী দ্বারা সাইন করা হয়।
Symfony তে JWT Authentication সেটআপ
LexikJWTAuthenticationBundle একটি জনপ্রিয় এবং সহজ উপায় Symfony অ্যাপ্লিকেশনে JWT Authentication ইমপ্লিমেন্ট করার জন্য। এই বুন্ডলটি OAuth বা Basic Authentication এর বিকল্প হিসেবে JWT ব্যবহার করতে সাহায্য করে।
১. Composer দিয়ে LexikJWTAuthenticationBundle ইনস্টল করা
প্রথমে, আপনি LexikJWTAuthenticationBundle ইনস্টল করতে হবে।
composer require lexik/jwt-authentication-bundle
এটি JWT Authentication সিস্টেমের জন্য প্রয়োজনীয় সকল ডিপেন্ডেন্সি ইনস্টল করবে।
২. Symfony কনফিগারেশন
1. .env ফাইলে সিক্রেট কিপরিবর্তন করা
JWT-তে সিক্রেট কিকি ব্যবহৃত হয়, যা টোকেনের সাইনিং এবং যাচাই করার জন্য ব্যবহৃত হবে। .env ফাইলে আপনার JWT_SECRET_KEY সেট করুন।
# .env
JWT_SECRET_KEY=your_secret_key_here
এখানে your_secret_key_here এর পরিবর্তে আপনি একটি সিক্রেট কী ব্যবহার করবেন যা JWT টোকেন সাইন করতে ব্যবহৃত হবে।
2. Bundle কনফিগারেশন
এখন, config/packages/lexik_jwt_authentication.yaml ফাইলটি তৈরি করুন অথবা কনফিগারেশন সেট করুন।
# config/packages/lexik_jwt_authentication.yaml
lexik_jwt_authentication:
secret_key: '%env(JWT_SECRET_KEY)%'
public_key: '%env(JWT_PUBLIC_KEY)%'
private_key: '%env(JWT_PRIVATE_KEY)%'
pass_phrase: '%env(JWT_PASSPHRASE)%'
token_ttl: 3600 # Time to live for the JWT (in seconds)
token_ttl এর মাধ্যমে JWT টোকেনের মেয়াদ নির্ধারণ করা যায় (এখানে 1 ঘণ্টার জন্য সেট করা হয়েছে)।
৩. JWT-তে কাস্টম অথেন্টিকেশন ফিল্টার তৈরি করা
Security ফাইলে কনফিগারেশন করতে হবে, যেখানে API এর জন্য JWT Authentication ফিল্টারটি ব্যবহৃত হবে।
# config/packages/security.yaml
security:
firewalls:
api:
pattern: ^/api
lexik_jwt: ~
stateless: true
access_control:
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
এখানে:
pattern: কনফিগার করা হয়েছে যে/apiপাথে সকল রিকোয়েস্টের জন্য JWT Authentication প্রযোজ্য হবে।lexik_jwt: JWT Authentication কনফিগারেশন সেট করা হয়েছে।
৪. JWT টোকেন রিফ্রেশিং (অপশনাল)
JWT Token এর মেয়াদ শেষ হয়ে গেলে, ব্যবহারকারীকে আবার লগ ইন করতে হতে পারে। তবে, আপনি refresh token ব্যবহার করে এই সমস্যার সমাধান করতে পারেন, যেখানে একটি নির্দিষ্ট মেয়াদ পরবর্তী টোকেন রিফ্রেশ করা হবে।
API Authentication এবং JWT এর মাধ্যমে Authorization
JWT Authentication সফলভাবে সেটআপ হলে, আপনি Symfony Security এবং Access Control ব্যবহার করে অ্যাপ্লিকেশন বা API এর প্রতিটি অংশে নিরাপত্তা সেটআপ করতে পারবেন।
এন্ডপয়েন্টে JWT Authentication
এখন আপনার অ্যাপ্লিকেশনে, বিশেষ করে /api/login_check এন্ডপয়েন্টে JWT টোকেন জেনারেট করা হবে।
Login Controller (JWT Token Generation)
namespace App\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
class AuthController
{
private $jwtManager;
private $authenticationManager;
public function __construct(JWTTokenManagerInterface $jwtManager, AuthenticationManagerInterface $authenticationManager)
{
$this->jwtManager = $jwtManager;
$this->authenticationManager = $authenticationManager;
}
/**
* @Route("/api/login", name="api_login", methods={"POST"})
*/
public function login(Request $request): JsonResponse
{
// Validate username and password
// $username = $request->get('username');
// $password = $request->get('password');
// Authentication logic here, if valid return JWT Token
$user = $this->getUserFromUsernameAndPassword($username, $password); // Implement this method
$token = $this->jwtManager->create($user);
return new JsonResponse(['token' => $token]);
}
}
JWT Token সহ রিকোয়েস্ট পাঠানো
আপনি JWT টোকেন ব্যবহারকারীকে প্রদান করার পর, পরবর্তী রিকোয়েস্টগুলোতে এই টোকেন ব্যবহার করতে হবে। এখানে একটি উদাহরণ দেওয়া হলো:
curl -X POST -H "Authorization: Bearer YOUR_JWT_TOKEN" http://localhost/api/some-endpoint
এখানে YOUR_JWT_TOKEN এর জায়গায় ব্যবহারকারীকে যে JWT টোকেন প্রদান করা হয়েছে সেটি বসানো হবে।
JWT Authentication এর সুবিধা
- Stateless Authentication:
JWT একটি Stateless Authentication ব্যবস্থা, যা সার্ভারে কোনো সেশন সংরক্ষণ করার প্রয়োজন নেই। সমস্ত তথ্য টোকেনের মধ্যে সংরক্ষিত থাকে। - Scalable:
যেহেতু JWT টোকেন স্টেটলেস, তাই আপনি একাধিক সার্ভারে API পরিচালনা করতে পারেন, এবং প্রতিটি সার্ভার আলাদাভাবে ব্যবহারকারীকে ভেরিফাই করতে পারবে। - Cross-platform Support:
JWT সহজে ওয়েব এবং মোবাইল অ্যাপ্লিকেশনগুলির মধ্যে সুরক্ষিত যোগাযোগে ব্যবহার করা যায়।
সারাংশ
Symfony-তে API Authentication এবং JWT ব্যবহার করে আপনি নিরাপদ এবং Stateless Authentication ব্যবস্থা তৈরি করতে পারেন। LexikJWTAuthenticationBundle ব্যবহারের মাধ্যমে সহজেই JWT টোকেন জেনারেট করা এবং API রিকোয়েস্টের মাধ্যমে ইউজার অথেন্টিকেশন এবং অথোরাইজেশন পরিচালনা করা যায়। এটি একটি অত্যন্ত শক্তিশালী এবং নিরাপদ পদ্ধতি, যা আধুনিক ওয়েব অ্যাপ্লিকেশন এবং মোবাইল অ্যাপ্লিকেশনগুলিতে ব্যাপকভাবে ব্যবহৃত হয়।