1. ภาพรวม
คุณจะแก้ไขขั้นตอนเริ่มต้นสำหรับการติดตั้งใช้งานบริการใน Cloud Run เพื่อปรับปรุงความปลอดภัย จากนั้นดูวิธีเข้าถึงแอปที่ติดตั้งใช้งานอย่างปลอดภัย แอปนี้เป็น "บริการลงทะเบียนพาร์ทเนอร์" ของแอปพลิเคชัน Cymbal Eats ซึ่งบริษัทที่ทำงานร่วมกับ Cymbal Eats ใช้เพื่อประมวลผลคำสั่งซื้ออาหาร
สิ่งที่คุณจะได้เรียนรู้
การเปลี่ยนแปลงเล็กๆ น้อยๆ ในขั้นตอนเริ่มต้นขั้นต่ำสำหรับการติดตั้งใช้งานแอปใน Cloud Run จะช่วยเพิ่มความปลอดภัยได้อย่างมาก คุณจะใช้แอปที่มีอยู่และวิธีการติดตั้งใช้งาน แล้วเปลี่ยนขั้นตอนการติดตั้งใช้งานเพื่อปรับปรุงความปลอดภัยของแอปที่ติดตั้งใช้งาน
จากนั้นคุณจะเห็นวิธีให้สิทธิ์เข้าถึงแอปและส่งคำขอที่ได้รับอนุญาต
นี่ไม่ใช่การดูความปลอดภัยในการติดตั้งใช้งานแอปพลิเคชันทั้งหมด แต่เป็นการดูการเปลี่ยนแปลงที่คุณสามารถทำกับการติดตั้งใช้งานแอปในอนาคตทั้งหมด ซึ่งจะช่วยปรับปรุงความปลอดภัยโดยใช้ความพยายามเพียงเล็กน้อย
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



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


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

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

เครื่องเสมือนนี้มีเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานในโค้ดแล็บนี้ได้โดยใช้เพียงเบราว์เซอร์หรือ Chromebook
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์ของคุณแล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน 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`
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
เอาต์พุตของคำสั่ง
[core] project = <PROJECT_ID>
หากไม่ได้ตั้งค่าไว้ คุณตั้งค่าได้ด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
เอาต์พุตของคำสั่ง
Updated property [core/project].
การตั้งค่าสภาพแวดล้อม
คุณจะเรียกใช้คำสั่งในบรรทัดคำสั่ง Cloud Shell สำหรับ Lab นี้ โดยปกติแล้ว คุณสามารถคัดลอกคำสั่งและวางตามที่เห็นได้เลย แต่ในบางกรณี คุณจะต้องเปลี่ยนค่าตัวยึดตำแหน่งเป็นค่าที่ถูกต้อง
- ตั้งค่าตัวแปรสภาพแวดล้อมเป็นรหัสโปรเจ็กต์เพื่อใช้ในคำสั่งในภายหลัง
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
- เปิดใช้ 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
- เริ่มต้นฐานข้อมูล 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
- โคลนที่เก็บแอปตัวอย่างแล้วไปที่ไดเรกทอรี
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 วิธีหลัก ดังนี้
- ไม่อนุญาตให้เข้าถึงโดยไม่ต้องมีการตรวจสอบสิทธิ์ การอนุญาตดังกล่าวอาจสะดวกสำหรับการทดลองใช้ฟีเจอร์ต่างๆ ในระหว่างการสำรวจ แต่บริการนี้เป็นบริการบนเว็บสำหรับใช้โดยพาร์ทเนอร์เชิงพาณิชย์ และควรตรวจสอบสิทธิ์ผู้ใช้เสมอ
- ระบุว่าแอปพลิเคชันต้องใช้บัญชีบริการเฉพาะที่ปรับแต่งให้มีเฉพาะสิทธิ์ที่จำเป็นเท่านั้น แทนที่จะใช้บัญชีเริ่มต้นซึ่งมักจะมีสิทธิ์เข้าถึง 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 ใดก็ได้ในบัญชี คุณเพิกถอนสิทธิ์ดังกล่าวได้หากจำเป็น ซึ่งเป็นสิ่งที่ควรทำในแอปพลิเคชันเวอร์ชันที่ใช้งานจริง แทนที่จะทำเช่นนั้นในตอนนี้ คุณจะสร้างบัญชีบริการใหม่ที่ไม่มีการมอบหมายสิทธิ์หรือบทบาท และใช้บัญชีดังกล่าวเพื่อพยายามเข้าถึงแอปที่ติดตั้งใช้งาน
- สร้างบัญชีบริการชื่อ
tester
gcloud iam service-accounts create tester
- คุณจะได้รับโทเค็นข้อมูลประจำตัวสำหรับบัญชีใหม่นี้ในลักษณะเดียวกับที่ได้รับสำหรับบัญชีเริ่มต้นก่อนหน้านี้ อย่างไรก็ตาม บัญชีเริ่มต้นของคุณต้องมีสิทธิ์ในการแอบอ้างเป็นบัญชีบริการ ให้สิทธิ์นี้แก่บัญชี
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
- ตอนนี้ให้เรียกใช้คำสั่งต่อไปนี้เพื่อบันทึกโทเค็นข้อมูลประจำตัวสำหรับบัญชีใหม่นี้ในตัวแปรสภาพแวดล้อม TEST_IDENTITY หากคำสั่งแสดงข้อความแสดงข้อผิดพลาด ให้รอ 1-2 นาทีแล้วลองอีกครั้ง
export TEST_TOKEN=$( \
gcloud auth print-identity-token \
--impersonate-service-account \
"tester@$PROJECT_ID.iam.gserviceaccount.com" \
)
- ส่งคำขอเว็บที่ตรวจสอบสิทธิ์แล้วเช่นเดิม แต่ใช้โทเค็นข้อมูลประจำตัวนี้
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
- ทริกเกอร์เวิร์กโฟลว์ระบบคลาวด์ด้วย Eventarc
- การทริกเกอร์การประมวลผลเหตุการณ์จาก Cloud Storage
- การเชื่อมต่อกับ Private Cloud SQL จาก Cloud Run
- การเชื่อมต่อกับฐานข้อมูลที่มีการจัดการครบวงจรจาก Cloud Run
- ปกป้องแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ด้วย Identity-Aware Proxy (IAP)
- ทริกเกอร์งาน Cloud Run ด้วย Cloud Scheduler
- การรักษาความปลอดภัยให้การรับส่งข้อมูลขาเข้าของ Cloud Run
- การเชื่อมต่อกับ AlloyDB ส่วนตัวจาก GKE Autopilot
ล้างข้อมูล
โปรดลบโปรเจ็กต์ที่มีทรัพยากรหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้
การลบโปรเจ็กต์
วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างขึ้นสำหรับบทแนะนำ