Rust में OAuth 2.0 और JWT प्राधिकरण: शुरुआती के लिए चरण-दर-चरण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय

\n

आधुनिक वेब डेवलपमेंट सुरक्षित प्रमाणीकरण और प्राधिकरण के बिना अधूरा है। दो सबसे लोकप्रिय मानक — OAuth 2.0 और JWT (JSON Web Tokens) — उद्योग में डी-फैक्टो समाधान बन चुके हैं। यदि आप Rust में कोड लिखते हैं, तो आप भाग्यशाली हैं: यह भाषा न केवल उच्चतम प्रदर्शन प्रदान करती है, बल्कि इन प्रोटोकॉल को लागू करने के लिए शक्तिशाली लाइब्रेरी भी देती है।

\n

इस लेख में, हम समझेंगे कि OAuth 2.0 और JWT क्या हैं, वे एक साथ कैसे काम करते हैं, और Rust में actix-web फ्रेमवर्क और jsonwebtoken क्रेट का उपयोग करके एक सरल लेकिन कार्यशील प्राधिकरण उदाहरण लिखेंगे। यह लेख शुरुआती लोगों के लिए है, इसलिए हम सिद्धांत से कोड तक कदम-दर-कदम आगे बढ़ेंगे।

\n\n

OAuth 2.0 और JWT क्या हैं?

\n

कोड लिखने से पहले, अवधारणाओं को समझना महत्वपूर्ण है। OAuth 2.0 एक प्राधिकरण प्रोटोकॉल है जो एप्लिकेशन को उपयोगकर्ता का पासवर्ड दिए बिना उसके संसाधनों तक सीमित पहुंच प्राप्त करने की अनुमति देता है। इसका उपयोग तब किया जाता है जब आप Google, GitHub या VK के माध्यम से किसी साइट पर लॉग इन करते हैं।

\n

JWT एक टोकन प्रारूप (JSON Object Signing and Encryption) है जिसमें उपयोगकर्ता के बारे में दावे (claims) होते हैं। टोकन सर्वर द्वारा हस्ताक्षरित होता है, इसलिए क्लाइंट इसे नकली नहीं बना सकता। OAuth 2.0 के संदर्भ में, JWT का उपयोग अक्सर एक्सेस टोकन के रूप में किया जाता है।

\n

सामान्य परिदृश्य: उपयोगकर्ता अपना लॉगिन और पासवर्ड दर्ज करता है, सर्वर उन्हें सत्यापित करता है, एक JWT टोकन उत्पन्न करता है और इसे क्लाइंट को लौटाता है। क्लाइंट प्रत्येक अनुरोध पर इस टोकन को Authorization: Bearer <token> हेडर में भेजता है। सर्वर हस्ताक्षर सत्यापित करता है और उपयोगकर्ता डेटा निकालता है।

\n\n

Rust में प्रोजेक्ट सेटअप

\n

एक नया प्रोजेक्ट बनाएं:

\n
cargo new rust_oauth_jwt\ncd rust_oauth_jwt
\n

Cargo.toml में आवश्यक डिपेंडेंसी जोड़ें:

\n
[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 फ़ाइल बनाएं:

\n
JWT_SECRET=my_super_secret_key_change_in_production\nJWT_EXPIRATION_HOURS=24
\n

main.rs में एनवायरनमेंट वेरिएबल लोड करें:

\n
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 फ़ाइल बनाएं:

\n
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 के लिए यूटिलिटी बनाएं:

\n
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                

ब्लॉग

पुस्तक अनुशंसाएँ