النشر الآمن لتشغيل السحابة الإلكترونية

1. نظرة عامة

سيكون عليك تعديل الخطوات التلقائية لنشر خدمة في Cloud Run لتحسين مستوى الأمان، ثم الاطّلاع على كيفية الوصول إلى التطبيق المنشور بطريقة آمنة. التطبيق هو "خدمة تسجيل للشركاء" من تطبيق Cymbal Eats، الذي تستخدمه الشركات التي تعمل مع Cymbal Eats لمعالجة طلبات الطعام.

ما سوف تتعلمه

يمكنك زيادة أمان التطبيق بشكل كبير من خلال إجراء بعض التغييرات الصغيرة على الحد الأدنى من الخطوات التلقائية لنشر تطبيق في Cloud Run. ستتّبع تعليمات حالية بشأن التطبيق والنشر وستغيّر خطوات النشر لتحسين مستوى أمان التطبيق المنشور.

ستظهر لك بعد ذلك كيفية منح إذن الوصول إلى التطبيق وتقديم طلبات مسموح بها.

وهذه ليست نظرة شاملة على أمان نشر التطبيقات، ولكنها تهدف إلى إلقاء نظرة على التغييرات التي يمكنك إجراؤها على جميع عمليات نشر التطبيقات المستقبلية من أجل تحسين مستوى الأمان بمجهود قليل.

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بالكامل. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. وفي هذه الحالة، انقر على متابعة (ولن تظهر لك مرة أخرى). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:

9c92662c6a846a5c.png

من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.

9f0e51b578fecce5.png

يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير التي تحتاجها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.

بعد الربط بخدمة Cloud Shell، من المفترض أن يظهر لك أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.

  1. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list

مخرجات الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

إعداد البيئة

ستقوم بتشغيل أوامر في سطر أوامر Cloud Shell لهذا التمرين المعملي. ويمكنك عادةً نسخ الأوامر ولصقها كما هي، ولكن في بعض الحالات ستحتاج إلى تغيير قيم العناصر النائبة إلى قيم صحيحة.

  1. اضبط متغيّر بيئة على رقم تعريف المشروع لاستخدامه في الأوامر اللاحقة:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
  1. فعِّل واجهة برمجة التطبيقات لخدمة Cloud Run التي ستعمل على تشغيل تطبيقك، وواجهة برمجة تطبيقات Firestore التي ستوفّر مساحة تخزين بيانات NoSQL، وواجهة برمجة التطبيقات Cloud Build API التي سيتم استخدامها من خلال أمر النشر، و Artifact Registry الذي سيتم استخدامه للاحتفاظ بحاوية التطبيق عند إنشائها:
gcloud services enable \
  run.googleapis.com \
  firestore.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  1. تهيئة قاعدة بيانات Firestore في وضع Native. يستخدم هذا الأمر واجهة برمجة تطبيقات App Engine، لذلك يجب تفعيله أولاً.

يجب أن يحدد الأمر منطقة لـ App Engine والتي لن نستخدمها لكن يجب إنشاؤها لأسباب تاريخية، ومنطقة لقاعدة البيانات. سنستخدم us-central لـ App Engine، وnam5 لقاعدة البيانات. nam5 هو موقع جغرافي متعدّد المناطق في الولايات المتحدة. تؤدي المواقع الجغرافية المتعددة المناطق إلى زيادة مدى توفّر قاعدة البيانات ومتانتها إلى أقصى حد.

gcloud services enable appengine.googleapis.com

gcloud app create --region=us-central
gcloud firestore databases create --region=nam5
  1. استنسِخ نموذج مستودع التطبيقات وانتقِل إلى الدليل.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service

3- مراجعة الملف التمهيدي

افتح المحرر وانظر إلى الملفات التي يتضمنها التطبيق. راجع README.md، الذي يوضح الخطوات اللازمة لنشر هذا التطبيق. قد تتضمن بعض هذه الخطوات قرارات أمان ضمنية أو صريحة يجب أخذها في الاعتبار. عليك تغيير بعض هذه الخيارات لتحسين مستوى الأمان في تطبيقك المنشور، كما هو موضَّح هنا:

الخطوة 3 - تشغيل "npm install"

من المهم معرفة مصدر وسلامة أي برنامج تابع لجهة خارجية يتم استخدامه في أي تطبيق. ترتبط إدارة أمان سلسلة إمداد البرامج بتصميم أي برامج، وليس فقط التطبيقات التي يتم نشرها في Cloud Run. ويركز هذا التمرين على النشر، لذا فهو لا يتناول هذا المجال، ولكنك قد تحتاج إلى البحث عن الموضوع بشكل منفصل.

