JWT کی تعارف

JWT (JSON ویب ٹوکن) ویب پر تصدیق کے لیے ایک مختصر اور خود مکمل ترکیب ہے۔ اس کا تین حصے ہوتے ہیں: ہیڈر، پیماؤ، اور سرٹیفکیٹ۔ ہیڈر ٹوکن کی قسم اور انکرپشن الگورتھم کی معلومات شامل کرتا ہے، پیماؤ میں ڈیٹا (عام طور پر کچھ اجازت کی معلومات اور صارف کی شناخت شامل ہوتی ہے) شامل ہوتا ہے، اور سرٹیفکیٹ ٹوکن کی سلامتی اور درستگی کی تصدیق کے لیے استعمال ہوتا ہے۔

JWT عموماً دو مواقع پر استعمال ہوتا ہے:

  1. تصدیق: جب صارف لاگ ان کرتا ہے، ہر دوسری درخواست میں ایک JWT شامل ہوگا، جس سے صارف کو اجازت دی جاتی ہے کے وہ مخصوص راستوں، خدمات، اور وسائل تک پہنچ سکے۔
  2. معلومات تبادلہ: JWT معلومات کو محفوظ طریقے سے پارٹیوں کے درمیان منتقل کرنے کا ایک اچھا طریقہ ہے، کیونکہ یہ دیجیٹلی سائن کیا جا سکتا ہے، مثلاً عوام/خفیہ کلید جوڑوں کا استعمال کرتے ہوئے۔

JWT ڈیٹا فارمیٹ

JWT معلومات کو بارتری کرنے کا ایک مختصر، یو آر ایل-محفوظ طریقہ ہے۔ ایک JWT فی الحقیقت تین حصوں سے مشتمل ہوتا ہے، جو کے دوٹس (.) سے الگ ہوتے ہیں، یعنی ہیڈر.پیماؤ.سرٹیفیکیٹ۔ اگلے میں ہم ان تین حصوں کے ڈیٹا فارمیٹ کی تفصیلی تفصیلات فراہم کریں گے۔

1. ہیڈر

عام طور پر ہیڈر دو حصوں پر مشتمل ہوتا ہے: ٹوکن کی قسم - عموماً JWT، اور سرٹیفکیشن یا انکرپشن الگورتھم جو استعمال ہو رہا ہے، جیسے HMAC SHA256 یا RSA۔ ہیڈر JSON میں پیش کیا جاتا ہے اور پھر Base64Url کا استعمال کرکے ایک سٹرنگ میں نمائندگی کی جاتی ہے۔ مثال کے طور پر:

{
  "alg": "HS256",
  "typ": "JWT"
}

انکوڈنگ کے بعد، آپ ایک اس شبہ طرح کی اسٹرنگ حاصل کر سکتے ہیں:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

2. پیماؤ

پیماؤ میں ایک سلسلہ کلیمز شامل ہوتے ہیں، جو افراد (عام طور پر صارف) کے بارے میں معلومات اور دیگر ڈیٹا کے بارے میں ہوتے ہیں۔ پیماؤ میں متعدد پیش فرضی دعوے (جو خصوصی دعوے کے طور پر معلوم ہوتے ہیں) اور کسٹم دعوے (نجی دعوے) شامل ہوسکتے ہیں۔

پیش فرضی دعوے شامل ہوسکتے ہیں:

  • iss (Issuer): جاری کنندہ
  • exp (Expiration Time): معیاد وقت
  • sub (Subject): موضوع
  • aud (Audience): سامع
  • iat (Issued At): جاری کرنے کا وقت
  • nbf (Not Before): لاگو ہونے کا وقت
  • jti (JWT ID): JWT کی یکتا شناخت

ایک مثال پیماؤ مندرجہ ذیل لگ سکتا ہے (JSON فارمیٹ میں):

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}

یہ معلومات بھی Base64Url کے ساتھ انکوڈ ہو جائیں گی، اور آپ حاصل کر سکتے ہیں ایک اس شبہ طرح کی اسٹرنگ:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0

3. سرٹیفکیٹ

سرٹیفکیٹ سیکشن دو انکوڈ شدہ اسٹرنگس کو معیاری کرنے کے لیے استعمال ہوتا ہے، تاکہ یہ یقینی بنایا جا سکے کے پیغام کو منتقل کرتے وقت اس میں کوئی تداخل نہیں ہوا ہے۔ پہلے، آپ کو ایک کلید کا تعین کرنا ہوگا (اگر آپ HMAC SHA256 الگورتھم کا استعمال کر رہے ہیں)، پھر ہیڈر میں مقرر الگورتھم کا استعمال کرکے ہیڈر اور پیماؤ کو سائن کرنا ہوگا۔

مثال کے طور پر، اگر آپ کے پاس مندرجہ ذیل ہیڈر اور پیماؤ ہیں:

HeaderEncoded.HeaderPayload

اُنہیں ایک کلید کا استعمال کرکے سائن کرنے کے لیے پسیوکوڈ ہو سکتا ہے:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey)

حاصل سائن شدہ اسٹرنگ مندرجہ ذیل ہو سکتی ہے:

dBjftJeZ4CVPmTaoyL4IiArYfL4kH0jOspm6XwbcJXY

مکمل JWT

ان تین حصوں کو ایک دوٹ (.) سے الگ کرکے مکمل JWT بنا سکتے ہیں:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.dBjftJeZ4CVPmTaoyL4IiArYfL4kH0jOspm6XwbcJXY

