كنت بحاجة إلى مراجعة طلب سحب كان يعمل على إصلاح مشكلة تم الإبلاغ عنها في عينة، وأثناء اجتياز الاختبارات، شعرت أنه يجب أن يكون هناك شيء آخر يحدث في العينة يحتاج إلى التغيير.
لقد عرفت عن JSON Web Tokens (تُنطق JWTs "jots") منذ فترة، ولا أعرفها. لقد أعطتني رؤية هذه العلاقات العامة سببًا للتعمق فيها أكثر.
تعد JWTs طريقة قياسية مفتوحة لنقل المعلومات بشكل آمن بين الأطراف. يتم استخدامها غالبًا لمصادقة المستخدمين والسماح بالوصول إلى الموارد. وهي تتكون من 3 أجزاء، الرأس والحمولة والتوقيع.
تقوم واجهة برمجة تطبيقات بيانات اعتماد حساب خدمة IAM بإنشاء بيانات اعتماد قصيرة الأجل لانتحال صفة حسابات خدمة IAM. ستقوم طريقة SignJwtmethod بتوقيع JWT باستخدام المفتاح الخاص المُدار بواسطة النظام الخاص بحساب الخدمة. ضمن نص طلب طريقة SignJwt، يجب أن يحتوي حقل الحمولة على كائن JSON متسلسل يحتوي على مجموعة مطالبات 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 }
تتضمن مجموعة المطالبات هذه الحقول التالية:
من خلال تضمين هذه المطالبات في حمولة 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, } )
ابحث عن الكود الكامل (المحدث!) لهذه العينة هنا.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3