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
}
}