JWT फाइबर

जेडब्ल्यूटी मिडलवेयर एक JSON वेब टोकन (JWT) प्रमाणीकरण मिडलवेयर लौटाता है। एक मान्य टोकन के लिए, यह Ctx.Locals में उपयोगकर्ता को सेट करता है और अगले हैंडलर को बुलाता है। एक अमान्य टोकन के लिए, यह "401 - अनधिकृत" त्रुटि लौटाता है। एक गायब टोकन के लिए, यह "400 - बैड रिक्वेस्ट" त्रुटि लौटाता है।

ध्यान दें: गो संस्करण 1.19 या उच्च चाहिए

स्थापना

यह मिडलवेयर फाइबर v1 और v2 का समर्थन करता है, कृपया तथापि स्थापित करें।

go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/contrib/jwt
go get -u github.com/golang-jwt/jwt/v5

हस्ताक्षर

jwtware.New(config ...jwtware.Config) func(*fiber.Ctx) error

विन्यास

Property Type Description Default Value
Filter func(*fiber.Ctx) bool मिडलवेयर को छोड़ने के लिए एक फ़ंक्शन को परिभाषित करता है nil
SuccessHandler func(*fiber.Ctx) error मान्य टोकन के ऊपर निष्पादन करने के लिए एक फ़ंक्शन को परिभाषित करता है nil
ErrorHandler func(*fiber.Ctx, error) error अमान्य टोकन के ऊपर निष्पादन करने के लिए एक फ़ंक्शन को परिभाषित करता है 401 अमान्य या समाप्त JWT
SigningKey interface{} टोकन को सत्यापित करने के लिए उपयोग की जाने वाली साइनिंग कुंजी। यदि SigningKeys की लंबाई 0 है, तो यह एक प्रतिवाद के रूप में उपयोग की जाती है nil
SigningKeys map[string]interface{} टोकन को kid फ़ील्ड के साथ सत्यापित करने के लिए उपयोग की जाने वाली साइनिंग कुंजियों के मैपिंग nil
ContextKey string संदर्भ में उपयोगकर्ता जानकारी को संभालने के लिए प्रयोग की जाने वाली संदर्भ कुंजी "user"
Claims jwt.Claim टोकन सामग्री को परिभाषित करने वाला विस्तारित दावे का डेटा jwt.MapClaims{}
TokenLookup string टोकन को पार्स करने के लिए एक स्ट्रिंग की प्रारूप में उपयोग होने वाला "header:Authorization"
AuthScheme string प्रमाणीकरण हेडर में उपयोग की जाने वाली AuthScheme। Default TokenLookup मान केवल डिफ़ॉल्ट TokenLookup मान के साथ सेवानिवृत्त किया जाता है "Bearer"
KeyFunc func() jwt.Keyfunc टोकन सत्यापन के लिए सार्वजनिक कुंजी प्रदान करने के लिए उपयोगकर्ता-निर्धारित फ़ंक्शन jwtKeyFunc
JWKSetURLs []string जोड़ने योग्य अनुपस्थित अनुयायी जेसन वेब कुंजी (JWK) सेट URLs का एक स्लाइस जोड़ता है nil

HS256 का उदाहरण

package main

import (
	"time"

	"github.com/gofiber/fiber/v2"

	jwtware "github.com/gofiber/contrib/jwt"
	"github.com/golang-jwt/jwt/v5"
)

func main() {
	app := fiber.New()

	// लॉगिन मार्ग
	app.Post("/login", login)

	// प्रमाणीकरण के बिना पहुँचने योग्य मार्ग
	app.Get("/", accessible)

	// JWT मिडलवेयर
	app.Use(jwtware.New(jwtware.Config{
		SigningKey: jwtware.SigningKey{Key: []byte("secret")},
	}))

	// प्रतिबंधित मार्ग
	app.Get("/restricted", restricted)

	app.Listen(":3000")
}

func login(c *fiber.Ctx) error {
	user := c.FormValue("user")
	pass := c.FormValue("pass")

	// अनधिकृत त्रुटि फेंकना
	if user != "john" || pass != "doe" {
		return c.SendStatus(fiber.StatusUnauthorized)
	}

	// दावे बनाना
	claims := jwt.MapClaims{
		"name":  "John Doe",
		"admin": true,
		"exp":   time.Now().Add(time.Hour * 72).Unix(),
	}

	// टोकन बनाना
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// कोडित टोकन जनरेट करना और प्रतिक्रिया के रूप में भेजना
	t, err := token.SignedString([]byte("secret"))
	if err != nil {
		return c.SendStatus(fiber.StatusInternalServerError)
	}

	return c.JSON(fiber.Map{"token": t})
}

func accessible(c *fiber.Ctx) error {
	return c.SendString("Accessible")
}

func restricted(c *fiber.Ctx) error {
	user := c.Locals("user").(*jwt.Token)
	claims := user.Claims.(jwt.MapClaims)
	name := claims["name"].(string)
	return c.SendString("आपका स्वागत है " + name)
}

HS256 परीक्षण

उपयोक्ता नाम और पासवर्ड दर्ज करके टोकन प्राप्त करने के लिए उपयोग करें।

curl --data "user=john&pass=doe" http://localhost:3000/login

प्रतिक्रिया

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NjE5NTcxMzZ9.RB3arc4-OyzASAaUhC2W3ReWaXAt_z2Fd3BN4aWTgEY"
}

अनुमति हेडर में टोकन का उपयोग करके अनुरोध प्रतिष्ठित संसाधित साधन करें।

curl localhost:3000/restricted -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NjE5NTcxMzZ9.RB3arc4-OyzASAaUhC2W3ReWaXAt_z2Fd3BN4aWTgEY"

