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

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

ขั้นตอนที่ 3 - เรียกใช้ npm install

คุณควรทราบแหล่งที่มาและความสมบูรณ์ของซอฟต์แวร์ของบุคคลที่สามที่ใช้ในแอป การจัดการความปลอดภัยของซัพพลายเชนซอฟต์แวร์เกี่ยวข้องกับการสร้างซอฟต์แวร์ทุกประเภท ไม่ใช่แค่แอปที่ติดตั้งใช้งานใน Cloud Run ห้องทดลองนี้มุ่งเน้นที่การติดตั้งใช้งาน จึงไม่ได้กล่าวถึงเรื่องดังกล่าว แต่คุณอาจต้องหาข้อมูลเกี่ยวกับหัวข้อนี้แยกต่างหาก

ขั้นตอนที่ 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

Flag -i สําหรับคําสั่ง curl จะบอกให้รวมส่วนหัวการตอบกลับไว้ในเอาต์พุต บรรทัดแรกของเอาต์พุตควรเป็น

HTTP/2 403

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

5. ส่งคําขอที่ตรวจสอบสิทธิ์แล้ว

ระบบจะเรียกใช้แอปที่ติดตั้งใช้งานโดยส่งคำขอเว็บ ซึ่งตอนนี้ต้องได้รับการตรวจสอบสิทธิ์เพื่อให้ Cloud Run อนุญาต คำขอทางเว็บได้รับการตรวจสอบสิทธิ์โดยการใส่ส่วนหัว Authorization ของแบบฟอร์ม ดังนี้

Authorization: Bearer identity-token

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

ส่งคำขอโดยใช้บัญชีผู้ใช้ของคุณ

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

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

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

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

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

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