لماذا ترفض الواجهة رمزًا لم تنتهِ صلاحيته؟
وقت الانتهاء ليس الشرط الوحيد. يشير aud إلى الجهة المستهدفة، وقد يكون نصًا واحدًا أو مصفوفة نصوص. يحدد iss الجهة المصدرة، بينما يعبّر sub عن صاحب المطالبات أو موضوعها. قد يكون الرمز مخصصًا لخدمة أخرى أصلًا.
هذه الحقول مطالبات داخل الرمز، وليست حقائق أثبتتها الأداة. قراءة المحتوى لا تثبت هوية مصدره. التطبيق أو البروتوكول هو الذي يحدد الحقول المطلوبة والقيم المقبولة.
الترويسة والحمولة والتوقيع
يتكوّن JWT الموقّع المعتاد من header.payload.signature. يحتوي أول جزأين على كائنات JSON بنص UTF-8 مرمّزة باستخدام Base64url. أما الجزء الأخير فيحتوي على بايتات توقيع أو MAC، وليس كائن JSON ثالثًا.
يمكن لصق الرمز وحده أو مع Bearer أو Authorization: Bearer. لا تلصق طلب HTTP كاملًا. يمكن نسخ كل من الترويسة والحمولة منفصلًا، وتبقى كتابة الأعداد الأصلية محفوظة، بما فيها المعرّفات الصحيحة الكبيرة.
قراءة exp بوحدة الثانية
يمثل exp وقت الانتهاء، وnbf بداية السماح بالاستخدام، وiat وقت الإصدار. تُفسّر هذه القيم بصيغة NumericDate، أي ثوانٍ منذ بداية حقبة Unix. مثلًا، 1704067200 يوافق 1 يناير 2024 الساعة 00:00 بتوقيت UTC، وليس قيمة بالملّي ثانية كما في JavaScript.
تستخدم المقارنة ساعة الجهاز دون هامش لاختلاف الساعات. وجود exp في المستقبل لا يثبت صحة التوقيع أو تطابق الجهة المستهدفة. كما أن وقت إصدار مستقبلي يُعرض كمعلومة للفحص، ولا ينتج عنه حكم شامل من الأداة.
فك الترميز ليس فك تشفير ولا تحققًا من التوقيع
Base64url طريقة تمثيل للبيانات، وليست وسيلة لإخفائها. لذلك يمكن قراءة JWT الموقّع دون معرفة السر. قبل قبول الرمز، يجب على الخدمة التحقق من حمايته التشفيرية بمفاتيح موثوقة وخوارزميات مسموحة، ثم فحص المطالبات المطلوبة. لا يكفي الاعتماد على alg الواردة في الرمز لتحديد الثقة.
لا تفتح الأداة عناوين المفاتيح ولا تستخدم مفاتيح مضمّنة. لا تدعم فك تشفير JWE ذي الأجزاء الخمسة أو JWT المتداخل أو b64: false. الحد الأقصى 50,000 محرف و64 مستوى JSON. تُرفض المفاتيح المكررة لتجنب تفسير الحقل بأكثر من طريقة.
تعلّم من الأمثلة
رمز منتهي الصلاحية
بيانات افتراضية وتوقيع توضيحي؛ ليس رمزًا صالحًا لتسجيل الدخول.
العودة إلى قارئ JWT ↑أسئلة شائعة
هل أحتاج إلى مفتاح سري لقراءة JWT؟
لا، إذا كان من ثلاثة أجزاء وكانت الترويسة والحمولة كائني JSON. قراءة Base64url لا تحتاج إلى مفتاح. أما التحقق التشفيري فيحتاج إلى مفتاح مناسب، وهو خارج وظائف هذه الأداة.
ما معنى alg: none؟
يعني أن الرمز غير محمي بتوقيع تشفيري. يبقى الجزء الثالث موجودًا لكنه فارغ، ولذلك يجب أن ينتهي الرمز بنقطة. إمكانية قراءته لا تجعله موثوقًا للمصادقة.
هل تحفظ الأداة الرمز؟
تُعالج المدخلات في المتصفح، ولا تُرسل إلى API لفك الترميز، ولا تُحفظ بواسطة الأداة أو تُضاف إلى عنوان الصفحة. قد يمنح رمز Bearer حقيقي صلاحية وصول؛ استخدم الأمثلة الافتراضية عند التجربة.
هل تصلح الأمثلة لتسجيل الدخول؟
لا. مثال الرمز المنتهي يحمل exp يوافق 1 يناير 2024 الساعة 01:00 UTC وتوقيعًا توضيحيًا. مثال Unicode يعرض نصوصًا بلغات مختلفة وعدة جهات مستهدفة بتوقيع توضيحي أيضًا. المثال بلا توقيع يستخدم alg: none.
كيف أصحح خطأ التنسيق؟
تحقق من اكتمال الأجزاء الثلاثة وعدم وجود مسافات أو اقتباسات أو حشو زائد. يجب أن يكون أول جزأين كائني JSON بترميز UTF-8. تُرفض المفاتيح المكررة والتواقيع الفارغة المخالفة لقيمة alg. وقد تشير خمسة أجزاء إلى JWE مشفّر.
