Go पर OAuth 2.0 और JWT का परिचय
आधुनिक वेब एप्लिकेशन और API को एक विश्वसनीय और सुरक्षित प्रमाणीकरण और प्राधिकरण प्रणाली की आवश्यकता होती है। इस क्षेत्र में दो सबसे लोकप्रिय मानक हैं — OAuth 2.0 और JWT (JSON Web Tokens)। Go (Golang) भाषा में, इन तंत्रों का कार्यान्वयन अंतर्निहित समवर्ती समर्थन, उच्च प्रदर्शन और लाइब्रेरीज़ की समृद्ध पारिस्थितिकी तंत्र के कारण विशेष रूप से प्रभावी हो जाता है।
इस लेख में, हम विस्तार से समझेंगे कि Go पर OAuth 2.0 और JWT प्राधिकरण को कैसे लागू किया जाए। आप सीखेंगे कि सर्वर कैसे सेट करें, टोकन कैसे जनरेट और सत्यापित करें, और अपने एंडपॉइंट को कैसे सुरक्षित करें। यह सामग्री शुरुआती और अनुभवी Go डेवलपर्स दोनों के लिए उपयोगी होगी।
OAuth 2.0 और JWT की मूल बातें
OAuth 2.0 क्या है?
OAuth 2.0 एक प्राधिकरण प्रोटोकॉल है जो एप्लिकेशन को पासवर्ड स्थानांतरित किए बिना उपयोगकर्ता के संसाधनों तक सीमित पहुंच प्राप्त करने की अनुमति देता है। इसके बजाय, एक्सेस टोकन (access tokens) का उपयोग किया जाता है। प्रक्रिया के मुख्य भागीदार:
- Resource Owner — डेटा का मालिक उपयोगकर्ता
- Client — पहुंच का अनुरोध करने वाला एप्लिकेशन
- Authorization Server — टोकन जारी करने वाला सर्वर
- Resource Server — सुरक्षित संसाधन प्रदान करने वाला सर्वर
JWT क्या है?
JWT (JSON Web Token) पक्षों के बीच JSON ऑब्जेक्ट के रूप में डेटा स्थानांतरित करने के लिए एक कॉम्पैक्ट और स्व-निहित प्रारूप है। टोकन में तीन भाग होते हैं, जो बिंदुओं से अलग होते हैं:
header.payload.signatureJWT के लाभ:
- सर्वर पर सत्र संग्रहीत करने की आवश्यकता नहीं है (stateless)
- इसमें सभी आवश्यक जानकारी (claims) शामिल है
- अखंडता की जांच के लिए हस्ताक्षरित
Go पर JWT प्राधिकरण का कार्यान्वयन
Go में JWT के साथ काम करने के लिए हम लोकप्रिय लाइब्रेरी golang-jwt/jwt/v5 का उपयोग करेंगे। इसे कमांड से इंस्टॉल करें:
go get github.com/golang-jwt/jwt/v5JWT टोकन जनरेशन
एक्सेस और रिफ्रेश टोकन जनरेट करने के लिए एक फ़ंक्शन बनाएं:
package auth
import ( "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("your-secret-key")
type Claims struct { UserID uint `json:"user_id"` Email string `json:"email"` jwt.RegisteredClaims}
func GenerateAccessToken(userID uint, email string) (string, error) { claims := &Claims{ UserID: userID, Email: email, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(15 * time.Minute)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "myapp", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}
func GenerateRefreshToken(userID uint) (string, error) { claims := &Claims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(7 * 24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}JWT टोकन सत्यापन
HTTP अनुरोधों में टोकन सत्यापित करने के लिए Middleware:
package middleware
import ( "net/http" "strings" "github.com/gin-gonic/gin" "myapp/auth")
func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "missing authorization header"}) c.Abort() return }
tokenString := strings.TrimPrefix(authHeader, "Bearer ") if tokenString == authHeader {