استقرار ایمن در Cloud Run

۱. مرور کلی

شما مراحل پیش‌فرض برای استقرار یک سرویس در Cloud Run را برای بهبود امنیت تغییر خواهید داد و سپس خواهید دید که چگونه می‌توانید به روشی امن به برنامه‌ی مستقر شده دسترسی پیدا کنید. این برنامه یک "سرویس ثبت نام شریک" از برنامه‌ی Cymbal Eats است که توسط شرکت‌هایی که با Cymbal Eats برای پردازش سفارشات غذا همکاری می‌کنند، استفاده می‌شود.

آنچه یاد خواهید گرفت

با ایجاد چند تغییر کوچک در حداقل مراحل پیش‌فرض برای استقرار یک برنامه در Cloud Run، می‌توانید امنیت آن را به میزان قابل توجهی افزایش دهید. شما یک برنامه موجود و دستورالعمل‌های استقرار را در نظر خواهید گرفت و مراحل استقرار را برای بهبود امنیت برنامه مستقر تغییر خواهید داد.

سپس خواهید دید که چگونه دسترسی به برنامه را مجاز کنید و درخواست‌های مجاز ارسال کنید.

این یک نگاه جامع به امنیت استقرار برنامه نیست، بلکه نگاهی به تغییراتی است که می‌توانید در تمام استقرارهای آینده برنامه خود ایجاد کنید که امنیت آنها را با تلاش بسیار کمی بهبود می‌بخشد.

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در پایین صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

9c92662c6a846a5c.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما پر شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی دائمی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر یا کروم‌بوک انجام داد.

