مصحّح JWT
خطأ 401 مع رمز يبدو سليمًا يعود دائمًا تقريبًا إلى واحد من ستة أسباب. تعرض هذه الصفحة الرمز كما يقرأه الخادم، لتعرف أيها السبب.
وقّع رمزًا خاصًا بك لاختبار نقطة نهاية. كل شيء يُحسب داخل هذه الصفحة.
يبقى المفتاح والرمز الناتج داخل متصفحك: لا يُرسل أي منهما إلى أي مكان، ولا يظهران في رابط المشاركة.
تحقّق من هذا الرمز داخل الكود الخاص بك. يتبع المقتطف الخوارزمية المذكورة في الترويسة.
تصحيح رمز JSON Web Token يجري رفضه
تفشل الرموز بعدد قليل من الطرق، ولا شيء منها ظاهر في الرمز نفسه — فهو ثلاث كتل Base64URL تفصلها نقاط. الصقه هنا فيصير شيئًا يمكن مجادلته: كل حقل في الترويسة وكل مطالبة، في جدول يقول ما فائدة كل منها، مع انتهاء الصلاحية مترجمًا إلى كلمات واضحة، والتوقيع مفحوصًا بأي مفتاح لديك.
يُفَكّ الترميز أثناء الكتابة، ولا يُرسل شيء إلى أي مكان. ويستحق هذا أن يُقال بصراحة في صفحة كهذه، لأن ما توشك على لصقه اعتماد عامل لحساب شخص ما.
الأعطال الستة، بالترتيب الذي يوفّر وقتك
| ما الذي أخفق | كيف يظهر هنا | العلاج |
|---|---|---|
| انتهت الصلاحية | السطر فوق الترويسة يقول «انتهت صلاحيته» | جدّد الرمز؛ وإن كان الفارق ثوانيَ فافحص الساعات |
| جمهور خاطئ | aud يسمّي واجهة أخرى | اطلب الرمز للجمهور الذي تتوقعه الواجهة |
| مُصدِر خاطئ | iss هو رابط بيئة الاختبار لا الإنتاج | وجّه العميل إلى المُصدِر الصحيح، أو الواجهة إلى مُصدِرها |
| مفتاح خاطئ | التحقّق يقول إن التوقيع غير مطابق | استخدم المفتاح الذي وقّعت به الجهة المُصدِرة؛ وانتبه للأسرار بصيغة Base64 |
| خوارزمية خاطئة | الترويسة تقول ES256 ومفتاحك من نوع RSA | وفّق بين المفتاح والخوارزمية الظاهرة بجانب حقل المفتاح |
| ليس JWS أصلًا | تسمّيه الصفحة JWE من خمسة أجزاء | الحمولة مشفَّرة؛ اقرأها حيث يوجد مفتاح فك التشفير |
الترتيب مهم. فانتهاء الصلاحية والجمهور لا يحتاجان مفتاحًا ولا تعاون أحد، ويُستبعدان في ثوانٍ؛ أما مطاردة مشكلة توقيع تتبيّن في النهاية أنها aud غير مطابقة فهي الطريقة التي يضيع بها العصر كله.
القراءة ليست تحقّقًا
هذا هو التمييز الذي يوقع الناس. فكّ الترميز يقول لك ما يدّعيه الرمز؛ ولا يقول شيئًا عن صدق الادعاء، لأن الترويسة والحمولة مرمَّزتان لا مشفَّرتان، وبإمكان أي أحد أن يكتب مثلهما. أما التحقّق فهو إعادة حساب التوقيع بسرّ الجهة المُصدِرة أو مفتاحها العام — وهو ما تفعله هذه الصفحة داخل متصفحك — وهو الخطوة الوحيدة التي تحوّل الادعاء إلى حقيقة.
استعمل إذن العرض المفكوك لتكوين فرضية، وزر التحقّق لاختبارها، ولا تدع قرار تخويل في شيفرتك يستند إلى محتوى مفكوك الترميز. ولهذا السبب تحديدًا يطبع تبويب «كود» فحص جانب الخادم بثماني لغات. وإن كان الترميز نفسه هو ما يحيّرك، يشرح الفرق بين Base64 وBase64URL لماذا لا يمكن لصق جزء من JWT في مفكِّك Base64 عادي.
أمور تبدو مشكلات في الرمز وليست كذلك
- كلمة
Bearerمنسوخة مع الرمز، أو سطر جديد جاء من الطرفية — كلاهما يغيّر المدخل الموقَّع ويكسر التوقيع. - رمز قصّه عارض السجلات. فطول جزء التوقيع ثابت لكل خوارزمية، والرمز المبتور يفشل دائمًا.
- خدمتان تتشاركان سرًّا وإحداهما تخزّنه بصيغة Base64. علّم السرّ بصيغة Base64 لتحاكي ذلك الجانب.
- قيمة
kidلم تعد موجودة لأن الجهة المُصدِرة دوّرت مفاتيحها؛ فالرمز سليم ومجموعة المفاتيح قديمة.
ومتى بُرِّئ الرمز نفسه، بقي المشتبه بهم في الخادم: وسيط برمجي لا يتحقق أبدًا، وساعة تنحرف، وذاكرة مؤقتة تحتفظ بمجموعة مفاتيح قديمة. وإن احتجت رمزًا في حالة معلومة لاختبار أي من ذلك — منتهيًا أو صالحًا أو موقَّعًا بمفتاح تملكه — يبنيه مولّد JWT، ويشرح فاحص انتهاء الصلاحية كيف يقرأ المتحقِّق مطالبات الوقت.