الخطوتان 4 و5 - تعديل deploy.sh وتشغيله

تؤدي هذه الخطوات إلى نشر التطبيق في تشغيل السحابة الإلكترونية مع ترك معظم الخيارات وفقًا للإعدادات التلقائية. ستُعدِّل هذه الخطوة لجعل عملية النشر أكثر أمانًا بطريقتَين رئيسيتَين:

  1. لا تسمح بالوصول غير المُصدَّق عليه. قد يكون من السهل السماح بذلك أثناء تجربة الاستكشاف، ولكنّ هذه خدمة ويب يمكن للشركاء التجاريين استخدامها، ويجب أن تصادق المستخدمين دائمًا.
  2. حدِّد أنّ التطبيق يجب أن يستخدم حساب خدمة مخصّصًا تم تصميمه بالامتيازات الضرورية فقط، بدلاً من استخدام حساب تلقائي من المرجح أن يحتوي على قدر أكبر من اللازم من الوصول إلى واجهة برمجة التطبيقات والموارد. يُعرف ذلك باسم مبدأ الحدّ الأدنى من الأذونات المميّزة، وهو مفهوم أساسي لأمان التطبيقات.

الخطوات من 6 إلى 11 - تقديم نماذج لطلبات الويب للتحقق من السلوك الصحيح

وبما أنّ نشر التطبيق يتطلب الآن مصادقة، يجب أن تتضمّن هذه الطلبات الآن إثباتًا لهوية مقدّم الطلب. وبدلاً من تغيير هذه الملفات، ستُجري الطلبات مباشرةً من سطر الأوامر.

4. نشر الخدمة بأمان

تم رصد تغييرَين حسب الحاجة في النص البرمجي لـ deploy.sh: عدم السماح بالوصول غير المُصدَّق عليه، واستخدام حساب خدمة مخصّص مع الحدّ الأدنى من الامتيازات.

ستُنشئ حساب خدمة جديدًا أولاً، ثم تعدِّل النص البرمجي "deploy.sh" للإشارة إلى حساب الخدمة هذا ومنع الوصول غير المُصدَّق عليه، ثم انشر الخدمة من خلال تشغيل النص البرمجي المُعدَّل قبل أن نتمكّن من تشغيل النص البرمجي "publish.sh" المُعدَّل.

أنشِئ حساب خدمة وامنحه الإذن بالوصول المطلوب إلى Firestore/Datastore.

gcloud iam service-accounts create partner-sa

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:partner-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role=roles/datastore.user

تعديل deploy.sh

عدِّل ملف deploy.sh لمنع الوصول غير المُصدَّق عليه(–no-allow-unauthenticated)، وتحديد حساب الخدمة الجديد (-service-account) للتطبيق المنشور. صحِّح GOOGLE_PROJECT_ID ليكون رقم تعريف مشروعك.

ستحذف أول سطرين، وتغير ثلاثة أسطر أخرى كما هو موضح أدناه.

gcloud run deploy $SERVICE_NAME \
  --source . \
  --platform managed \
  --region ${REGION} \
  --no-allow-unauthenticated \
  --project=$PROJECT_ID \
  --service-account=partner-sa@${PROJECT_ID}.iam.gserviceaccount.com

نشر الخدمة

من سطر الأوامر، شغِّل نص deploy.sh البرمجي:

./deploy.sh

عند اكتمال النشر، سيعرض السطر الأخير من مخرجات الأمر عنوان URL للخدمة للتطبيق الجديد. حفظ عنوان URL في متغيّر بيئة:

export SERVICE_URL=<URL from last line of command output>

حاول الآن جلب طلب من التطبيق باستخدام أداة curl:

curl -i -X GET $SERVICE_URL/partners

تطلب العلامة -i للأمر curl من الأداة تضمين عناوين الاستجابة في الناتج. يجب أن يكون السطر الأول من الإخراج هو:

HTTP/2 403

تم نشر التطبيق مع خيار منع الطلبات التي لم تتم مصادقتها. لا يحتوي أمر curl هذا على معلومات مصادقة، ولذلك تم رفضه بواسطة Cloud Run. التطبيق الفعلي المنشور لا يشغِّل أو يتلقّى أي بيانات من هذا الطلب.

5- تقديم طلبات تمت مصادقتها