प्रतिक्रिया

Welcome John Doe
package main

import (
	"crypto/rand"
	"crypto/rsa"
	"log"
	"time"

	"github.com/gofiber/fiber/v2"

	"github.com/golang-jwt/jwt/v5"

	jwtware "github.com/gofiber/contrib/jwt"
)

var (
	// स्वाभाविक रूप से, यह केवल एक परीक्षण उदाहरण है। उत्पादन में ऐसा न करें।
	// उत्पादन में, आपको पहले से ही कुंजी जोड़नी चाहिए।
	// किसी भी GitHub रिज़बटरी में निजी कुंजी न डालें।
	privateKey *rsa.PrivateKey
)

func main() {
	app := fiber.New()

	// प्रदर्शन के लिए, प्रोग्राम चालू होते समय हर बार एक नया निजी/सार्वजनिक कुंजी जोड़ें। ऊपर के नोट देखें।
	rng := rand.Reader
	var err error
	privateKey, err = rsa.GenerateKey(rng, 2048)
	if err != nil {
		log.Fatalf("rsa.GenerateKey:%v", err)
	}

	// लॉगिन रूट
	app.Post("/login", login)

	// अनामितिकृत रूट
	app.Get("/", accessible)

	// JWT मिडलवेअर
	app.Use(jwtware.New(jwtware.Config{
		SigningKey: jwtware.SigningKey{
			JWTAlg: jwtware.RS256,
			Key:    privateKey.Public(),
		},
	}))

	// प्रतिबंधित संसाधित साधन
	app.Get("/restricted", restricted)

	app.Listen(":3000")
}

func login(c *fiber.Ctx) error {
	user := c.FormValue("user")
	pass := c.FormValue("pass")

	// अनधिकृत त्रुटि फेंकें
	if user != "john" || pass != "doe" {
		return c.SendStatus(fiber.StatusUnauthorized)
	}

	// दावे बनाएं
	claims := jwt.MapClaims{
		"name":  "John Doe",
		"admin": true,
		"exp":   time.Now().Add(time.Hour * 72).Unix(),
	}

	// टोकन बनाएं
	token := jwt.NewWithClaims(jwt.SigningMethodRS256, claims)

	// एन्कोड किया गया टोकन उत्तर के रूप में भेजें
	t, err := token.SignedString(privateKey)
	if err != nil {
		log.Printf("token.SignedString:%v", err)
		return c.SendStatus(fiber.StatusInternalServerError)
	}

	return c.JSON(fiber.Map{"token": t})
}

func accessible(c *fiber.Ctx) error {
	return c.SendString("Accessible")
}

func restricted(c *fiber.Ctx) error {
	user := c.Locals("user").(*jwt.Token)
	claims := user.Claims.(jwt.MapClaims)
	name := claims["name"].(string)
	return c.SendString("Welcome " + name)
}

RS256 परीक्षण

RS256 मौजूदा HS256 परीक्षण के समान है।

JWK सेट परीक्षण

ये परीक्षण मौजूदा बुनियादी JWT परीक्षणों के समान हैं, लेकिन इन्हें JWK सेट URL पर स्वीकृत सार्वजनिक कुंजी सेट की आवश्यकता होती है।

अनुकूलित KeyFunc उदाहरण

KeyFunc एक उपयोगकर्ता निर्धारित स्थितियां के लिए एक सार्वजनिक कुंजी प्रदान करने के लिए उपयोग किया जाने वाला एक फ़ंक्शन पर परिभाषा करता है। यह कार्य सिग्नेचर एल्गोरिदम की प्रमाणित करने और सही कुंजी का चयन करने के लिए जिम्मेवार होता है। यदि टोकन एक बाहरी पक्ष द्वारा जारी किया गया है, तो उपयोगकर्ता निर्धारित KeyFunc उपयोगी हो सकता है।

जब एक उपयोगकर्ता निर्धारित KeyFunc प्रदान किया जाता है, तो SigningKey, SigningKeys, और SigningMethod को नजरअंदाज कर दिया जाएगा। यह टोकन मान्यता कुंजियों प्रदान करने के तीन विकल्पों में से एक है। प्राथमिकता क्रम है - उपयोगकर्ता निर्धारित KeyFunc, SigningKeys, और SigningKey। यदि SigningKeys और SigningKey दोनों प्रदान नहीं किए गए हैं, तो इस फ़ंक्शन को प्रदान किया जाना चाहिए। डिफ़ॉल्ट है कि आंतरिक क्रियान्वयन का उपयोग करके हस्ताक्षर एल्गोरिदम की मान्यता करनी और उचित कुंजी का चयन करना।

package main

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	
  jwtware "github.com/gofiber/contrib/jwt"
  "github.com/golang-jwt/jwt/v5"
)

func main() {
	app := fiber.New()

	app.Use(jwtware.New(jwtware.Config{
		KeyFunc: customKeyFunc(),
	}))

	app.Get("/ok", func(c *fiber.Ctx) error {
		return c.SendString("OK")
	})
}

func customKeyFunc() jwt.Keyfunc {
	return func(t *jwt.Token) (interface{}, error) {
		// सिग्नेचर मेथड सही है या नहीं, उसे जांचें
		if t.Method.Alg() != jwtware.HS256 {
			return nil, fmt.Errorf("अनपेक्षित jwt साइनिंग मेथड=%v", t.Header["alg"])
		}

		// TODO कस्टम साइनिंग कुंजी को लोड करने की विशेषता इम्प्लीमेंट करें, उदाहरण के लिए, डेटाबेस से लोड करें
    signingKey := "सीक्रेट"

		return []byte(signingKey), nil
	}
}