مولّد JWT
وقّع رمز JSON Web Token خاصًا بك لاختبار نقطة نهاية، بالخوارزميات الاثنتي عشرة نفسها التي يستخدمها مُصدِر حقيقي، ومن دون أن يغادر المفتاح متصفحك.
وقّع رمزًا خاصًا بك لاختبار نقطة نهاية. كل شيء يُحسب داخل هذه الصفحة.
يبقى المفتاح والرمز الناتج داخل متصفحك: لا يُرسل أي منهما إلى أي مكان، ولا يظهران في رابط المشاركة.
تحقّق من هذا الرمز داخل الكود الخاص بك. يتبع المقتطف الخوارزمية المذكورة في الترويسة.
إنشاء رمز JSON Web Token موقَّع
أغلب العمل مع الرموز هو قراءتها، وهذا ما تفعله أداة فك ترميز JWT. وأحيانًا تحتاج الاتجاه الآخر: رمزًا لم يوجد بعد، لترى كيف تتصرف الخدمة معه. واجهة اختبار ترفض كل شيء، وسيط برمجي تكتبه الآن، بيانات اختبار يجب أن تنتهي صلاحيتها بعد خمس دقائق — كلها تحتاج رمزًا تتحكم به أنت، وهذا ما توقّعه هذه الصفحة.
تفتح على تبويب إنشاء رمز. وكل ما فيه — قائمة الخوارزميات والحمولة والمفتاح — يجمّعه متصفحك ويوقّعه عبر crypto.subtle.sign. لا يُرسَل أي طلب إلى خادم في أي لحظة، فالمفتاح الذي تلصقه يبقى خاصًا بقدر خصوصية التبويب الذي كُتب فيه.
ما ينتهي إليه محتوى الترويسة والحمولة
تُكتب الترويسة نيابةً عنك: الخوارزمية التي اخترتها وtyp: "JWT"، ويضاف kid إن ملأت ذلك الحقل. ومعرّف المفتاح يهم حين تحتفظ الخدمة المستقبِلة بعدة مفاتيح وتختار واحدًا بالاسم؛ واتركه فارغًا تبقَ الترويسة بحقلين.
الحمولة لك. مطالبتان ليستا كذلك: يضع التوقيع دائمًا iat بالوقت الحالي، ويضبط exp من قائمة تنتهي صلاحيته بعد — خمس دقائق أو ساعة أو يوم أو ثلاثين يومًا أو لا شيء. وحين يظهر الرمز يُعاد كتابة صندوق الحمولة بما وُقِّع تمامًا، فالأوقات التي تراها هي الأوقات التي بداخله. وإن كانت هاتان المطالبتان محور اختبارك، يشرح فاحص انتهاء الصلاحية كيف يقرأهما الخادم.
اختيار الخوارزمية
تنقسم الخوارزميات الاثنتا عشرة إلى عائلتين، والفرق ليس في القوة بل في مَن عليه أن يحتفظ بالمفتاح.
| العائلة | المفتاح الذي تلصقه | استخدمها حين |
|---|---|---|
| HS256 / HS384 / HS512 | سرّ مشترك، نصًّا أو بصيغة Base64 | خدمة واحدة تُصدر رموزها وتتحقق منها بنفسها |
| RS256 / RS384 / RS512 | مفتاح خاص PKCS#8 (PEM) أو JWK | خدمات كثيرة تتحقق، ولا ترى سوى النصف العام |
| PS256 / PS384 / PS512 | المفتاح الخاص نفسه من نوع RSA | RSA بحشوة PSS الأحدث، حين يطلبها الطرف المستقبِل |
| ES256 / ES384 / ES512 | مفتاح خاص EC على P-256 / P-384 / P-521 | تريد توقيعات قصيرة ومفاتيح صغيرة |
اختير HS256 افتراضيًا لأنه ما يجري اختباره عادةً: سرّ في متغيّر بيئة، وخدمة واحدة على الطرفين. وما إن تحتاج أكثر من خدمة إلى فحص الرمز، تصبح خوارزمية المفتاح العام الشكل الأنسب، إذ لا يُسلَّم المتحقِّق أبدًا ما يمكّنه من إصدار رموز.
ما ينفع فيه الرمز المولَّد وما لا ينفع
الرمز الموقَّع هنا رمز حقيقي: الصقه في أداة فك الترميز أعلاه، واضغط تحقّق من التوقيع بالمفتاح نفسه فيصحّ التوقيع، لأن الصفحة تحسبه كما تحسبه أي مكتبة. وهذا يجعله صالحًا لبيانات الاختبار، ولإعادة إنتاج خلل برمز منتهٍ أو غير صالح بعد، ولمعرفة هل يتحقق وسيطك البرمجي من aud فعلًا أم يكتفي بقراءته.
أما ما ليس هو، فهو طريق دخول. لا يقبل الرمزَ إلا خدمة تملك المفتاح المقابل، فتوقيع رمز بسرّك أنت لا يثبت شيئًا لأحد آخر. هذا هو عمل التوقيع كله، ولهذا ينتهي الفرق بين الرمز وكعكة الجلسة إلى سؤال: مَن عليه أن يخزّن ماذا.
المفاتيح والصيغ والأخطاء التي تسببها
في عائلة HS، الصق السرّ نصًّا كما هو، أو علّم السرّ بصيغة Base64 إن كان إعدادك يخزّنه مرمَّزًا: النصّ نفسه، خامًا ومفكوك الترميز، يعطي توقيعين مختلفين تمامًا، وهذا سبب شائع لأن ينجح رمز في مكان ويفشل في آخر.
ولـ RS وPS وES يقبل المتصفح ملف PEM من نوع PKCS#8 — الكتلة التي تبدأ بـ -----BEGIN PRIVATE KEY----- — أو JWK، وهي صيغة JSON التي تُوزَّع بها مجموعات المفاتيح. أما الكتلة الأقدم -----BEGIN RSA PRIVATE KEY----- فهي PKCS#1 ويجب تحويلها أولًا. وإن لصقت مفتاحًا عامًا سهوًا قالت لك الصفحة ذلك بدل أن تفشل برسالة غامضة، لأن المفتاح العام يتحقق من توقيع ولا ينشئه أبدًا.