يتم استدعاء التطبيق المنشور من خلال تقديم طلبات ويب، والتي يجب الآن مصادقتها ليتم السماح بها من خلال Cloud Run. تتم المصادقة على طلبات الويب من خلال تضمين عنوان Authorization للنموذج:

Authorization: Bearer identity-token

الرمز المميّز للهوية هو سلسلة قصيرة المدى وموقّعة بطريقة مشفّرة ومشفّرة يصدرها موفّر مصادقة موثوق به. في هذه الحالة، يجب توفّر رمز مميّز صالح لإثبات الهوية صادر عن Google وأنّه غير منتهي الصلاحية.

تقديم طلب باستخدام حساب المستخدم الخاص بك

يمكن أن توفّر أداة Google Cloud CLI رمزًا مميزًا للمستخدم التلقائي الذي تمت مصادقته. شغِّل هذا الأمر للحصول على رمز تحديد الهوية لحسابك الخاص وحفظه في متغير بيئة ID_TOKEN:

export ID_TOKEN=$(gcloud auth print-identity-token)

بشكل تلقائي، تكون رموز الهوية التي تصدرها Google صالحة لمدة ساعة واحدة. شغّل أمر curl التالي لإجراء الطلب الذي تم رفضه من قبل لأنه لم يكن مفوضًا. سيتضمّن هذا الأمر العنوان اللازم:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

من المفترض أن يبدأ ناتج الأمر بـ HTTP/2 200، ما يشير إلى أنّ الطلب مقبول ويتم قبوله. (إذا انتظرت ساعة وجربت هذا الطلب مرة أخرى، فسيفشل الطلب لأن الرمز المميز ستنتهي صلاحيته.) يقع نص الاستجابة في نهاية الإخراج، بعد سطر فارغ:

{"status":"success","data":[]}

لا يتوفّر أي شركاء بعد.

يمكنك تسجيل الشركاء باستخدام نموذج بيانات JSON في الدليل باستخدام أمرَي curl:

curl -X POST \
  -H "Authorization: Bearer $ID_TOKEN" \
  -H "Content-Type: application/json" \
  -d "@example-partner.json" \
  $SERVICE_URL/partner

و

curl -X POST \
  -H "Authorization: Bearer $ID_TOKEN" \
  -H "Content-Type: application/json" \
  -d "@example-partner2.json" \
  $SERVICE_URL/partner

كرِّر طلب GET السابق للاطّلاع على جميع الشركاء المسجَّلين الآن:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

من المفترض أن تظهر لك بيانات JSON تتضمّن محتوى أكبر بكثير، تقدّم معلومات عن الشريكَين المسجَّلَين.

تقديم طلب كحساب غير مصرَّح به

نجح الطلب الذي تمت مصادقته في الخطوة الأخيرة ليس فقط لأنه تمت مصادقته، ولكن أيضًا لأنه تم تفويض المستخدم الذي تمت مصادقته (حسابك). وهذا يعني أنّ الحساب يملك الإذن لاستدعاء التطبيق. لا يُسمح لجميع الحسابات التي تمت مصادقتها بإجراء ذلك.

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

  1. أنشِئ حساب خدمة باسم "tester".
gcloud iam service-accounts create tester
  1. ستحصل على رمز مميز لهذا الحساب الجديد بالطريقة نفسها التي حصلت بها على رمز مميز لحسابك التلقائي سابقًا. ومع ذلك، يتطلّب ذلك أن يحصل حسابك التلقائي على إذن لانتحال هوية حسابات الخدمة. امنح حسابك هذا الإذن.
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="user:$USER_EMAIL" \
  --role=roles/iam.serviceAccountTokenCreator
  1. قم الآن بتشغيل الأمر التالي لحفظ رمز الهوية لهذا الحساب الجديد في متغير البيئة TEST_IDENTITY. إذا كان الأمر يعرض رسالة خطأ، انتظِر لمدة دقيقة أو اثنتين ثم أعِد المحاولة.
export TEST_TOKEN=$( \
  gcloud auth print-identity-token \
    --impersonate-service-account \
    "tester@$PROJECT_ID.iam.gserviceaccount.com" \
)
  1. أنشِئ طلب الويب الذي تمت مصادقته كما في السابق، ولكن باستخدام رمز الهوية هذا:
curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

سيبدأ ناتج الأمر مرة أخرى بـ HTTP/2 403 لأن الطلب، على الرغم من أنه تمت مصادقته، غير معتمد. لا يملك حساب الخدمة الجديد إذنًا لاستدعاء هذا التطبيق.

