ทำให้ใช้งานได้อย่างปลอดภัยกับ Cloud Run

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 จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png

55efc1aaa7a4d3ad.png

หากไม่เคยเริ่มใช้ Cloud Shell มาก่อน คุณจะเห็นหน้าจอระดับกลาง (ด้านล่าง) ที่อธิบายว่า Cloud Shell คืออะไร ในกรณีนี้ ให้คลิกต่อไป (และคุณจะไม่เห็นหน้าจอนี้อีก) หน้าจอแบบครั้งเดียวจะมีลักษณะดังนี้

9c92662c6a846a5c.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

9f0e51b578fecce5.png

เครื่องเสมือนนี้มีเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน 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 สำหรับ Lab นี้ โดยปกติแล้ว คุณสามารถคัดลอกคำสั่งและวางตามที่เห็นได้เลย แต่ในบางกรณี คุณจะต้องเปลี่ยนค่าตัวยึดตำแหน่งเป็นค่าที่ถูกต้อง

  1. ตั้งค่าตัวแปรสภาพแวดล้อมเป็นรหัสโปรเจ็กต์เพื่อใช้ในคำสั่งในภายหลัง
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
  1. เปิดใช้ Cloud Run Service API ที่จะเรียกใช้แอป, Firestore API ที่จะจัดเก็บข้อมูล NoSQL, Cloud Build API ที่คำสั่งการทำให้ใช้งานได้จะใช้ และ 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 Lab นี้มุ่งเน้นที่การติดตั้งใช้งาน จึงไม่ได้กล่าวถึงส่วนนี้ แต่คุณอาจต้องการค้นคว้าหัวข้อนี้แยกต่างหาก

ขั้นตอนที่ 4 และ 5 - แก้ไขและเรียกใช้ deploy.sh

ขั้นตอนเหล่านี้จะนำแอปไปใช้งานใน Cloud Run โดยปล่อยให้ตัวเลือกส่วนใหญ่เป็นค่าเริ่มต้น คุณจะแก้ไขขั้นตอนนี้เพื่อให้การติดตั้งใช้งานปลอดภัยยิ่งขึ้นใน 2 วิธีหลัก ดังนี้

  1. ไม่อนุญาตให้เข้าถึงโดยไม่ต้องมีการตรวจสอบสิทธิ์ การอนุญาตดังกล่าวอาจสะดวกสำหรับการทดลองใช้ฟีเจอร์ต่างๆ ในระหว่างการสำรวจ แต่บริการนี้เป็นบริการบนเว็บสำหรับใช้โดยพาร์ทเนอร์เชิงพาณิชย์ และควรตรวจสอบสิทธิ์ผู้ใช้เสมอ
  2. ระบุว่าแอปพลิเคชันต้องใช้บัญชีบริการเฉพาะที่ปรับแต่งให้มีเฉพาะสิทธิ์ที่จำเป็นเท่านั้น แทนที่จะใช้บัญชีเริ่มต้นซึ่งมักจะมีสิทธิ์เข้าถึง API และทรัพยากรมากกว่าที่จำเป็น ซึ่งเรียกว่าหลักการให้สิทธิ์ขั้นต่ำที่สุด และเป็นแนวคิดพื้นฐานด้านความปลอดภัยของแอปพลิเคชัน

ขั้นตอนที่ 6 ถึง 11 - สร้างคำขอเว็บตัวอย่างเพื่อยืนยันลักษณะการทำงานที่ถูกต้อง

เนื่องจากการติดตั้งใช้งานแอปพลิเคชันต้องมีการตรวจสอบสิทธิ์ คำขอเหล่านี้จึงต้องมีหลักฐานยืนยันตัวตนของผู้ขอ คุณจะส่งคำขอจากบรรทัดคำสั่งโดยตรงแทนที่จะแก้ไขไฟล์เหล่านี้

4. ติดตั้งใช้งานบริการอย่างปลอดภัย

การเปลี่ยนแปลง 2 อย่างที่ระบุว่าจำเป็นในสคริปต์ 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 ให้เป็นรหัสของโปรเจ็กต์ของคุณเอง

คุณจะต้องลบ 2 บรรทัดแรกและเปลี่ยนอีก 3 บรรทัดตามที่แสดงด้านล่าง

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 ออกให้จะมีอายุ 1 ชั่วโมง เรียกใช้คำสั่ง curl ต่อไปนี้เพื่อส่งคำขอที่ถูกปฏิเสธก่อนหน้านี้เนื่องจากไม่มีการให้สิทธิ์ คำสั่งนี้จะมีส่วนหัวที่จำเป็นดังนี้

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

