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

1. نظرة عامة

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

ما ستتعرّف عليه

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

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

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

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

إعداد البيئة حسب وتيرة الطالب واحتياجاته

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديله في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع 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 التي سيستخدمها أمر النشر، وArtifact Registry التي ستُستخدَم لتخزين حاوية التطبيق عند إنشائها:
gcloud services enable \
  run.googleapis.com \
  firestore.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  1. يمكنك إعداد قاعدة بيانات Firestore في الوضع الأصلي. يستخدم هذا الأمر واجهة برمجة التطبيقات App Engine API، لذا يجب تفعيلها أولاً.

يجب أن يحدِّد الأمر منطقة لـ 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.

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

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

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

الخطوة 4 والخطوة 5: التعديل والتشغيل deploy.sh

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

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

الخطوات من 6 إلى 11: إنشاء نماذج طلبات ويب للتأكّد من السلوك الصحيح

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

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

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

عليك أولاً إنشاء حساب خدمة جديد، ثم تعديل النص البرمجي deploy.sh للإشارة إلى حساب الخدمة هذا ومنع الوصول غير المُعتمَد، ثم نشر الخدمة من خلال تشغيل النص البرمجي المعدَّل قبل أن نتمكّن من تشغيل النص البرمجي deploy.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 تحتوي على محتوى أكثر بكثير، تقدّم معلومات عن الشريكين المسجَّلين.

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

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

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

  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" في خدمة 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. هناك أدوات ولغات برمجة أخرى كان من الممكن استخدامها بدلاً من ذلك. ومع ذلك، لا يمكن تقديم طلبات Cloud Run التي تمّت مصادقتها باستخدام متصفّح ويب يتضمّن صفحات ويب عادية. إذا نقر مستخدم على رابط أو زر لإرسال نموذج في صفحة ويب، لن يضيف المتصفّح رأس Authorization المطلوب من Cloud Run للطلبات التي تمّت مصادقتها.

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

ملاحظة:

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

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

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

يمكن للبرنامج إرسال طلبات مصادقة لتطبيق Cloud Run آمن من خلال طلبات الويب العادية عبر بروتوكول HTTP، ولكن مع تضمين عنوان Authorization. إنّ التحدي الجديد الوحيد لهذه البرامج هو الحصول على رمز تعريف صالح لم ينتهي صلاحيته لوضعه في هذا العنوان. سيتحقّق Cloud Run من صحة هذا الرمز المميّز باستخدام خدمة Google Cloud Identity وإدارة الوصول (IAM)، لذا يجب أن يكون الرمز المميّز صادرًا وموقَّعًا من جهة معتمَدة من IAM. تتوفّر مكتبات برامج بعدّة لغات يمكن للبرامج استخدامها لطلب إصدار هذا الرمز المميّز. مكتبة البرامج التي سيستخدمها هذا المثال هي مكتبة Python google.auth. تتوفّر عدة مكتبات Python لتقديم طلبات الويب بشكل عام. ويستخدم هذا المثال وحدة 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 أو بيئة سطر الأوامر العادية على جهاز الكمبيوتر الخاص بك، يكون المستخدم التلقائي هو المستخدم الذي تمّت مصادقته داخل بيئة سطر الأوامر هذه. في Cloud Shell، يكون هذا عادةً المستخدم الذي سجّل الدخول إلى Google. وفي حالات أخرى، يكون أي مستخدم تمّت مصادقةه باستخدام gcloud auth login أو أي أمر gcloud آخر. إذا لم يسجِّل المستخدم الدخول مطلقًا، لن يكون هناك مستخدم تلقائي ولن ينجح هذا الرمز.

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

رمز Python لتقديم طلب باستخدام عنوان Authorization تمت إضافته هو:

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

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

7- تهانينا!

تهانينا، لقد أكملت دورة codelab.

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

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

تَنظيم

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

حذف المشروع

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