परिचय: Go में OAuth 2.0 और JWT की आवश्यकता क्यों है?
\nआधुनिक वेब एप्लिकेशन और API शायद ही कभी प्रमाणीकरण प्रणाली के बिना काम करते हैं। यदि आप Go (Golang) में लिख रहे हैं और अपने एंडपॉइंट को सुरक्षित करना चाहते हैं, तो आपको दो प्रमुख तकनीकों को समझना होगा: OAuth 2.0 (एक्सेस डेलिगेशन प्रोटोकॉल) और JWT (JSON Web Token — एक कॉम्पैक्ट टोकन फॉर्मेट)।
\nइस लेख में, हम सीखेंगे कि Go में शुरू से सुरक्षित प्रमाणीकरण कैसे लागू करें। आप जानेंगे:
\n- \n
- OAuth 2.0 और JWT में क्या अंतर है और वे एक साथ कैसे काम करते हैं। \n
- Go में JWT टोकन कैसे जनरेट और वेरिफाई करें।
- मिनिमल OAuth 2.0 प्रमाणीकरण (Client Credentials flow) कैसे बनाएं।
- Middleware का उपयोग करके REST API को कैसे सुरक्षित करें।
यह लेख उन शुरुआती डेवलपर्स के लिए है जो Go और HTTP सर्वर की मूल बातों से परिचित हैं।
\n\nमूल बातें: OAuth 2.0 और JWT — एक ही चीज़ नहीं हैं
\nकई नौसिखिए इन अवधारणाओं को भ्रमित करते हैं। आइए स्पष्ट करते हैं।
\n\nOAuth 2.0 क्या है?
\nOAuth 2.0 एक प्रमाणीकरण प्रोटोकॉल है जो एक सेवा (क्लाइंट) को उपयोगकर्ता की ओर से दूसरी सेवा (सर्वर) के संसाधनों तक सीमित पहुंच प्राप्त करने की अनुमति देता है। कल्पना करें कि आप Google के माध्यम से किसी वेबसाइट पर लॉग इन करना चाहते हैं। साइट को आपका पासवर्ड नहीं मिलता — उसे Google से एक अस्थायी टोकन मिलता है जो केवल आपके ईमेल तक पहुंच प्रदान करता है (और वह भी आपकी सहमति से)।
\nOAuth 2.0 में मुख्य भूमिकाएँ:
\n- \n
- Resource Owner — डेटा का मालिक (आमतौर पर उपयोगकर्ता)। \n
- Client — वह एप्लिकेशन जो पहुंच प्राप्त करना चाहता है। \n
- Authorization Server — वह सर्वर जो सत्यापन के बाद टोकन जारी करता है। \n
- Resource Server — वह सर्वर जो संरक्षित डेटा संग्रहीत करता है और टोकन सत्यापित करता है। \n
JWT क्या है?
\nJWT (JSON Web Token) टोकन का एक प्रारूप है। यह तीन भागों की एक स्ट्रिंग है जो डॉट्स द्वारा अलग की जाती है: header.payload.signature। JWT में कोई भी डेटा हो सकता है (जैसे, उपयोगकर्ता ID, भूमिका, समाप्ति तिथि) और इसे गुप्त कुंजी से हस्ताक्षरित किया जाता है ताकि इसे नकली न बनाया जा सके।
OAuth 2.0 JWT से बंधा नहीं है — टोकन कोई भी स्ट्रिंग हो सकता है। हालांकि, व्यवहार में JWT का सबसे अधिक उपयोग किया जाता है क्योंकि यह स्व-निहित है: सर्वर को डेटाबेस में सत्र संग्रहीत करने की आवश्यकता नहीं है, सभी जानकारी को तुरंत सत्यापित किया जा सकता है।
\n\nGo में JWT का कार्यान्वयन: टोकन जनरेशन और सत्यापन
\nअभ्यास से शुरू करते हैं। Go में JWT के साथ काम करने के लिए हम golang-jwt/jwt/v5 लाइब्रेरी का उपयोग करेंगे। इसे इंस्टॉल करें:
go get github.com/golang-jwt/jwt/v5\n\nAccess Token जनरेट करना
\nएक फंक्शन बनाते हैं जो उपयोगकर्ता ID लेता है और 1 घंटे की वैधता के साथ एक हस्ताक्षरित JWT टोकन लौटाता है।
\npackage main\n\nimport (\n "time"\n "github.com/golang-jwt/jwt/v5"\n)\n\nvar jwtSecret = []byte("your-secret-key") // प्रोडक्शन में .env में स्टोर करें!\n\ntype Claims struct {\n UserID uint `json:"user_id"`\n jwt.RegisteredClaims\n}\n\nfunc GenerateAccessToken(userID uint) (string, error) {\n claims := Claims{\n UserID: userID,\n RegisteredClaims: jwt.RegisteredClaims{\n ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour)),\n IssuedAt: jwt.NewNumericDate(time.Now()),\n Issuer: "my-app",\n },\n }\n token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n return token.SignedString(jwtSecret)\n}\n\nJWT को सत्यापित और पार्स करना
\nअब एक middleware लिखते हैं जो Authorization: Bearer <token> हेडर से टोकन की जांच करेगा।
func ValidateToken(tokenString string) (*Claims, error) {\n token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {\n // जांचें कि सही हस्ताक्षर विधि का उपयोग किया गया है या नहीं\n