Rust में OAuth 2.0 और JWT का परिचय
आधुनिक वेब एप्लिकेशन को विश्वसनीय और सुरक्षित प्रमाणीकरण की आवश्यकता होती है। इस क्षेत्र में दो प्रमुख मानक हैं — OAuth 2.0 (प्राधिकरण प्रोटोकॉल) और JWT (JSON Web Token, एक्सेस टोकन प्रारूप)। Rust, अपनी प्रदर्शन और मेमोरी सुरक्षा के कारण, API बनाने के लिए एक उत्कृष्ट विकल्प बन गया है, जहाँ गति और विश्वसनीयता महत्वपूर्ण हैं।
इस लेख में, हम जानेंगे कि लोकप्रिय क्रेट्स का उपयोग करके Rust में OAuth 2.0 और JWT प्राधिकरण कैसे लागू करें। आप सीखेंगे कि सर्वर कैसे सेट करें, JWT टोकन जारी करें और सत्यापित करें, और OAuth 2.0 फ्लो को एकीकृत करें। यह सामग्री Rust और वेब फ्रेमवर्क की मूल बातों से परिचित डेवलपर्स के लिए है।
OAuth 2.0 और JWT की मूल अवधारणाएँ
OAuth 2.0 क्या है?
OAuth 2.0 एक प्रतिनिधि पहुँच प्रोटोकॉल है। यह एप्लिकेशन को उपयोगकर्ता के क्रेडेंशियल्स (लॉगिन और पासवर्ड) को स्थानांतरित किए बिना उसके संसाधनों तक सीमित पहुँच प्राप्त करने की अनुमति देता है। मुख्य भागीदार:
- Resource Owner — उपयोगकर्ता, जो डेटा का मालिक है।
- Client — हमारा एप्लिकेशन (उदाहरण के लिए, Rust पर वेब सेवा)।
- Authorization Server — सर्वर जो सफल प्रमाणीकरण के बाद टोकन जारी करता है।
- Resource Server — API जो संरक्षित डेटा प्रदान करता है।
JWT क्या है?
JWT एक कॉम्पैक्ट, URL-सुरक्षित टोकन प्रारूप है जो तीन भागों से बना होता है: हेडर (header), पेलोड (payload) और हस्ताक्षर (signature)। हस्ताक्षर डेटा की अखंडता सुनिश्चित करता है। JWT का उपयोग अक्सर OAuth 2.0 में एक्सेस टोकन के रूप में किया जाता है, क्योंकि यह स्व-निहित है: सर्वर डेटाबेस से पूछताछ किए बिना इसे सत्यापित कर सकता है।
Rust में व्यावहारिक कार्यान्वयन
कार्यान्वयन के लिए हमें निम्नलिखित क्रेट्स की आवश्यकता होगी:
actix-web— वेब फ्रेमवर्क।serdeऔरserde_json— सीरियलाइज़ेशन/डीसीरियलाइज़ेशन के लिए।jsonwebtoken— JWT के साथ काम करने के लिए।dotenv— कॉन्फ़िगरेशन प्रबंधन के लिए।chrono— तिथियों और समय के साथ काम करने के लिए।
चरण 1: प्रोजेक्ट और संरचना सेटअप
एक नया Cargo प्रोजेक्ट बनाएँ और Cargo.toml में निर्भरताएँ जोड़ें:
[dependencies]actix-web = "4"actix-rt = "2"serde = { version = "1", features = ["derive"] }serde_json = "1"jsonwebtoken = "9"dotenv = "0.15"chrono = { version = "0.4", features = ["serde"] }uuid = { version = "1", features = ["v4"] }गुप्त कुंजी संग्रहीत करने के लिए .env फ़ाइल बनाएँ:
JWT_SECRET=my_super_secret_key_12345चरण 2: डेटा मॉडल और JWT फ़ंक्शन बनाना
JWT के लिए संरचनाएँ परिभाषित करें और टोकन बनाने और सत्यापित करने के फ़ंक्शन लागू करें।
use chrono::{Utc, Duration};use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};use serde::{Deserialize, Serialize};use std::env;
#[derive(Debug, Serialize, Deserialize)]pub struct Claims { pub sub: String, // उपयोगकर्ता पहचानकर्ता pub exp: usize, // समाप्ति समय (timestamp) pub iat: usize, // जारी करने का समय (timestamp)}
pub fn create_jwt(user_id: &str) -> Result<String, jsonwebtoken::errors::Error> { let secret = env::var("JWT_SECRET").expect("JWT_SECRET must be set"); let now = Utc::now(); let expiration = now + Duration::hours(24); // टोकन 24 घंटे तक वैध रहता है
let claims = Claims { sub: user_id.to_owned(), exp: expiration.timestamp() as usize, iat: now.timestamp() as usize, };
let token = encode( &Header::default(), &claims, &EncodingKey::from_secret(secret.as_bytes()), )?; Ok(token)}
pub fn validate_jwt(token: &str) -> Result<Claims, jsonwebtoken: