Go पर OAuth 2.0 और JWT प्राधिकरण: सिद्धांत से व्यवहार तक
\n\nआधुनिक वेब एप्लिकेशन और API शायद ही कभी एक विश्वसनीय प्रमाणीकरण और प्राधिकरण प्रणाली के बिना काम करते हैं। दो मानक — OAuth 2.0 और JWT (JSON Web Tokens) — विकास की दुनिया में वास्तविक मानक बन गए हैं। इस लेख में, हम व्यावहारिक उदाहरणों के साथ समझेंगे कि Go (Golang) भाषा में JWT का उपयोग करके OAuth 2.0 प्राधिकरण को कैसे लागू किया जाए।
\n\nहम एक सरल REST API सर्वर बनाएंगे जो OAuth 2.0 प्रदाता (जैसे, Google) के माध्यम से सफल प्रमाणीकरण के बाद JWT टोकन जारी करेगा और प्रत्येक अनुरोध पर उन्हें सत्यापित करेगा।
\n\n1. OAuth 2.0 और JWT की मूल बातें
\n\nकोड लिखने से पहले, आइए संक्षेप में शब्दों को समझें।
\n\n- \n
- OAuth 2.0 — एक प्राधिकरण प्रोटोकॉल है जो उपयोगकर्ताओं को लॉगिन और पासवर्ड साझा किए बिना तीसरे पक्ष को अपने संसाधनों तक सीमित पहुंच प्रदान करने की अनुमति देता है। मुख्य भूमिकाएँ: Resource Owner (उपयोगकर्ता), Client (हमारा एप्लिकेशन), Authorization Server (टोकन जारी करने वाला सर्वर), Resource Server (सुरक्षित डेटा वाला सर्वर)। \n
- JWT — एक कॉम्पैक्ट URL-सुरक्षित टोकन प्रारूप है जिसमें तीन भाग होते हैं: header, payload और signature। JWT में कोई भी डेटा (claims) हो सकता है और यह एक गुप्त कुंजी या RSA कुंजी जोड़ी के साथ हस्ताक्षरित होता है। \n
हमारे कार्यान्वयन में, OAuth 2.0 का उपयोग प्रदाता (Google) से identity टोकन प्राप्त करने के लिए किया जाएगा, और फिर हम अपने API के साथ आगे के काम के लिए अपना स्वयं का JWT उत्पन्न करेंगे।
\n\n2. प्रोजेक्ट सेटअप और निर्भरताएँ
\n\nGo में एक नया प्रोजेक्ट बनाएं और आवश्यक पैकेज स्थापित करें:
\n\nmkdir go-oauth-jwt\ncd go-oauth-jwt\ngo mod init example.com/go-oauth-jwt\ngo get github.com/gin-gonic/gin\ngo get github.com/golang-jwt/jwt/v5\ngo get golang.org/x/oauth2\ngo get golang.org/x/oauth2/google\n\nहम उपयोग करेंगे:
\n- \n
- Gin — Go के लिए एक तेज़ HTTP फ्रेमवर्क। \n
- golang-jwt — JWT के साथ काम करने के लिए लाइब्रेरी। \n
- oauth2 — OAuth 2.0 के लिए Go की मानक लाइब्रेरी। \n
साथ ही, आपको Google Cloud Console में एक एप्लिकेशन पंजीकृत करना होगा, OAuth 2.0 Client ID और Secret बनाना होगा, और Redirect URI निर्दिष्ट करना होगा (उदाहरण के लिए, http://localhost:8080/auth/google/callback)।
3. Google के माध्यम से OAuth 2.0 लॉगिन का कार्यान्वयन
\n\nआइए OAuth 2.0 कॉन्फ़िगरेशन और लॉगिन और कॉलबैक के लिए एंडपॉइंट बनाकर शुरू करें।
\n\npackage main\n\nimport (\n "crypto/rand"\n "encoding/base64"\n "net/http"\n "os"\n\n "github.com/gin-gonic/gin"\n "golang.org/x/oauth2"\n "golang.org/x/oauth2/google"\n)\n\nvar (\n googleOauthConfig *oauth2.Config\n oauthStateString string\n)\n\nfunc init() {\n googleOauthConfig = &oauth2.Config{\n RedirectURL: "http://localhost:8080/auth/google/callback",\n ClientID: os.Getenv("GOOGLE_CLIENT_ID"),\n ClientSecret: os.Getenv("GOOGLE_CLIENT_SECRET"),\n Scopes: []string{"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"},\n Endpoint: google.Endpoint,\n }\n // CSRF से बचाव के लिए एक यादृच्छिक state टोकन उत्पन्न करें\n b := make([]byte, 32)\n rand.Read(b)\n oauthStateString = base64.StdEncoding.EncodeToString(b)\n}\n\nfunc main() {\n r := gin.Default()\n\n r.GET("/auth/google/login", handleGoogleLogin)\n r.GET("/auth/google/callback", handleGoogleCallback)\n\n r.Run(":8080")\n}\n\nfunc handleGoogleLogin(c *gin.Context) {\n url := googleOauthConfig.AuthCodeURL(oauthStateString)\n c.Redirect(http.StatusTemporaryRedirect, url)\n}\n\nfunc handleGoogleCallback(c *gin.Context) {\n state := c.Query("state")\n if state != oauthStateString {\n c.JSON(http.StatusBadRequest, gin.H{"error": "invalid oauth state"})\n return\n }\n\n code := c.Query("code")\n token, err := googl