PHP में JWT टोकन: पूर्ण कार्यान्वयन गाइड
JWT (JSON Web Token) एक ओपन स्टैंडर्ड (RFC 7519) है जो JSON-आधारित एक्सेस टोकन बनाने के लिए उपयोग होता है। PHP में JWT का व्यापक रूप से REST API, सिंगल-पेज एप्लिकेशन (SPA) और माइक्रोसर्विसेज में स्टेटलेस ऑथेंटिकेशन (stateless authentication) लागू करने के लिए उपयोग किया जाता है।
इस लेख में हम विस्तार से जानेंगे कि PHP में JWT टोकन के साथ कैसे काम करें: लाइब्रेरी इंस्टॉल करने से लेकर टोकन बनाने, वेरिफाई करने और रिफ्रेश करने तक।
JWT क्या है और इसकी आवश्यकता क्यों है?
JWT तीन भागों से बना होता है, जो डॉट (.) से अलग होते हैं:
- Header (हेडर) — इसमें टोकन का प्रकार (JWT) और साइनिंग एल्गोरिदम (जैसे HS256 या RS256) होता है।
- Payload (पेलोड) — इसमें क्लेम्स (claims) होते हैं: यूज़र आईडी, भूमिका, जारी करने का समय (iat), समाप्ति तिथि (exp) और अन्य डेटा।
- Signature (सिग्नेचर) — हेडर और पेलोड को सीक्रेट की से हैश करके बनाया जाता है।
JWT के मुख्य लाभ:
- सर्वर पर सेशन स्टोर करने की आवश्यकता नहीं (stateless)।
- इसमें कोई भी डेटा (जैसे यूज़र की भूमिका) शामिल किया जा सकता है।
- विभिन्न डोमेन और मोबाइल ऐप के साथ काम करता है।
- डेटाबेस से क्वेरी किए बिना आसानी से वेरिफाई किया जा सकता है।
firebase/php-jwt लाइब्रेरी इंस्टॉल करना
PHP में JWT के साथ काम करने के लिए हम लोकप्रिय लाइब्रेरी firebase/php-jwt का उपयोग करेंगे। इसे Composer के माध्यम से इंस्टॉल करें:
composer require firebase/php-jwt
इंस्टॉल करने के बाद, प्रोजेक्ट में Composer ऑटोलोड शामिल करें:
require_once 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
JWT टोकन बनाना
टोकन बनाने के लिए एक सीक्रेट की ($secretKey) परिभाषित करें और पेलोड तैयार करें। उदाहरण:
use Firebase\JWT\JWT;
$secretKey = 'your-256-bit-secret-key-here';
$issuedAt = time();
$expirationTime = $issuedAt + 3600; // टोकन 1 घंटे के लिए वैध
$payload = [
'iss' => 'pythonlib.ru', // जारीकर्ता
'iat' => $issuedAt, // जारी करने का समय
'exp' => $expirationTime, // समाप्ति तिथि
'sub' => 123, // यूज़र आईडी
'role' => 'admin' // कस्टम डेटा
];
$jwt = JWT::encode($payload, $secretKey, 'HS256');
echo $jwt;
परिणामस्वरूप एक स्ट्रिंग मिलेगी जैसे: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJweXRob25saWIucnUiLCJpYXQiOjE3Mjg0MDAwMDAsImV4cCI6MTcyODQwMzYwMCwic3ViIjoxMjMsInJvbGUiOiJhZG1pbiJ9.signature
JWT की जाँच और डिकोडिंग
क्लाइंट से टोकन प्राप्त करने पर (जैसे Authorization: Bearer <token> हेडर से), इसे वेरिफाई करना आवश्यक है:
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$secretKey = 'your-256-bit-secret-key-here';
$jwt = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
try {
$decoded = JWT::decode($jwt, new Key($secretKey, 'HS256'));
$userId = $decoded->sub;
$role = $decoded->role;
echo "यूज़र #{$userId} भूमिका {$role} के साथ प्रमाणित है।";
} catch (\Exception $e) {
http_response_code(401);
echo "त्रुटि: " . $e->getMessage();
}
महत्वपूर्ण: लाइब्रेरी स्वचालित रूप से टोकन की समाप्ति तिथि (exp) और जारी करने का समय (iat) की जाँच करती है। यदि टोकन समाप्त हो गया है या अमान्य है, तो एक अपवाद (exception) फेंका जाएगा।
JWT रिफ्रेश करना (Refresh Token)
सुरक्षा बढ़ाने के लिए JWT को आमतौर पर अल्पकालिक (15-60 मिनट) बनाया जाता है। लंबे सेशन के लिए Refresh Token का उपयोग किया जाता है — यह एक अलग टोकन है जो डेटाबेस में संग्रहीत होता है और बिना दोबारा लॉगिन/पासवर्ड डाले नया Access Token प्राप्त करने की अनुमति देता है।
रिफ्रेश का उदाहरण:
function refreshAccessToken(string $refreshToken, string $secretKey): ?string {
// डेटाबेस में refresh token की जाँच करें (सरलीकृत तर्क)
// यदि मान्य है, तो नया Access Token बनाएं और लौटाएं
// अन्यथा null लौटाएं
}