تفويض حساب

يجب أن يكون لدى حساب المستخدم أو الخدمة دور "مُطلق تشغيل السحابة الإلكترونية" على خدمة Cloud Run حتى يتمكّن من إرسال طلبات إليه. امنح حساب خدمة المختبِر هذا الدور باستخدام الأمر:

export REGION=us-central1
gcloud run services add-iam-policy-binding ${SERVICE_NAME} \
  --member="serviceAccount:tester@$PROJECT_ID.iam.gserviceaccount.com" \
  --role=roles/run.invoker \
  --region=${REGION}

بعد الانتظار لمدة دقيقة أو دقيقتين حتى يتم تعديل الدور الجديد، كرِّر الطلب الذي تمت مصادقته. احفظ قيمة TEST_TOKEN جديدة إذا مرّت ساعة أو أكثر على حفظها لأول مرة.

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

يبدأ ناتج الأمر الآن بـ HTTP/1.1 200 OK ويحتوي السطر الأخير على استجابة JSON. تم قبول هذا الطلب بواسطة Cloud Run ومعالجته من خلال التطبيق.

6- مصادقة البرامج مقابل مصادقة المستخدمين

إنّ الطلبات التي أجريتها والتي تمت مصادقتها قد استخدمت الآن أداة سطر الأوامر curl. هناك أدوات ولغات برمجة أخرى كان من الممكن استخدامها بدلاً من ذلك. ومع ذلك، لا يمكن إجراء طلبات تشغيل السحابة الإلكترونية التي تمت مصادقتها باستخدام متصفّح ويب به صفحات ويب عادية. إذا نقر مستخدم على رابط أو نقر على زر لإرسال نموذج في صفحة ويب، لن يضيف المتصفِّح عنوان Authorization الذي يتطلبه Cloud Run للطلبات التي تمت مصادقتها.

تم تصميم آلية المصادقة المدمجة في Cloud Run من أجل استخدام البرامج وليس من قِبل المستخدمين النهائيين.

ملاحظة:

يمكن أن يستضيف Cloud Run تطبيقات الويب الموجَّهة للمستخدمين، ولكن يجب ضبط هذه الأنواع من التطبيقات على Cloud Run للسماح بالطلبات التي لم تتم مصادقتها من المستخدمين متصفّحات الويب. إذا كانت التطبيقات تتطلب مصادقة المستخدم، يجب أن يتعامل التطبيق معها بدلاً من مطالبة Cloud Run بتنفيذها. ويمكن للتطبيق إجراء ذلك بنفس الطرق التي تفعل بها تطبيقات الويب خارج Cloud Run. لا نتناول في هذا الدرس التطبيقي كيفية تنفيذ ذلك.

ربما لاحظت أنّ الردود على طلبات الأمثلة حتى الآن كانت عناصر JSON، وليس صفحات ويب. ويرجِع ذلك إلى أنّ خدمة تسجيل الشركاء هذه مخصّصة لاستخدام البرامج، كما أنّ تنسيق JSON يوفّر طريقة ملائمة لهم. بعد ذلك، ستقوم بكتابة وتشغيل برنامج لاستهلاك هذه البيانات واستخدامها.

الطلبات التي تمت مصادقتها من برنامج Python

يمكن لأي برنامج إجراء طلبات تمت مصادقتها لتطبيق Cloud Run آمن عبر طلبات HTTP عادية، مع تضمين عنوان Authorization. والتحدي الجديد الوحيد لتلك البرامج هو الحصول على رمز هوية صالح وغير منتهي الصلاحية لوضعه في ذلك العنوان. وسيتم التحقّق من صحة هذا الرمز المميّز عن طريق Cloud Run باستخدام "إدارة الهوية وإمكانية الوصول" (IAM) في Google Cloud، لذا يجب إصدار الرمز المميّز وتوقيعه من قِبل جهة تعترف بها "إدارة الهوية وإمكانية الوصول". تتوفّر مكتبات للعملاء بلغات متعددة يمكن استخدامها لطلب إصدار رمز مميّز. مكتبة البرامج التي سيستخدمها هذا المثال هي مكتبة Python google.auth. توجد مكتبات بايثون عديدة لتقديم طلبات الويب بشكل عام؛ في هذا المثال، يستخدم الوحدة النمطية requests الشائعة.

تتمثل الخطوة الأولى في تثبيت مكتبتَي العميل:

pip install google-auth
pip install requests

