فائبر JWT

JWT مiddleware ایک JSON ویب ٹوکن (JWT) تصدیق middleware واپس کرتا ہے۔ ایک درست ٹوکن کے لئے، یہ صارف کو Ctx.Locals میں سیٹ کرتا ہے اور اگلا ہینڈلر کال کرتا ہے۔ نامعتبر ٹوکن کے لئے، یہ "401 - غیر مجاز" خطا واپس کرتا ہے۔ اور گمشدہ ٹوکن کے لئے، یہ "400 - برا درخواست" خطا واپس کرتا ہے۔

نوٹ: 1.19 یا اوپر کا Go ورژن ضروری ہے

نصب

یہ مiddleware فائبر 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

تشکیل

خصوصیت قسم تفصیل پہلے سے طے شدہ قیمت
Filter func(*fiber.Ctx) bool مiddleware کو چھوڑنے کے لئے ایک فنکشن تعین کرتا ہے nil
SuccessHandler func(*fiber.Ctx) error درست ٹوکن کے متناسب فنکشن کو تعین کرتا ہے nil
ErrorHandler func(*fiber.Ctx, error) error نامعتبر ٹوکن کے متناسب فنکشن کو تعین کرتا ہے 401 Invalid or expired JWT
SigningKey interface{} ٹوکن کی تصدیق کے لئے استعمال ہونے والی امضا کی کلید nil
SigningKeys map[string]interface{} ٹوکنز کی تصدیق کے لئے استعمال ہونے والی کلیدوں کا نقشہ جس میں kid فیلڈ ہو nil
ContextKey string صارف کی معلومات کو کنٹیکسٹ میں ٹوکن سے سٹور کرنے کے لئے استعمال ہونے والی کنٹیکسٹ کی "user"
Claims jwt.Claim ٹوکن مواد کی تعیناتی دعوات کے وسیع نقشے jwt.MapClaims{}
TokenLookup string ٹوکن کو پارس کرنے کے لئے : کی صورت میں استعمال ہونے والا ایک رشتہ "header:Authorization"
AuthScheme string تصدیق ہیڈر میں استعمال ہونے والا AuthScheme۔ پہلے سے طے شدہ قیمت ("Bearer") کے صرف ہمیشہ کی موجودگی ہوتی ہے TokenLookup کی پہلے سے طے شدہ قیمت کے ساتھ "Bearer"
KeyFunc func() jwt.Keyfunc ٹوکن تصدیق کے لئے عوامی کلید فراہم کرنے والا صارف مقرر کرنے والا فنکشن jwtKeyFunc
JWKSetURLs []string JWT پارس کرنے کے لئے استعمال ہونے والے منفرد JSON ویب کلید (JWK) سیٹ یو آر ایلوں کا ایک سلائس 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 mوسمiddleware
	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("قابل دسترس")
}

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

ایچ ایس 256 ٹیسٹ

صارف نام اور پاسورڈ کے ساتھ لاگ ان کریں تاکہ ٹوکن حاصل کیا جا سکے۔

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"

جواب

خوش آمدید جان ڈو
پیکیج واحد
 
میں درآمد
 
سیفت:
	"kwrypٹو / رینڈ"
	"kwrypٹو / آرایس اے"
	"لاگ"
	"ٹائم"
 
	"gohub.com/gofiber/fiber / نیو"
 
	"gohub.com/golangJwt/jwt / v5"
 
	جوتویر "gohub.com / gofiber / مواضع / جوت"
 
var (
	// بے شک، یہ صرف ایک ٹیسٹ مثال ہے۔ تولید نہ کریں
	// تولید کرنے سے پہلے ہی کلید جوڑنی چاہئیں۔
	// کبھی بھی نجومی گوتھب اسدیب میں نجومی کو خصوصی کلید شامل نہیں کرنا چاہئیں
	privateKey *rsa.PrivateKey
)
 
مین فنکشن
 
