परिचय: Rust में प्राधिकरण की आवश्यकता क्यों है?
\nआधुनिक वेब एप्लिकेशन शायद ही कभी प्रमाणीकरण और प्राधिकरण प्रणाली के बिना काम करते हैं। Rust, अपने प्रदर्शन और मेमोरी सुरक्षा के कारण, उच्च-लोड सेवाओं के निर्माण के लिए एक लोकप्रिय विकल्प बन रहा है। हालांकि, OAuth 2.0 जैसे प्रोटोकॉल और JWT प्रारूप के साथ काम करना शुरुआती लोगों के लिए जटिल लग सकता है।
\nइस लेख में, हम OAuth 2.0 और JWT (JSON Web Token) की बुनियादी अवधारणाओं को समझेंगे और लोकप्रिय क्रेट्स का उपयोग करके Rust में एक सरल प्राधिकरण प्रणाली लागू करेंगे। आप सीखेंगे कि अपने API एंडपॉइंट्स को कैसे सुरक्षित करें और एक्सेस टोकन के साथ कैसे काम करें।
\n\nOAuth 2.0 और JWT क्या हैं?
\nकोड लिखने से पहले, सिद्धांत को समझना महत्वपूर्ण है।
\n\nOAuth 2.0: प्रतिनिधि पहुंच प्रोटोकॉल
\nOAuth 2.0 एक प्रोटोकॉल है जो किसी एप्लिकेशन को उपयोगकर्ता के लॉगिन और पासवर्ड को स्थानांतरित किए बिना उसके संसाधनों तक सीमित पहुंच प्राप्त करने की अनुमति देता है। कल्पना करें कि आप Google या GitHub के माध्यम से किसी साइट पर लॉग इन करना चाहते हैं - यही OAuth 2.0 है।
\nप्रोटोकॉल के मुख्य भागीदार:
\n- \n
- Resource Owner — उपयोगकर्ता, जो डेटा का मालिक है। \n
- Client — आपका Rust एप्लिकेशन, जो पहुंच प्राप्त करना चाहता है। \n
- Authorization Server — सर्वर जो टोकन जारी करता है (जैसे, Google)। \n
- Resource Server — API, जो डेटा प्रदान करता है (जैसे, Google Drive)। \n
JWT: टोकन का कॉम्पैक्ट प्रारूप
\nJWT (JSON Web Token) एक्सेस टोकन बनाने के लिए एक खुला मानक है। टोकन में तीन भाग होते हैं, जो बिंदुओं से अलग होते हैं:
\n- \n
- Header — टोकन का प्रकार और हस्ताक्षर एल्गोरिदम। \n
- Payload — डेटा (claims), जैसे, उपयोगकर्ता ID या भूमिका। \n
- Signature — हस्ताक्षर, जो गारंटी देता है कि टोकन बदला नहीं गया है। \n
JWT का उदाहरण: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNrxP0G7n9G4W7N8Y7J8
JWT सुविधाजनक है क्योंकि इसे सर्वर पर सत्र संग्रहीत करने की आवश्यकता नहीं है - सभी जानकारी पहले से ही टोकन में एन्कोडेड है।
\n\nप्राधिकरण के लिए Rust प्रोजेक्ट सेटअप
\nहम Actix Web फ्रेमवर्क और कई सहायक क्रेट्स का उपयोग करेंगे। एक नया प्रोजेक्ट बनाएं:
\ncargo new rust-auth-example\ncd rust-auth-example\n\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.10"\nbcrypt = "0.15"\n\nफ़ाइल संरचना
\nसुविधा के लिए, हम एक मॉड्यूलर संरचना बनाएंगे:
\nsrc/\n├── main.rs\n├── auth.rs\n├── models.rs\n└── handlers.rs\n\n.env में JWT के लिए गुप्त कुंजी लिखें:
JWT_SECRET=supersecretkey12345\nDATABASE_URL=sqlite://users.db\n\nRust में JWT का कार्यान्वयन: जनरेशन से सत्यापन तक
\nचलिए auth.rs मॉड्यूल से शुरू करते हैं, जो JWT के साथ काम करने के लिए जिम्मेदार होगा।
JWT के लिए संरचनाएँ
\n// auth.rs\nuse serde::{Deserialize, Serialize};\nuse jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};\nuse chrono::{Utc, Duration};\n\n#[derive(Debug, Serialize, Deserialize)]\npub struct Claims {\n pub sub: String, // उपयोगकर्ता ID\n pub exp: usize, // समाप्ति समय\n pub iat: usize, // जारी करने का समय\n}\n\npub fn create_jwt(user_id: &str, secret: &str) -> Result<String, jsonwebtoken::errors::Error> {\n let now = Utc::now();\n let expiration = now + Duration::hours(24); // टोकन 24 घंटे तक रहता है\n\n let claims = Claims {\n sub: user_id.to_owned(),\n exp: expiration.timestamp() as usize,\n iat: now.timestamp() as usize,\n };\n\n let token = encode(\n &Header::default(),\n &claims,\