1. ภาพรวม
คุณจะแก้ไขขั้นตอนเริ่มต้นสำหรับการติดตั้งใช้งานบริการไปยัง Cloud Run เพื่อปรับปรุงความปลอดภัย จากนั้นดูวิธีเข้าถึงแอปที่ติดตั้งใช้งานอย่างปลอดภัย แอปนี้เป็น "บริการลงทะเบียนพาร์ทเนอร์" ของแอปพลิเคชัน Cymbal Eats ซึ่งบริษัทที่ทำงานร่วมกับ Cymbal Eats ใช้ในการประมวลผลคำสั่งซื้ออาหาร
สิ่งที่คุณจะได้เรียนรู้
การเปลี่ยนแปลงเล็กๆ น้อยๆ ในขั้นตอนเริ่มต้นขั้นต่ำสำหรับการติดตั้งใช้งานแอปใน Cloud Run จะช่วยเพิ่มความปลอดภัยได้อย่างมาก คุณจะนำแอปและวิธีการติดตั้งใช้งานที่มีอยู่ไปเปลี่ยนขั้นตอนการติดตั้งใช้งานเพื่อปรับปรุงความปลอดภัยของแอปที่ติดตั้งใช้งาน
จากนั้นคุณจะเห็นวิธีให้สิทธิ์เข้าถึงแอปและส่งคำขอที่ได้รับอนุญาต
บทความนี้ไม่ได้กล่าวถึงการรักษาความปลอดภัยของการติดตั้งใช้งานแอปพลิเคชันอย่างละเอียด แต่กล่าวถึงการเปลี่ยนแปลงที่คุณทําได้กับการติดตั้งใช้งานแอปทั้งหมดในอนาคต ซึ่งจะช่วยปรับปรุงความปลอดภัยได้โดยไม่ต้องทําอะไรมาก
2. การตั้งค่าและข้อกําหนด
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะต้องไม่ซ้ำกันสำหรับโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID
) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าฟีเจอร์นี้พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้ไม่น่าจะเสียค่าใช้จ่ายมากนัก หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างไว้หรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ 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 สําหรับห้องทดลองนี้ โดยปกติแล้ว คุณสามารถคัดลอกและวางคําสั่งตามที่เป็นได้ แต่บางกรณีคุณจะต้องเปลี่ยนค่าตัวยึดตําแหน่งให้ถูกต้อง
- ตั้งค่าตัวแปรสภาพแวดล้อมเป็นรหัสโปรเจ็กต์เพื่อใช้ในคําสั่งภายหลัง
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
- เปิดใช้ API บริการ Cloud Run ที่จะเรียกใช้แอป, Firestore API ที่จะจัดเก็บข้อมูล NoSQL, Cloud Build API ที่จะใช้โดยคำสั่งการทำให้ใช้งานได้ และที่เก็บอาร์ติแฟกต์ที่จะใช้เก็บคอนเทนเนอร์แอปพลิเคชันเมื่อสร้าง
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 ซึ่งอธิบายขั้นตอนที่จำเป็นในการติดตั้งใช้งานแอปนี้ ขั้นตอนบางอย่างอาจเกี่ยวข้องกับการพิจารณาด้านความปลอดภัยโดยนัยหรือโดยชัดแจ้ง คุณจะต้องเปลี่ยนตัวเลือกเหล่านี้ 2-3 รายการเพื่อปรับปรุงความปลอดภัยของแอปที่ติดตั้งใช้งาน ตามที่อธิบายไว้ที่นี่
ขั้นตอนที่ 3 - เรียกใช้ npm install
คุณควรทราบแหล่งที่มาและความสมบูรณ์ของซอฟต์แวร์ของบุคคลที่สามที่ใช้ในแอป การจัดการความปลอดภัยของซัพพลายเชนซอฟต์แวร์เกี่ยวข้องกับการสร้างซอฟต์แวร์ทุกประเภท ไม่ใช่แค่แอปที่ติดตั้งใช้งานใน Cloud Run ห้องทดลองนี้มุ่งเน้นที่การติดตั้งใช้งาน จึงไม่ได้กล่าวถึงเรื่องดังกล่าว แต่คุณอาจต้องหาข้อมูลเกี่ยวกับหัวข้อนี้แยกต่างหาก
ขั้นตอนที่ 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
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 ในบัญชี สิทธิ์ดังกล่าวสามารถเพิกถอนได้หากจำเป็น ซึ่งเป็นสิ่งที่ควรทำในแอปพลิเคชันเวอร์ชันที่ใช้งานจริง แทนที่จะทำเช่นนั้นในตอนนี้ คุณจะต้องสร้างบัญชีบริการใหม่ที่ไม่มีการกำหนดสิทธิ์หรือบทบาทใดๆ ให้กับบัญชีดังกล่าว แล้วใช้บัญชีดังกล่าวเพื่อพยายามเข้าถึงแอปที่ติดตั้งใช้งาน
- สร้างบัญชีบริการชื่อ
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 ยอมรับ ไลบรารีของไคลเอ็นต์มีให้บริการในหลายภาษาที่โปรแกรมต่างๆ สามารถใช้เพื่อขอออกโทเค็นดังกล่าว ไลบรารีของไคลเอ็นต์ที่ใช้ในตัวอย่างนี้คือไลบรารี 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
- การทริกเกอร์เวิร์กโฟลว์ระบบคลาวด์ด้วย Eventarc
- การเรียกให้ประมวลผลเหตุการณ์จาก Cloud Storage
- การเชื่อมต่อกับ Private CloudSQL จาก Cloud Run
- การเชื่อมต่อกับฐานข้อมูลที่จัดการครบวงจรจาก Cloud Run
- แอปพลิเคชันแบบเซิร์ฟเวอร์เสมือนที่ปลอดภัยด้วย Identity-Aware Proxy (IAP)
- การเรียกใช้งาน Cloud Run ด้วย Cloud Scheduler
- การรักษาความปลอดภัยของการรับส่งข้อมูลขาเข้าใน Cloud Run
- การเชื่อมต่อกับ AlloyDB ส่วนตัวจาก GKE Autopilot
ล้างข้อมูล
โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้
การลบโปรเจ็กต์
วิธีที่ง่ายที่สุดในการหยุดการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างสำหรับบทแนะนำ