التحقق من JWT
بعد موافقة المستخدم على التحدي، يُصدر ZTXBAS رمز JWT موقّعًا بـES256 وقصير العمر ويعيده ضمن استجابة status. تشرح الصفحة محتواه وكيفية التحقق منه والفحوص اللازمة بعد صحة التوقيع.
شكل JWT
الرأس:
{ "alg": "ES256", "typ": "JWT", "kid": "abc123..." }
الحمولة (المطالبات):
{
"iss": "https://ztxbas.example.com",
"sub": "alice@example.com",
"aud": "https://app.example.com",
"iat": 1704067200,
"exp": 1704067500,
"email": "alice@example.com",
"origin": "https://app.example.com",
"challenge_id": "c_abc123"
}
subوemail— المستخدم الذي تمت مصادقته.audوorigin— الأصل الذي ارتبط به التحدي.challenge_id— معرّف ربط مستخدم مرة واحدة مفيد للسجلات.iatوexp— الإصدار والانتهاء (تفصل بينهما خمس دقائق).iss— خادم ZTXBAS الذي أصدر الرمز.
كيف تتحقق SDK من الرمز؟
تضم كل SDK مدققًا يقوم بالآتي بالترتيب:
- تحليل الأجزاء الثلاثة المشفرة بـbase64url.
- التأكد من
alg == ES256، ورفض أي قيمة أخرى بما فيهاnoneرفضًا قاطعًا لمنع استبدال الخوارزمية. - البحث عن
kidفي ذاكرة JWKS المؤقتة، وإعادة جلب/.well-known/jwks.jsonإن كان غير معروف أو قديمًا (صلاحية التخزين 5 دقائق). - التحقق من توقيع ES256 على
header + "." + payload. - التأكد من أن
expفي المستقبل (مع تفاوت ساعة ±30 ثانية). - التأكد من أن
iatليس بعيدًا في المستقبل (بالتفاوت نفسه). - إذا ضُبط
expected_issuer، التأكد من تطابقiss.
إذا فشلت أي خطوة، تعيد verify خطأً أو تثير استثناءً ويُرفض الرمز.
ما الذي ينبغي فحصه أيضًا؟
تثبت صحة التوقيع والانتهاء والجهة المُصدِرة أن الرمز تأكيد حقيقي وحديث من خادم ZTXBAS. وعلى نظامك الخلفي أيضًا فحص:
تطابق origin مع الأصل المتوقع. قد يكون المستخدم قد وافق بصورة شرعية على الدخول إلى موقع آخر تملكه، لكنك لا تريد استخدام JWT نفسه في مكان غير مقصود.
if claims.Origin != expectedOrigin {
return errors.New("token issued for a different origin")
}
عدم استخدام challenge_id مسبقًا. رموز JWT عديمة الحالة. إن شمل نموذج تهديدك سرقة JWT، فاحتفظ بذاكرة LRU صغيرة بمعرّفات التحديات المستخدمة حديثًا وارفض التكرار. قد لا يلزم ذلك في غالبية التكاملات عند إصدار ملف تعريف ارتباط جلسة حقيقي بعد التحقق مباشرةً والتخلص من JWT، لكن عمر الخمس دقائق يترك نافذة قصيرة للمهاجم.
التحقق دون SDK
إذا استخدمت بيئة لا نوفر لها SDK، فاستعمل مكتبة JWT مطابقة تدعم ES256 وJWKS. يُنشر JWKS في /.well-known/jwks.json بالشكل التالي:
{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"alg": "ES256",
"use": "sig",
"kid": "abc123...",
"x": "base64url...",
"y": "base64url..."
}
]
}
يبقى kid ثابتًا بعد إعادة التشغيل؛ فهو أول 16 حرفًا من SHA-256 المشفر بـbase64url للمفتاح العام بصيغة DER. وينتج الخادمان اللذان يشتركان في مفتاح التوقيع نفسه قيمة kid نفسها.
تدوير المفاتيح
قد يعيد JWKS أكثر من مفتاح عند تدوير مفتاح التوقيع. تُوقّع الرموز الجديدة بأحدث مفتاح، وتبقى القديمة قابلة للتحقق حتى exp، غالبًا ضمن خمس دقائق.
لا يحتاج المستهلكون إجراءً خاصًا، ما داموا يحترمون kid ويعيدون جلب JWKS عند ظهور معرّف غير معروف، فيصبح التدوير شفافًا.
موضوعات ذات صلة
- ربط الأصل — لماذا توجد مطالبة
origin. - دورة حياة التحدي — متى تحصل على JWT ومتى لا تحصل عليه.