Go में प्रमाणीकरण और अधिकारिता: पैकेज और व्यावहारिक उदाहरण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go (Golang) में प्रमाणीकरण और अधिकारिता: मुख्य टूल्स का अवलोकन

प्रमाणीकरण (उपयोगकर्ता की पहचान सत्यापित करना) और अधिकारिता (पहुँच अधिकारों की जाँच करना) किसी भी वेब एप्लिकेशन के मूलभूत घटक हैं। Go (Golang) इकोसिस्टम में कई सिद्ध लाइब्रेरीज़ हैं जो इन तंत्रों को जल्दी, सुरक्षित और न्यूनतम कोड के साथ लागू करने की अनुमति देती हैं। इस लेख में हम चार मुख्य दृष्टिकोणों पर विचार करेंगे: पासवर्ड हैशिंग, JWT टोकन, सत्र प्रबंधन और OAuth2।

1. पासवर्ड हैशिंग: golang.org/x/crypto/bcrypt

किसी भी प्रमाणीकरण का पहला कदम पासवर्ड को सुरक्षित रूप से संग्रहीत करना है। पासवर्ड को कभी भी सादे टेक्स्ट में न रखें! Go के मानक संग्रह से bcrypt पैकेज अनुकूली लागत (cost factor) के साथ एक सिद्ध हैशिंग एल्गोरिदम प्रदान करता है।

इंस्टॉलेशन:

go get golang.org/x/crypto/bcrypt

रजिस्ट्रेशन और लॉगिन का उदाहरण:

package main

import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)

func hashPassword(password string) (string, error) {
    bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    return string(bytes), err
}

func checkPasswordHash(password, hash string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
    return err == nil
}

func main() {
    password := "mySecretP@ssw0rd"
    hash, _ := hashPassword(password)

    fmt.Println("Hash:", hash)

    // सही पासवर्ड की जाँच
    match := checkPasswordHash(password, hash)
    fmt.Println("Password match:", match) // true

    // गलत पासवर्ड की जाँच
    match = checkPasswordHash("wrong", hash)
    fmt.Println("Wrong password match:", match) // false
}

महत्वपूर्ण: bcrypt.DefaultCost 10 है। उच्च सुरक्षा स्तर (लेकिन धीमी गति) के लिए 12-14 का मान उपयोग करें। कभी भी 10 से कम cost का उपयोग न करें।

2. JWT (JSON Web Tokens) — github.com/golang-jwt/jwt/v5

JWT पक्षों के बीच JSON ऑब्जेक्ट के रूप में डेटा स्थानांतरित करने का एक कॉम्पैक्ट तरीका है। यह REST API और माइक्रोसर्विसेज़ के लिए आदर्श है। golang-jwt/jwt पैकेज सबसे लोकप्रिय और सक्रिय रूप से समर्थित है।

इंस्टॉलेशन:

go get github.com/golang-jwt/jwt/v5

JWT बनाने और सत्यापित करने का उदाहरण:

package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)

var jwtSecret = []byte("your-secret-key-keep-it-safe")

func createToken(userID string) (string, error) {
    claims := jwt.MapClaims{
        "user_id": userID,
        "exp":     time.Now().Add(24 * time.Hour).Unix(),
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString(jwtSecret)
}

func verifyToken(tokenString string) (string, error) {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return jwtSecret, nil
    })
    if err != nil {
        return "", err
    }
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        return claims["user_id"].(string), nil
    }
    return "", fmt.Errorf("invalid token")
}

func main() {
    token, _ := createToken("user123")
    fmt.Println("JWT:", token)

    userID, err := verifyToken(token)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Authenticated user:", userID)
    }
}

सुझाव: सीक्रेट की को कोड में नहीं, बल्कि एनवायरनमेंट वेरिएबल्स में रखें। प्रोडक्शन के लिए असममित एन्क्रिप्शन (RS256) का उपयोग करें।

3. सत्र प्रबंधन — gorilla/sessions

HTML टेम्पलेट्स वाले क्लासिक वेब एप्लिकेशन के लिए, सर्वर-साइड सत्र अक्सर अधिक सुविधाजनक होते हैं। gorilla/sessions पैकेज एक तैयार समाधान प्रदान करता है।

अनुशंसाएँ