اہری:
	عارضی := fiber.Naya()
 
	// ڈیمونسٹریشن کے لئے ، ہر بار جب بھی پروگرام چلتا ہے ایک نیا نجومی علیحدہ / عوامی کلید جوڑی تولید کریں۔ اوپر نوٹ دیکھیں
	rng := rand.Reader
	ور، خطا:
		privateKey، خطا = rsa.GenerateKey(rng، 2048)
	ب
	اگر خطا! = صحیح تو
		log.Fatalf("rsa.GenerateKey:%v"، خطا)
	}
 
	// لاگن روٹ
	اہر. داخلہ("/لاگن"، لاگن)
 
	// غیر مصدق روٹ
	اہر. حاصل()
 
	// جوٹوی مڈڈل ویئر
	اپل.Use(jwtware.New(jwtware.Config{
		سائننگکی: jwtware.SigningKey{
			JWTAlg: jwtware.RS256،
			کلید: privateKey.Public()،
		}،
	}،
 
	// محدود شدہ روٹ
	اہر.گیٹ("/ محدود"، محدود)
 
	اپل.سنوا(": 3000")
}
 
func login(c * fiber.Ctx) batil {
	صارف := c.FormValue("صارف")
	پاس: = c.FormValue("پاس")
 
	// سرگرمی سے مستثنی کریں خطا
	اگر صارف! = "جان" || پاس! = "دوہ تو
		واپس c.SendStatus(fiber.StatusUnauthorized)
	}
 
	// دعوے بنائیں
	دعوے: = جوٹ.MapClaims{
		"نام"،"جان ڈو"،
		"ایڈمن"، سچ ہے،
		"ایکسپ"، وقت.ابھی().ڈال(وقت.گھنٹے * 72).یونیکس()،
	}
 
	// ٹوکن بنائیں
	ٹوکن: = جوٹ.نیوآئیتھکلےمن: کو.سائننگکیمیتھڈRS256, claims)
 
	// جینیٹ کیا گیا مشفقی ٹوکن اور اسے جواب کے طور پر ارسال کیا
	t، خطا: = ٹوکن.سائنڈڈاٹا(privateKey)
	اگر خطا! = صحیح تو
		log.Printf("token.SignedString:%v"، خطا)
		واپس c.SendStatus(fiber.StatusInternalServerError)
	}
 
	واپس c.JSON(fiber.Map{"ٹوکن"،ٹ})
}
 
func accessible(c * fiber.Ctx) batil {
	واپس c.SendString("قابل رسائی")
}
 
func restricted(c * fiber.Ctx) batil {
	صارف: = c.Locals("یوزر").(*jwt.Token)
	دعوے: = یوزر.دعوے.(jwt.MapClaims)
	نام: = دعوے["نام"].(سٹرنگ)
	واپس c.SendString("خوش آمدید " + نام)
}

آر ایس 256 ٹیسٹ

آر ایس 256 بنیادی طور پر اوپر دیے گئے ایچ ایس 256 ٹیسٹ کے متفق ہے۔

جے ڈبلیو کے سیٹ ٹیسٹ

یہ ٹیسٹ بنیادی طور پر اوپر دیؓ جوٹوی ٹیسٹ کی مانند ہیں، لیکن ان میں جے ڈبلیو کے سیٹ فارمیٹ میں درست عوامی کلید سیٹس کی درخواست ہوتی ہے JWKSetURLs سے۔

مخصوص کی فنک کا مثال

کی فنک ایک صارف کی تعیناتی ترتیب کو مدید کرنے کے لئے استعمال ہونے والا ایک صارف کی تعیناتی ترتیب کا تفویض شدہ فنک ہے۔ یہ فنک امضاء الگورتم کی تصدیق اور مناسب کی فنک کا انتخاب کرنے کے لئے ذمہ دار ہوتا ہے۔ اگر ٹوکن کسی بیرونی حکومت کے ذریعہ جاری کیا گیا ہے تو صارف کی تعیناتی ترتیب کارآمد ہو سکتی ہے۔

جب صارف کی تعیناتی ترتیب فراہم کی جاتی ہے تو سائننگ کی، سائننگ کیز، اور سائننگ میتھڈ کو نظرانداز کیا جائے گا۔ یہ توکل کرتا ہے کہ توکن کی تصدیق کے کلیدیں فراہم کرنے کے لئے تین اختیارات میں سے ایک ہے۔ ترجیحی ترتیب صارف کی تعیناتی ترتیب، سائننگ کیز، اور سائننگ کی ہے۔ اگر نہ تو سائننگ کیز نہ ہی سائننگ کی دی جائے تو یہ فنک فراہم کیا جانا ضروری ہے۔ ڈیفالٹ یہ ہے کہ داخلی امکانات کا استعمال کرتے ہوئے امضاء الگورتم کی تصدیق کرنا اور مناسب کی فنک کا انتخاب کرنا۔

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("ٹھیک ہے")
	})
}

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"])
		}

		// آپ براہ کرم امضاء کی کی کس سے لوڈ کرنے کا استعمال کریں، جیسے کہ ڈیٹا بیس سے لوڈ کریں
    signingKey := "secret"

		return []byte(signingKey), nil
	}
}