परिचय: क्यों OAuth 2.0 और JWT आधुनिक प्राधिकरण का मानक हैं
\nआधुनिक वेब डेवलपमेंट में, सुरक्षित प्रमाणीकरण और प्राधिकरण किसी भी एप्लिकेशन के महत्वपूर्ण घटक हैं। OAuth 2.0 और JWT (JSON Web Tokens) वितरित सिस्टम बनाने के लिए डी-फैक्टो मानक बन गए हैं। OAuth 2.0 प्रतिनिधि पहुंच का प्रोटोकॉल प्रदान करता है, जबकि JWT एक कॉम्पैक्ट और स्व-निहित टोकन प्रारूप है।
\nइस लेख में, हम TypeScript पर व्यावहारिक उदाहरणों के साथ समझेंगे कि प्राधिकरण का पूरा चक्र कैसे लागू किया जाए: टोकन जारी करने से लेकर उनके सत्यापन और नवीनीकरण तक। आप सीखेंगे कि API एंडपॉइंट को कैसे सुरक्षित करें, रिफ्रेश टोकन लागू करें और सामान्य त्रुटियों को कैसे संभालें।
\n\n1. प्रोजेक्ट की बुनियादी सेटअप और निर्भरताओं की स्थापना
\nशुरू करने के लिए, Node.js और TypeScript पर एक प्रोजेक्ट बनाएं। सुनिश्चित करें कि आपके पास Node.js (संस्करण 18+) और npm स्थापित हैं।
mkdir oauth-jwt-typescript\ncd oauth-jwt-typescript\nnpm init -y\nnpm install express cors dotenv jsonwebtoken bcrypt\nnpm install -D typescript @types/express @types/cors @types/jsonwebtoken @types/bcrypt ts-node nodemon\nnpx tsc --init\nES मॉड्यूल और सख्त प्रकारों के साथ काम करने के लिए tsconfig.json कॉन्फ़िगर करें। .env फ़ाइल में गुप्त कुंजियाँ जोड़ें:
ACCESS_TOKEN_SECRET=your-super-secret-access-key\nREFRESH_TOKEN_SECRET=your-super-secret-refresh-key\nACCESS_TOKEN_EXPIRES_IN=15m\nREFRESH_TOKEN_EXPIRES_IN=7d\n\n2. JWT टोकन के जनरेशन और सत्यापन का कार्यान्वयन
\nटोकन के साथ काम करने के लिए एक उपयोगिता src/utils/jwt.ts बनाएं। हम दो प्रकार के टोकन का उपयोग करेंगे: Access Token (अल्पकालिक) और Refresh Token (दीर्घकालिक)।
import jwt from 'jsonwebtoken';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\ninterface TokenPayload {\n userId: string;\n email: string;\n role: 'user' | 'admin';\n}\n\nexport const generateAccessToken = (payload: TokenPayload): string => {\n return jwt.sign(payload, process.env.ACCESS_TOKEN_SECRET!, {\n expiresIn: process.env.ACCESS_TOKEN_EXPIRES_IN || '15m',\n });\n};\n\nexport const generateRefreshToken = (payload: TokenPayload): string => {\n return jwt.sign(payload, process.env.REFRESH_TOKEN_SECRET!, {\n expiresIn: process.env.REFRESH_TOKEN_EXPIRES_IN || '7d',\n });\n};\n\nexport const verifyAccessToken = (token: string): TokenPayload => {\n return jwt.verify(token, process.env.ACCESS_TOKEN_SECRET!) as TokenPayload;\n};\n\nexport const verifyRefreshToken = (token: string): TokenPayload => {\n return jwt.verify(token, process.env.REFRESH_TOKEN_SECRET!) as TokenPayload;\n};\nध्यान दें: हम payload के लिए सख्त टाइपिंग का उपयोग कर रहे हैं। यह सुनिश्चित करता है कि टोकन में हमेशा आवश्यक फ़ील्ड हों।
\n\n3. रूट्स की सुरक्षा के लिए middleware बनाना
\nअब हम एक middleware लागू करेंगे जो Authorization हेडर में Access Token की उपस्थिति और वैधता की जाँच करेगा। src/middleware/auth.ts बनाएं:
import { Request, Response, NextFunction } from 'express';\nimport { verifyAccessToken } from '../utils/jwt';\n\nexport interface AuthRequest extends Request {\n user?: {\n userId: string;\n email: string;\n role: 'user' | 'admin';\n };\n}\n\nexport const authenticate = (req: AuthRequest, res: Response, next: NextFunction): void => {\n const authHeader = req.headers['authorization'];\n const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN\n\n if (!token) {\n res.status(401).json({ error: 'Access token is required' });\n return;\n }\n\n try {\n const decoded = verifyAccessToken(token);\n req.user = decoded;\n next();\n } catch (error) {\n res.status(403).json({ error: 'Invalid or expired access token' });\n }\n};\n\nexport const authorizeRole = (...roles: string[]) => {\n return (req: AuthRequest, res: Response, next: NextFunction): void => {\n if (!req.user || !roles