پس از اتصال به 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. API سرویس Cloud Run که برنامه شما را اجرا می‌کند، API Firestore که فضای ذخیره‌سازی داده‌های NoSQL را فراهم می‌کند، API Cloud Build که توسط دستور استقرار استفاده می‌شود و رجیستری Artifact که برای نگهداری کانتینر برنامه هنگام ساخت استفاده می‌شود را فعال کنید:
gcloud services enable \
  run.googleapis.com \
  firestore.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  1. پایگاه داده Firestore را در حالت Native مقداردهی اولیه کنید. این دستور از API موتور برنامه (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

۳. فایل README را مرور کنید

ویرایشگر را باز کنید و به فایل‌های تشکیل‌دهنده برنامه نگاهی بیندازید. فایل README.md را مشاهده کنید که مراحل لازم برای استقرار این برنامه را شرح می‌دهد. برخی از این مراحل ممکن است شامل تصمیمات امنیتی ضمنی یا صریح باشند که باید در نظر گرفته شوند. شما تعدادی از این گزینه‌ها را برای بهبود امنیت برنامه مستقر شده خود تغییر خواهید داد، همانطور که در اینجا توضیح داده شده است:

مرحله ۳ - اجرای npm install

دانستن منشأ و یکپارچگی هر نرم‌افزار شخص ثالثی که در یک برنامه استفاده می‌شود، مهم است. مدیریت امنیت زنجیره تأمین نرم‌افزار برای ساخت هر نرم‌افزاری، نه فقط برنامه‌هایی که در Cloud Run مستقر شده‌اند، مرتبط است. این آزمایشگاه بر استقرار تمرکز داشت، بنابراین به این حوزه نمی‌پردازد، اما شاید بخواهید موضوع را جداگانه بررسی کنید.

مراحل ۴ و ۵ - ویرایش و اجرای deploy.sh

این مراحل، برنامه را روی Cloud Run مستقر می‌کند و اکثر گزینه‌ها را در حالت پیش‌فرض خود نگه می‌دارد. شما این مرحله را تغییر خواهید داد تا استقرار را از دو طریق کلیدی ایمن‌تر کنید:

  1. اجازه دسترسی غیرمجاز را ندهید . اجازه دادن به این دسترسی برای امتحان کردن موارد در طول کاوش می‌تواند راحت باشد، اما این یک سرویس وب برای استفاده شرکای تجاری است و همیشه باید کاربران خود را احراز هویت کند.
  2. مشخص کنید که برنامه باید از یک حساب کاربری سرویس اختصاصی که فقط با امتیازات لازم طراحی شده است، به جای یک حساب کاربری پیش‌فرض که احتمالاً دسترسی به API و منابع بیشتری نسبت به نیاز خواهد داشت، استفاده کند. این به عنوان اصل حداقل امتیاز شناخته می‌شود و یک مفهوم اساسی در امنیت برنامه است.

مراحل ۶ تا ۱۱ - ایجاد درخواست‌های وب نمونه برای تأیید رفتار صحیح

از آنجایی که استقرار برنامه اکنون نیاز به احراز هویت دارد، این درخواست‌ها اکنون باید شامل مدرکی دال بر هویت درخواست‌کننده باشند. به جای تغییر این فایل‌ها، شما مستقیماً از خط فرمان درخواست‌ها را ارسال خواهید کرد.

۴. سرویس را به طور ایمن مستقر کنید

دو تغییر مورد نیاز در اسکریپت 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

وقتی استقرار کامل شد، آخرین خط خروجی دستور، آدرس سرویس (Service 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 رد می‌شود. برنامه مستقر شده واقعی حتی اجرا نمی‌شود یا هیچ داده‌ای از این درخواست دریافت نمی‌کند.

۵. درخواست‌های احراز هویت‌شده ارسال کنید

برنامه‌ی مستقر شده با ایجاد درخواست‌های وب فراخوانی می‌شود، که اکنون باید برای Cloud Run احراز هویت شوند تا به آنها اجازه داده شود. درخواست‌های وب با افزودن یک سربرگ Authorization در فرم احراز هویت می‌شوند:

Authorization: Bearer identity-token حامل

توکن هویت، یک رشته کوتاه‌مدت، امضا شده با رمزنگاری و کدگذاری شده است که توسط یک ارائه‌دهنده احراز هویت معتبر صادر می‌شود. در این مورد، یک توکن هویت معتبر، منقضی نشده و صادر شده توسط گوگل مورد نیاز است.

به عنوان حساب کاربری خود درخواست دهید

ابزار Google Cloud CLI می‌تواند یک توکن برای کاربر پیش‌فرض احراز هویت‌شده ارائه دهد. این دستور را اجرا کنید تا یک توکن هویت برای حساب کاربری خودتان دریافت کنید و آن را در متغیر محیطی ID_TOKEN ذخیره کنید:

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

به طور پیش‌فرض، توکن‌های هویتی صادر شده توسط گوگل به مدت یک ساعت معتبر هستند. دستور curl زیر را اجرا کنید تا درخواستی که قبلاً به دلیل عدم احراز هویت رد شده بود، دوباره ارسال شود. این دستور شامل هدر لازم خواهد بود:

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

خروجی دستور باید با HTTP/2 200 شروع شود که نشان می‌دهد درخواست قابل قبول است و با موفقیت انجام می‌شود. (اگر یک ساعت صبر کنید و دوباره این درخواست را امتحان کنید، با شکست مواجه خواهد شد زیرا توکن منقضی شده است.) بدنه پاسخ در انتهای خروجی، پس از یک خط خالی قرار دارد:

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

هنوز هیچ شریکی وجود ندارد.

با استفاده از دو دستور curl ، شرکا را با استفاده از داده‌های نمونه JSON در دایرکتوری ثبت کنید:

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 Invoker را در سرویس 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 پذیرفته و توسط برنامه پردازش شده است.

۶. احراز هویت برنامه‌ها در مقابل احراز هویت کاربران

درخواست‌های احراز هویت شده‌ای که تاکنون انجام داده‌اید، از ابزار خط فرمان curl استفاده کرده‌اند. ابزارها و زبان‌های برنامه‌نویسی دیگری نیز وجود دارند که می‌توانستند به جای آنها استفاده شوند. با این حال، درخواست‌های احراز هویت شده Cloud Run را نمی‌توان با استفاده از یک مرورگر وب با صفحات وب ساده انجام داد. اگر کاربری روی یک لینک کلیک کند یا روی دکمه‌ای برای ارسال فرم در یک صفحه وب کلیک کند، مرورگر هدر Authorization مورد نیاز Cloud Run را برای درخواست‌های احراز هویت شده اضافه نمی‌کند.

مکانیزم احراز هویت داخلی Cloud Run برای استفاده توسط برنامه‌ها در نظر گرفته شده است، نه توسط کاربران نهایی.

توجه:

Cloud Run می‌تواند میزبان برنامه‌های وب کاربر-محور باشد، اما این نوع برنامه‌ها باید Cloud Run را طوری تنظیم کنند که درخواست‌های احراز هویت نشده از مرورگرهای وب کاربران را مجاز بداند. اگر برنامه‌ها نیاز به احراز هویت کاربر داشته باشند، خود برنامه باید آن را مدیریت کند، نه اینکه از Cloud Run بخواهد این کار را انجام دهد. برنامه می‌تواند این کار را به همان روشی که برنامه‌های وب خارج از Cloud Run انجام می‌دهند، انجام دهد. نحوه انجام این کار خارج از محدوده این آزمایشگاه کد است.

شاید متوجه شده باشید که پاسخ‌ها به درخواست‌های نمونه تاکنون اشیاء JSON بوده‌اند، نه صفحات وب. دلیلش این است که این سرویس ثبت نام شریک برای استفاده برنامه‌ها در نظر گرفته شده است و JSON فرم مناسبی برای مصرف آنهاست. در مرحله بعد، برنامه‌ای برای مصرف و استفاده از این داده‌ها خواهید نوشت و اجرا خواهید کرد.

درخواست‌های احراز هویت شده از یک برنامه پایتون

یک برنامه می‌تواند درخواست‌های احراز هویت شده از یک برنامه Cloud Run امن را از طریق درخواست‌های وب HTTP استاندارد، اما با در نظر گرفتن یک هدر Authorization ارسال کند. تنها چالش جدید برای این برنامه‌ها، دریافت یک توکن هویت معتبر و منقضی نشده برای قرار دادن در آن هدر است. این توکن توسط Cloud Run با استفاده از مدیریت هویت و دسترسی Google Cloud (IAM) تأیید می‌شود، بنابراین توکن باید توسط مرجعی که توسط IAM به رسمیت شناخته شده است، صادر و امضا شود. کتابخانه‌های کلاینت به زبان‌های مختلفی موجود هستند که برنامه‌ها می‌توانند برای درخواست صدور چنین توکنی از آنها استفاده کنند. کتابخانه کلاینتی که این مثال از آن استفاده خواهد کرد، کتابخانه google.auth پایتون است. به طور کلی چندین کتابخانه پایتون برای ارسال درخواست‌های وب وجود دارد. این مثال از ماژول محبوب requests استفاده می‌کند.

اولین قدم نصب دو کتابخانه کلاینت است:

pip install google-auth
pip install requests

کد پایتون برای درخواست توکن هویت برای کاربر پیش‌فرض :

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

اگر از یک پوسته فرمان مانند Cloud Shell یا پوسته ترمینال استاندارد در رایانه خود استفاده می‌کنید، کاربر پیش‌فرض هر کسی است که درون آن پوسته احراز هویت شده باشد. در Cloud Shell، این کاربر معمولاً کاربری است که به گوگل وارد شده است. در موارد دیگر، هر کاربری که با gcloud auth login یا سایر دستورات gcloud احراز هویت شده باشد، کاربر پیش‌فرض خواهد بود. اگر کاربر هرگز وارد سیستم نشده باشد، هیچ کاربر پیش‌فرضی وجود نخواهد داشت و این کد با شکست مواجه می‌شود.

برای برنامه‌ای که از برنامه‌ی دیگری درخواست می‌کند، معمولاً نمی‌خواهید از هویت یک شخص استفاده کنید، بلکه می‌خواهید از هویت برنامه‌ی درخواست‌کننده استفاده کنید. حساب‌های سرویس برای همین کار هستند. شما سرویس Cloud Run را با یک حساب سرویس اختصاصی مستقر کرده‌اید که هویتی را که هنگام درخواست‌های API، مانند درخواست به Cloud Firestore، استفاده می‌کند، فراهم می‌کند. وقتی برنامه‌ای روی پلتفرم Google Cloud اجرا می‌شود، کتابخانه‌های کلاینت به طور خودکار از حساب سرویس اختصاص داده شده به آن به عنوان هویت پیش‌فرض خود استفاده می‌کنند، بنابراین کد برنامه در هر دو حالت یکسان عمل می‌کند.

کد پایتون برای ارسال درخواست با هدر Authorization اضافه شده به صورت زیر است:

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

برنامه کامل پایتون زیر یک درخواست احراز هویت شده به سرویس 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، هویت پیش‌فرض یک حساب سرویس خواهد بود و به جای یک حساب شخصی استفاده می‌شود.

۷. تبریک می‌گویم!

تبریک می‌گویم، شما codelab را تمام کردید!

قدم بعدی چیست؟

سایر آزمایشگاه‌های کد Cymbal Eats را کاوش کنید:

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب گوگل کلود خود برای منابع استفاده شده در این آموزش، یا پروژه‌ای که شامل منابع است را حذف کنید، یا پروژه را نگه دارید و منابع تکی را حذف کنید.

حذف پروژه

ساده‌ترین راه برای حذف هزینه‌ها، حذف پروژه‌ای است که برای آموزش ایجاد کرده‌اید.