เอาต์พุตของคำสั่งควรเริ่มต้นด้วย HTTP/2 200 ซึ่งบ่งบอกว่าคำขอเป็นที่ยอมรับและกำลังดำเนินการ (หากคุณรอ 1 ชั่วโมงแล้วลองส่งคำขอนี้อีกครั้ง คำขอจะล้มเหลวเนื่องจากโทเค็นจะหมดอายุ) เนื้อหาของคำตอบจะอยู่ที่ส่วนท้ายของเอาต์พุตหลังจากบรรทัดว่าง

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

ยังไม่มีพาร์ทเนอร์

ลงทะเบียนพาร์ทเนอร์โดยใช้ข้อมูล JSON ตัวอย่างในไดเรกทอรีด้วยคำสั่ง 2 รายการต่อไปนี้ 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 ที่มีเนื้อหามากกว่าเดิม ซึ่งให้ข้อมูลเกี่ยวกับพาร์ทเนอร์ที่ลงทะเบียน 2 ราย

ส่งคำขอในฐานะบัญชีที่ไม่ได้รับอนุญาต

คำขอที่ผ่านการตรวจสอบสิทธิ์ในขั้นตอนสุดท้ายสำเร็จ ไม่ใช่เพียงเพราะผ่านการตรวจสอบสิทธิ์เท่านั้น แต่ยังเป็นเพราะผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ (บัญชีของคุณ) ได้รับอนุญาตด้วย กล่าวคือ บัญชีมีสิทธิ์เรียกใช้แอป แต่บัญชีที่ได้รับการตรวจสอบสิทธิ์บางบัญชีจะไม่ได้รับอนุญาตให้ดำเนินการดังกล่าว

บัญชีเริ่มต้นที่ใช้ในคำขอก่อนหน้านี้ได้รับอนุญาตเนื่องจากเป็นบัญชีที่สร้างโปรเจ็กต์ที่มีแอป และโดยค่าเริ่มต้นบัญชีดังกล่าวมีสิทธิ์เรียกใช้แอปพลิเคชัน 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 หากคำสั่งแสดงข้อความแสดงข้อผิดพลาด ให้รอ 1-2 นาทีแล้วลองอีกครั้ง
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}

หลังจากรอ 1-2 นาทีเพื่อให้ระบบอัปเดทบทบาทใหม่แล้ว ให้ส่งคำขอที่ผ่านการตรวจสอบสิทธิ์อีกครั้ง บันทึก TEST_TOKEN ใหม่หากผ่านไปอย่างน้อย 1 ชั่วโมงนับตั้งแต่บันทึกครั้งแรก

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 and Access Management (IAM) ดังนั้นโทเค็นต้องออกและลงนามโดยหน่วยงานที่ IAM รู้จัก มีไลบรารีของไคลเอ็นต์ในหลายภาษาที่โปรแกรมสามารถใช้เพื่อขอออกโทเค็นดังกล่าว ไลบรารีของไคลเอ็นต์ที่ตัวอย่างนี้จะใช้คือไลบรารี google.auth ของ Python มีไลบรารี Python หลายรายการสำหรับการส่งคำขอเว็บโดยทั่วไป ตัวอย่างนี้ใช้โมดูล requests ที่ได้รับความนิยม

ขั้นตอนแรกคือการติดตั้งไลบรารีของไคลเอ็นต์ 2 รายการ ดังนี้

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 ด้วยบัญชีบริการเฉพาะที่ให้ข้อมูลประจำตัวซึ่งใช้เมื่อส่งคำขอ API เช่น ไปยัง Cloud Firestore เมื่อโปรแกรมทำงานบนแพลตฟอร์ม Google Cloud ไลบรารีของไคลเอ็นต์จะใช้บัญชีบริการที่กำหนดให้เป็นข้อมูลประจำตัวเริ่มต้นโดยอัตโนมัติ ดังนั้นโค้ดโปรแกรมเดียวกันจึงทำงานได้ทั้ง 2 สถานการณ์

โค้ด 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

คุณจะเรียกใช้โปรแกรมนี้ด้วยคำสั่งเชลล์ คุณจะต้องตรวจสอบสิทธิ์ในฐานะผู้ใช้เริ่มต้นก่อนเพื่อให้โปรแกรมใช้ข้อมูลเข้าสู่ระบบเหล่านั้นได้ เรียกใช้คำสั่ง 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 เสร็จแล้ว

ขั้นตอนต่อไปที่ทำได้

ดู Codelab อื่นๆ ของ Cymbal Eats

ล้างข้อมูล

โปรดลบโปรเจ็กต์ที่มีทรัพยากรหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

การลบโปรเจ็กต์

วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างขึ้นสำหรับบทแนะนำ