"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إنشاء مجموعة مطالبات JWT صالحة

إنشاء مجموعة مطالبات JWT صالحة

تم النشر بتاريخ 2024-11-04
تصفح:445

Building a valid JWT Claims Set

مقدمة

كنت بحاجة إلى مراجعة طلب سحب كان يعمل على إصلاح مشكلة تم الإبلاغ عنها في عينة، وأثناء اجتياز الاختبارات، شعرت أنه يجب أن يكون هناك شيء آخر يحدث في العينة يحتاج إلى التغيير.

لقد عرفت عن JSON Web Tokens (تُنطق JWTs "jots") منذ فترة، ولا أعرفها. لقد أعطتني رؤية هذه العلاقات العامة سببًا للتعمق فيها أكثر.

ما هي JWTs

تعد JWTs طريقة قياسية مفتوحة لنقل المعلومات بشكل آمن بين الأطراف. يتم استخدامها غالبًا لمصادقة المستخدمين والسماح بالوصول إلى الموارد. وهي تتكون من 3 أجزاء، الرأس والحمولة والتوقيع.

لماذا تحتاج JWTs

تقوم واجهة برمجة تطبيقات بيانات اعتماد حساب خدمة IAM بإنشاء بيانات اعتماد قصيرة الأجل لانتحال صفة حسابات خدمة IAM. ستقوم طريقة SignJwtmethod بتوقيع JWT باستخدام المفتاح الخاص المُدار بواسطة النظام الخاص بحساب الخدمة. ضمن نص طلب طريقة SignJwt، يجب أن يحتوي حقل الحمولة على كائن JSON متسلسل يحتوي على مجموعة مطالبات JWT.

ما هي مطالبات JWT

المطالبات هي المعلومات الأساسية التي ينقلها JWT.

إليك مثال لمجموعة مطالبات صالحة:

{
  "iss": "https://cloud.google.com/iam",
  "sub": "projects/-/serviceAccounts/[email protected]",
  "aud": "https://my-iap-protected-app.example.com",
  "iat": 1694003600,
  "exp": 1694007200
}

تتضمن مجموعة المطالبات هذه الحقول التالية:

  • iss: مُصدر JWT، حساب الخدمة الذي سيتم المصادقة عليه، في هذه الحالة يجب أن يكون البريد الإلكتروني لحساب الخدمة.
  • sub: موضوع المستخدم في JWT، وهو البريد الإلكتروني لحساب الخدمة.
  • aud: جمهور JWT، وهو عنوان URL للمورد المحمي بواسطة IAP.
  • iat: تم إصداره في الوقت المحدد، وهو الوقت الذي تم فيه إنشاء JWT. يجب أن يكون هذا عددًا صحيحًا بالتوقيت العالمي المنسق (UTC).
  • exp: وقت انتهاء الصلاحية، وهو الوقت الذي لن يكون فيه JWT صالحًا. هناك قيود إضافية توثقها Cloud IAM: ألا تكون في الماضي ولا تزيد عن 12 ساعة في المستقبل.

من خلال تضمين هذه المطالبات في حمولة JWT، يمكنك التأكد من صلاحيتها وإمكانية استخدامها للوصول إلى الموارد المحمية بواسطة IAP.

إذن بخصوص تلك العلاقات العامة

الرمز الأصلي يشبه

    iat = datetime.datetime.now(tz=datetime.timezone.utc)
    exp = iat   3600
    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": iat,
            "exp": exp,
        }
    )

أعلم أن هناك شيئًا ما في الاختبار ولكني لا أرغب في منع حل المشكلة الأساسية باستخدام هذا الرمز.

أرسل مؤلف العلاقات العامة التغيير

iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()

يبدو أن هذا سيكون إصلاحًا غير كامل. استنادًا إلى وثائق واجهة برمجة التطبيقات (API)، أدركت أن الإصلاح المقدم لا يزال غير قادر على تعيين iat لكتابة int وسيظل فاشلاً. اقترحت تغييرًا طفيفًا من شأنه أن يحل مشكلة العلاقات العامة الخاصة بـ

now_utc = datetime.datetime.now(tz=datetime.timezone.utc)  
iat = int(now_utc.timestamp())

كلما فكرت في الأمر أكثر، أدركت أن Datetime ليس مفيدًا لهذه العينة. توفر وحدة Datetime فئات لمعالجة التواريخ والأوقات والتي تكون مفيدة عندما تريد التواريخ. نحتاج فعليًا إلى عدد صحيح بالتوقيت العالمي المنسق (UTC)، لذا تكون وحدة الوقت أكثر فائدة.

إنستاد، يمكننا القيام بذلك

  now = int(time.time())

    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": now,
            "exp": now   3600,
        }
    )

ابحث عن الكود الكامل (المحدث!) لهذه العينة هنا.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/sigje/building-a-valid-jwt-claims-set-4l58?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3