رمز Python لطلب رمز مميز للهوية للمستخدم التلقائي هو:

credentials, _ = google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
identity_token = credentials.id_token

إذا كنت تستخدم أوامر أوامر مثل Cloud Shell أو هيكل طرفي قياسي على جهاز الكمبيوتر الخاص بك، فالمستخدم الافتراضي هو المستخدم الذي تمت المصادقة عليه داخل هذا الواجهة. يكون المستخدم الذي سجَّل الدخول إلى Google بشكل عام في Cloud Shell. وفي الحالات الأخرى، أي مستخدم تمت مصادقته باستخدام gcloud auth login أو أمر gcloud آخر. إذا لم يسجّل المستخدم الدخول من قبل، فلن يكون هناك مستخدم تلقائي ولن ينجح هذا الرمز.

بالنسبة إلى البرنامج الذي يرسل طلبات إلى برنامج آخر، أنت لا تريد بشكل عام استخدام هوية الشخص، بل هوية البرنامج الذي يقدّم الطلب. وهذا هو الغرض من حسابات الخدمة. لقد نشرت خدمة Cloud Run باستخدام حساب خدمة مخصَّص يوفّر الهوية التي تستخدمها عند إرسال طلبات البيانات من واجهة برمجة التطبيقات، مثل Cloud Firestore. عند تشغيل برنامج على Google Cloud Platform، ستستخدم مكتبات العملاء تلقائيًا حساب الخدمة المخصّص له كهويته التلقائية، لكي يعمل رمز البرنامج نفسه في كلتا الحالتين.

رمز Python لإجراء طلب وإضافة عنوان تفويض هو:

auth_header = {"Authorization": "Bearer " + identity_token}
response = requests.get(url, headers=auth_header)

سيُجري برنامج Python الكامل التالي طلبًا تمت مصادقته إلى خدمة Cloud Run لاسترداد جميع الشركاء المسجَّلين، ثم طباعة أسمائهم وأرقام التعريف المخصّصة لهم. انسخ الأمر أدناه وشغِّله لحفظ هذا الرمز في الملف print_partners.py.

cat > ./print_partners.py << EOF
def print_partners():
    import google.auth
    import google.auth.transport.requests
    import requests

    credentials, _ = google.auth.default()
    credentials.refresh(google.auth.transport.requests.Request())
    identity_token = credentials.id_token

    auth_header = {"Authorization": "Bearer " + identity_token}
    response = requests.get("${SERVICE_URL}/partners", headers=auth_header)

    parsed_response = response.json()
    partners = parsed_response["data"]

    for partner in partners:
        print(f"{partner['partnerId']}: {partner['name']}")


print_partners()
EOF

ستقوم بتشغيل هذا البرنامج باستخدام أمر shell. ستحتاج إلى المصادقة كمستخدم تلقائي أولاً، حتى يتمكّن البرنامج من استخدام بيانات الاعتماد هذه. شغّل أمر gcloud auth أدناه:

gcloud auth application-default login

اتّبِع التعليمات لإكمال عملية تسجيل الدخول. بعد ذلك، شغِّل البرنامج من سطر الأوامر:

python print_partners.py

ستبدو الإخراج على النحو التالي:

10102: Zippy food delivery
67292: Foodful

وصل طلب البرنامج إلى خدمة التشغيل في السحابة الإلكترونية لأنه تمت مصادقته باستخدام هويتك، وأنت مالك هذا المشروع وبالتالي لديك الإذن بتشغيله بشكل تلقائي. سيكون من الأكثر شيوعًا تشغيل هذا البرنامج ضمن هوية حساب الخدمة. عند تشغيل الهوية التلقائية في معظم منتجات Google Cloud، مثل Cloud Run أو App Engine، ستكون الهوية التلقائية هي حساب خدمة وسيتم استخدامها بدلاً من حساب شخصي.

7. تهانينا!

تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز.

الخطوة التالية:

اطّلع على الدروس التطبيقية الأخرى حول الترميز في Cymbal Eats:

تَنظيم

لتجنُّب تحمُّل الرسوم المفروضة على حسابك على Google Cloud مقابل الموارد المُستخدَمة في هذا الدليل التوجيهي، يمكنك إما حذف المشروع الذي يحتوي على الموارد أو الاحتفاظ بالمشروع وحذف الموارد الفردية.

حذف المشروع

أسهل طريقة لإزالة الفوترة هي حذف المشروع الذي أنشأته للبرنامج التعليمي.