JWT معیاری انتہائی لچکدار ہے اور پیماؤ (مگر JWT سائز کو کم کرنے کے مقصد کے لیے اور سیکیورٹی کے باعث، حساس معلومات کو ذخیرہ نہیں کیا جانا چاہئے)میں آپ کی ضرورت کی کسی بھی معلومات کو ذخیرہ کر سکتا ہے، اور اس معلومات کی سلامتی کو سرٹیفکیٹ کے ذریعے یقینی بناتا ہے۔

گو JWT لائبریری کا انسٹال کرنا

گو کمیونٹی نے JWT کے لیے ایک پیکیج github.com/golang-jwt/jwt فراہم کیا ہے۔ اس لائبریری کا انسٹال کرنا بہت آسان ہے، صرف منتخب کردہ پروجیکٹ ڈائریکٹری میں مندرجہ ذیل کمانڈ چلائیں:

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

ایک بار انسٹال ہونے کے بعد، آپ اسے مندرجہ ذیل import کے اندر شامل کر سکتے ہیں:

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

ایک سادہ ٹوکن بنانا

گو لینگویج اور HS256 الگورتھم کا استعمال کرکے ایک سادہ JWT ٹوکن بنانے کے لیے، آپ کو مندرجہ ذیل اقدامات کرنے ہوں گے:

پہلے، HS256 الگورتھم کا استعمال کرتے ہوئے ایک نیا ٹوکن آبجیکٹ تیار کریں:

token := jwt.New(jwt.SigningMethodHS256)

پھر، SignedString میتھڈ کا استعمال کرکے اس ٹوکن کا ایک سٹرنگ نمائندہ بنائیں، جس میں آپ وہ خفی کلید استعمال کریں گے جس کو آپ سائننگ کے لیے استعمال کریں گے۔

var mySigningKey = []byte("your-256-bit-secret")
strToken, err := token.SignedString(mySigningKey)
if err != nil {
    log.Fatalf("An error occurred: %v", err)
}
fmt.Println(strToken)

یہ ایک سادہ ٹوکن بنائے گا بغیر کسی دعویٰ کے۔

پیرامیٹرز کے ساتھ ٹوکن بنانا

JWT کا ایک اہم فعل معلومات کو برسانا ہے۔ یہ معلومات کلیمز کے ذریعے ٹوکن میں کوڈ کی جاتی ہے۔ مثال کے طور پر، چلائیں کسی استعمال کردہ کلیمز کو بناتے ہیں:

// کسٹم کلیمز ساختار
type MyClaims struct {
	jwt.RegisteredClaims
	Username string `json:"username"`
	Admin    bool   `json:"admin"`
}

// کسٹم کلیمز کے ساتھ ایک ٹوکن بنائیں
claims := MyClaims{
    RegisteredClaims: jwt.RegisteredClaims{},
    Username: "my_username",
	Admin: true,
}

token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

// سائننگ کے لیے خفی کلید
var mySigningKey = []byte("your-256-bit-secret")

// ٹوکن کو سٹرنگ فارمیٹ میں بنانا
strToken, err := token.SignedString(mySigningKey)
if err != nil {
    log.Fatalf("Error occurred: %v", err)
}

fmt.Println(strToken)

مذکورہ بالا کوڈ میں، ہم نے MyClaims سٹرکچر کو تعارف دیا ہے تاکہ اس میں رجسٹرڈ کلیمز کے ساتھ کچھ کسٹم معلومات ہوں۔ پھر ہم نے SignedString کا استعمال کرکے ٹوکن سٹرنگ بنائی ہے۔

ٹوکن کو پارس کرنا اور تصدیق کرنا

JWT کو پارس اور تصدیق کرنا بہت اہم ہے، اور آپ مندرجہ ذیل طریقے سے کر سکتے ہیں:

// ہم وہی میں MyClaims سٹرکچر استعمال کریں گے
tokenString := "your-JWT-string"

// ہمیں وہ ایک فنکشن دیتے ہیں جو jwt پیکیج استعمال کرے گا تاکہ وہ tokenString کو پارس کرے
keyFunc := func(t *jwt.Token) (interface{}, error) {
	// یہ تصدیق کریں کہ متوقع سائننگ میتھڈ استعمال ہو رہا ہے
	if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
	    return nil, fmt.Errorf("Unexpected signing method: %v", t.Header["alg"])
	}
	// jwt ٹوکن کے لیے خفی کلید کو واپسی کریں، یہ []byte فارمیٹ میں ہو گا، جو سائننگ کے لیے پہلے استعمال کیا گیا تھا
	return mySigningKey, nil
}

// ٹوکن کو پارس کرنا
claims := &MyClaims{}
parsedToken, err := jwt.ParseWithClaims(tokenString, claims, keyFunc)
if err != nil {
	log.Fatalf("Parsing error: %v", err)
}

if !parsedToken.Valid {
    log.Fatalf("Invalid Token")
}

// اس مرحلہ پر، parsedToken کی تصدیق ہو چکی ہے، اور ہم کلیمز کو پڑھ سکتے ہیں
fmt.Printf("User: %s, Admin: %v\n", claims.Username, claims.Admin)

مذکورہ بالا کوڈ میں، ہم نے ٹوکن سٹرنگ، MyClaims انسٹنس، اور keyFunc فنکشن کو jwt.ParseWithClaims فنکشن کو فراہم کیا ہے۔ یہ فنکشن سگنیچر کی تصدیق کرتا ہے اور ٹوکن کو پارس کرتا ہے، اگر ٹوکن درست ہو تو claims متغیر کو معلومات سے بھرے گا۔