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

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

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

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

  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 ซึ่งวิธีการนี้อยู่นอกเหนือขอบเขตของ 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

ล้างข้อมูล

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

กำลังลบโปรเจ็กต์

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