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 ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD
เปิดใช้งาน Cloud Shell
- คลิกเปิดใช้งาน Cloud Shell
จาก Cloud Console
หากคุณไม่เคยเริ่มต้นใช้งาน Cloud Shell มาก่อน คุณจะเห็นหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ซึ่งอธิบายว่านี่คืออะไร หากเป็นเช่นนั้น ให้คลิกดำเนินการต่อ (คุณจะไม่เห็นการดำเนินการนี้อีก) หน้าจอแบบครั้งเดียวมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ 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 ที่จะใช้โดยคำสั่งการทำให้ใช้งานได้ และ 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 ซึ่งจะอธิบายขั้นตอนที่จำเป็นในการทำให้แอปนี้ใช้งานได้ ขั้นตอนเหล่านี้อาจมีการตัดสินใจด้านความปลอดภัยโดยปริยายหรือโดยชัดแจ้ง คุณจะต้องเปลี่ยนแปลงตัวเลือกเหล่านี้ 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
เพื่อ disallow เข้าถึงที่ไม่ได้ตรวจสอบสิทธิ์(–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
เมื่อการทำให้ใช้งานได้เสร็จสมบูรณ์ บรรทัดสุดท้ายของเอาต์พุตคำสั่งจะแสดง 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 ตัวอย่างในไดเรกทอรีด้วยคำสั่ง 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 ซึ่งวิธีการนี้อยู่นอกเหนือขอบเขตของ Codelab นี้
คุณอาจสังเกตเห็นว่าการตอบกลับคำขอตัวอย่างจนถึงตอนนี้เป็นออบเจ็กต์ 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
หากคุณใช้ Command Shell เช่น Cloud Shell หรือเชลล์เทอร์มินัลมาตรฐานในคอมพิวเตอร์ของคุณเอง ผู้ใช้เริ่มต้นจะเป็นผู้ใช้ที่ได้ตรวจสอบสิทธิ์ภายในเชลล์นั้นแล้ว ใน Cloud Shell ซึ่งก็คือผู้ใช้ที่เข้าสู่ระบบ Google ในกรณีอื่นๆ จะเป็นรายการที่ผู้ใช้ตรวจสอบสิทธิ์ด้วย gcloud auth login
หรือคำสั่ง gcloud
อื่น หากผู้ใช้ไม่เคยเข้าสู่ระบบ ก็จะไม่มีผู้ใช้เริ่มต้นและโค้ดนี้จะล้มเหลว
สำหรับโปรแกรมที่ส่งคำขอของโปรแกรมอื่น โดยทั่วไปคุณไม่ต้องการใช้ข้อมูลประจำตัวของบุคคล แต่ใช้ข้อมูลประจำตัวของโปรแกรมที่ส่งคำขอ ซึ่งเป็นหน้าที่ของบัญชีบริการ คุณได้ทำให้บริการ Cloud Run ใช้งานได้ด้วยบัญชีบริการเฉพาะที่ให้ข้อมูลประจำตัวที่บริการใช้เมื่อส่งคำขอ API เช่น Cloud Firestore เมื่อโปรแกรมทำงานบน Google Cloud Platform ไลบรารีของไคลเอ็นต์จะใช้บัญชีบริการที่กำหนดให้กับโปรแกรมเป็นข้อมูลระบุตัวตนเริ่มต้นโดยอัตโนมัติ ดังนั้นโค้ดโปรแกรมเดียวกันจะทำงานได้ทั้งสองสถานการณ์
โค้ด 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
คุณจะเรียกใช้โปรแกรมนี้ด้วยคำสั่ง Shell คุณจะต้องตรวจสอบสิทธิ์เป็นผู้ใช้เริ่มต้นก่อน เพื่อให้โปรแกรมใช้ข้อมูลรับรองเหล่านั้นได้ เรียกใช้คำสั่งการตรวจสอบสิทธิ์ gcloud ด้านล่าง
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
- แอปพลิเคชัน Serverless ที่ปลอดภัยด้วย Identity Aware Proxy (IAP)
- การทริกเกอร์งาน Cloud Run ด้วย Cloud Scheduler
- การรักษาความปลอดภัยการรับส่งข้อมูลขาเข้าของ Cloud Run
- การเชื่อมต่อกับ AlloyDB แบบส่วนตัวจาก GKE Autopilot
ล้างข้อมูล
เพื่อหลีกเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้ โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการ
กำลังลบโปรเจ็กต์
วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างไว้สำหรับบทแนะนำ