परिचय
\nआधुनिक वेब डेवलपमेंट सुरक्षित प्रमाणीकरण और प्राधिकरण के बिना अधूरा है। दो सबसे लोकप्रिय मानक — OAuth 2.0 और JWT (JSON Web Tokens) — उद्योग में डी-फैक्टो समाधान बन चुके हैं। यदि आप Rust में कोड लिखते हैं, तो आप भाग्यशाली हैं: यह भाषा न केवल उच्चतम प्रदर्शन प्रदान करती है, बल्कि इन प्रोटोकॉल को लागू करने के लिए शक्तिशाली लाइब्रेरी भी देती है।
\nइस लेख में, हम समझेंगे कि OAuth 2.0 और JWT क्या हैं, वे एक साथ कैसे काम करते हैं, और Rust में actix-web फ्रेमवर्क और jsonwebtoken क्रेट का उपयोग करके एक सरल लेकिन कार्यशील प्राधिकरण उदाहरण लिखेंगे। यह लेख शुरुआती लोगों के लिए है, इसलिए हम सिद्धांत से कोड तक कदम-दर-कदम आगे बढ़ेंगे।
OAuth 2.0 और JWT क्या हैं?
\nकोड लिखने से पहले, अवधारणाओं को समझना महत्वपूर्ण है। OAuth 2.0 एक प्राधिकरण प्रोटोकॉल है जो एप्लिकेशन को उपयोगकर्ता का पासवर्ड दिए बिना उसके संसाधनों तक सीमित पहुंच प्राप्त करने की अनुमति देता है। इसका उपयोग तब किया जाता है जब आप Google, GitHub या VK के माध्यम से किसी साइट पर लॉग इन करते हैं।
\nJWT एक टोकन प्रारूप (JSON Object Signing and Encryption) है जिसमें उपयोगकर्ता के बारे में दावे (claims) होते हैं। टोकन सर्वर द्वारा हस्ताक्षरित होता है, इसलिए क्लाइंट इसे नकली नहीं बना सकता। OAuth 2.0 के संदर्भ में, JWT का उपयोग अक्सर एक्सेस टोकन के रूप में किया जाता है।
\nसामान्य परिदृश्य: उपयोगकर्ता अपना लॉगिन और पासवर्ड दर्ज करता है, सर्वर उन्हें सत्यापित करता है, एक JWT टोकन उत्पन्न करता है और इसे क्लाइंट को लौटाता है। क्लाइंट प्रत्येक अनुरोध पर इस टोकन को Authorization: Bearer <token> हेडर में भेजता है। सर्वर हस्ताक्षर सत्यापित करता है और उपयोगकर्ता डेटा निकालता है।
Rust में प्रोजेक्ट सेटअप
\nएक नया प्रोजेक्ट बनाएं:
\ncargo new rust_oauth_jwt\ncd rust_oauth_jwt\nCargo.toml में आवश्यक डिपेंडेंसी जोड़ें:
[dependencies]\nactix-web = "4"\nactix-rt = "2"\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\njsonwebtoken = "9"\nchrono = { version = "0.4", features = ["serde"] }\ndotenv = "0.15"\nenv_logger = "0.11"\nlog = "0.4"\nप्रोजेक्ट की रूट में सीक्रेट की स्टोर करने के लिए .env फ़ाइल बनाएं:
JWT_SECRET=my_super_secret_key_change_in_production\nJWT_EXPIRATION_HOURS=24\nmain.rs में एनवायरनमेंट वेरिएबल लोड करें:
use dotenv::dotenv;\nuse std::env;\n\nfn main() {\n dotenv().ok();\n env_logger::init();\n // ... बाकी कोड\n}\n\nउपयोगकर्ता संरचना और JWT टोकन बनाना
\nपहले उपयोगकर्ता मॉडल और JWT के लिए claims संरचना परिभाषित करें। models.rs फ़ाइल बनाएं:
use serde::{Deserialize, Serialize};\n\n#[derive(Debug, Serialize, Deserialize, Clone)]\npub struct User {\n pub id: i32,\n pub username: String,\n pub password_hash: String, // वास्तविक प्रोजेक्ट में पासवर्ड नहीं, बल्कि हैश स्टोर करें!\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub struct Claims {\n pub sub: String, // subject (user id)\n pub username: String,\n pub exp: usize, // expiration timestamp\n}\nअब jwt_utils.rs में JWT के लिए यूटिलिटी बनाएं:
use chrono::{Duration, Utc};\nuse jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation};\nuse crate::models::Claims;\n\npub fn create_jwt(user_id: &str, username: &str) -> Result<String, jsonwebtoken::errors::Error> {\n let secret = std::env::var("JWT_SECRET").expect("JWT_SECRET must be set");\n let expiration_hours: i64 = std::env::var("JWT_EXPIRATION_HOURS")\n .unwrap_or_else(|_| "24".to_string())\n .parse()\n .unwrap();\n\n let expiration = Utc::now()\n .checked_add_signed(Duration::hours(expiration_hours))\n .expect("valid timestamp")\n .timestamp() as usize;\n\n let claims = Claims {\n sub: user_id.to_owned(),\n username: username.to_owned(),\n