فائبر 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
}
}