Triển khai an toàn cho Cloud Run

1. Tổng quan

Bạn sẽ sửa đổi các bước mặc định khi triển khai một dịch vụ lên Cloud Run để tăng cường bảo mật, sau đó xem cách truy cập vào ứng dụng đã triển khai một cách an toàn. Ứng dụng là một "dịch vụ đăng ký đối tác" của ứng dụng Cymbal Eats, được các công ty hợp tác với Cymbal Eats sử dụng để xử lý các đơn đặt món ăn.

Kiến thức bạn sẽ học được

Bằng cách thực hiện một vài thay đổi nhỏ đối với các bước mặc định tối thiểu để triển khai ứng dụng lên Cloud Run, bạn có thể tăng đáng kể khả năng bảo mật của ứng dụng. Bạn sẽ dùng một ứng dụng và hướng dẫn triển khai hiện có, đồng thời thay đổi các bước triển khai để cải thiện tính bảo mật của ứng dụng được triển khai.

Sau đó, bạn sẽ thấy cách cho phép ứng dụng truy cập và đưa ra những yêu cầu được uỷ quyền.

Đây không phải là cái nhìn toàn diện về bảo mật triển khai ứng dụng, mà là một cái nhìn về những thay đổi bạn có thể thực hiện cho tất cả các triển khai ứng dụng trong tương lai nhằm cải thiện bảo mật mà không mất nhiều công sức.

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

55efc1aaa7a4d3ad.pngS

Nếu trước đây bạn chưa từng khởi động Cloud Shell, thì bạn sẽ thấy một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.pngs

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện chỉ bằng một trình duyệt hoặc Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

Thiết lập môi trường

Bạn sẽ chạy các lệnh trong dòng lệnh Cloud Shell cho phòng thí nghiệm này. Thường thì bạn có thể sao chép các lệnh rồi dán y nguyên, mặc dù trong một số trường hợp, bạn sẽ cần phải thay đổi giá trị phần giữ chỗ thành giá trị chính xác.

  1. Đặt một biến môi trường thành Mã dự án để sử dụng trong các lệnh sau này:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
  1. Bật API dịch vụ Cloud Run sẽ chạy ứng dụng của bạn, API Firestore cung cấp bộ nhớ dữ liệu NoSQL, API Cloud Build mà lệnh triển khai sử dụng và Artifact Registry sẽ được dùng để lưu giữ vùng chứa ứng dụng khi được tạo:
gcloud services enable \
  run.googleapis.com \
  firestore.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  1. Khởi chạy cơ sở dữ liệu Firestore ở chế độ Gốc. Lệnh đó sử dụng API App Engine, vì vậy, bạn phải bật lệnh này trước.

Lệnh này phải chỉ định một khu vực cho App Engine mà chúng tôi sẽ không sử dụng nhưng sẽ phải tạo vì các lý do trước đây và một khu vực cho cơ sở dữ liệu. Chúng ta sẽ dùng tập trung us-central cho App Engine và nam5 cho cơ sở dữ liệu. nam5 là vị trí nhiều vùng của Hoa Kỳ. Các vị trí tại nhiều khu vực sẽ giúp tối đa hoá khả năng hoạt động và tính bền vững của cơ sở dữ liệu.

gcloud services enable appengine.googleapis.com

gcloud app create --region=us-central
gcloud firestore databases create --region=nam5
  1. Sao chép kho lưu trữ ứng dụng mẫu và chuyển đến thư mục đó
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service

3. Xem lại tệp README

Mở trình chỉnh sửa và xem các tệp tạo nên ứng dụng. Xem README.md, mô tả các bước cần thiết để triển khai ứng dụng này. Một số bước có thể liên quan đến các quyết định bảo mật ngầm hoặc rõ ràng cần xem xét. Bạn sẽ thay đổi một vài trong số những lựa chọn này để cải thiện tính bảo mật của ứng dụng đã triển khai, như được mô tả tại đây:

Bước 3 – Chạy npm install

Điều quan trọng là phải biết nguồn gốc và tính toàn vẹn của bất kỳ phần mềm bên thứ ba nào được sử dụng trong ứng dụng. Quản lý bảo mật chuỗi cung ứng của phần mềm liên quan đến việc xây dựng bất kỳ phần mềm nào, không chỉ các ứng dụng được triển khai cho Cloud Run. Phòng thí nghiệm này tập trung vào việc triển khai, vì vậy không giải quyết lĩnh vực này, nhưng bạn có thể muốn nghiên cứu riêng chủ đề.

Bước 4 và 5 – Chỉnh sửa và chạy deploy.sh

Các bước này sẽ triển khai ứng dụng lên Cloud Run và giữ nguyên hầu hết các lựa chọn theo mặc định. Bạn sẽ sửa đổi bước này để triển khai an toàn hơn theo hai cách chính:

  1. Không cho phép truy cập khi chưa xác thực. Việc cho phép thử nghiệm trong quá trình khám phá là rất thuận tiện, nhưng đây là dịch vụ web dành cho các đối tác thương mại sử dụng và phải luôn xác thực người dùng.
  2. Chỉ định rằng ứng dụng phải sử dụng một tài khoản dịch vụ chuyên dụng chỉ phù hợp với các đặc quyền cần thiết, thay vì một tài khoản mặc định có thể có nhiều quyền truy cập API và tài nguyên hơn mức cần thiết. Đây được gọi là nguyên tắc về đặc quyền tối thiểu và là khái niệm cơ bản về bảo mật ứng dụng.

Bước 6 đến 11 – Tạo các yêu cầu web mẫu để xác minh hành vi chính xác

Do việc triển khai ứng dụng hiện yêu cầu xác thực, nên những yêu cầu này giờ đây phải bao gồm bằng chứng về danh tính của người yêu cầu. Thay vì chỉnh sửa các tệp này, bạn sẽ yêu cầu ngay từ dòng lệnh.

4. Triển khai dịch vụ một cách an toàn

Có hai thay đổi được xác định là cần thiết trong tập lệnh deploy.sh: không cho phép truy cập khi chưa xác thực và sử dụng tài khoản dịch vụ chuyên dụng với đặc quyền tối thiểu.

Trước tiên, bạn sẽ tạo một tài khoản dịch vụ mới, sau đó chỉnh sửa tập lệnh deploy.sh để tham chiếu đến tài khoản dịch vụ đó và không cho phép người dùng chưa xác thực truy cập, sau đó triển khai dịch vụ bằng cách chạy tập lệnh đã sửa đổi trước khi chúng ta có thể chạy tập lệnh triển khai.sh đã sửa đổi.

Tạo một tài khoản dịch vụ và cấp cho tài khoản đó quyền truy cập cần thiết vào 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

Chỉnh sửa deploy.sh

Sửa đổi tệp deploy.sh để không cho phép truy cập chưa được xác thực(–no-cho phép-un xác thực) và để chỉ định tài khoản dịch vụ mới(–service-account) cho ứng dụng đã triển khai. Hãy sửa GOOGLE_PROJECT_ID thành mã dự án của riêng bạn.

Bạn sẽ xoá hai dòng đầu tiên và thay đổi ba dòng khác như minh hoạ dưới đây.

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

Triển khai dịch vụ

Trên dòng lệnh, hãy chạy tập lệnh deploy.sh:

./deploy.sh

Khi quá trình triển khai hoàn tất, dòng cuối cùng của kết quả lệnh sẽ hiển thị URL dịch vụ của ứng dụng mới. Lưu URL trong một biến môi trường:

export SERVICE_URL=<URL from last line of command output>

Bây giờ, hãy thử tìm nạp đơn đặt hàng từ ứng dụng bằng công cụ curl:

curl -i -X GET $SERVICE_URL/partners

Cờ -i cho lệnh curl yêu cầu lệnh này đưa các tiêu đề phản hồi vào kết quả. Dòng đầu tiên của dữ liệu đầu ra sẽ là:

HTTP/2 403

Ứng dụng được triển khai với lựa chọn không cho phép các yêu cầu chưa được xác thực. Lệnh curl này không chứa thông tin xác thực nên bị Cloud Run từ chối. Ứng dụng thực tế được triển khai thậm chí không chạy hoặc nhận bất kỳ dữ liệu nào từ yêu cầu này.

5. Tạo yêu cầu được xác thực

Ứng dụng đã triển khai được gọi bằng cách tạo các yêu cầu web và giờ đây, các yêu cầu này phải được xác thực để có thể chạy trên Cloud Run. Các yêu cầu web được xác thực bằng cách thêm một tiêu đề Authorization vào biểu mẫu:

Authorization: Bearer identity-token

Mã thông báo danh tính là một chuỗi ngắn được mã hoá và có chữ ký mã hoá do một nhà cung cấp dịch vụ xác thực đáng tin cậy phát hành. Trong trường hợp này, bạn cần phải có một mã thông báo danh tính hợp lệ, chưa hết hạn do Google cấp.

Tạo yêu cầu với tư cách là tài khoản người dùng của bạn

Công cụ Google Cloud CLI có thể cung cấp mã thông báo cho người dùng được xác thực mặc định. Chạy lệnh này để nhận mã thông báo nhận dạng cho tài khoản của riêng bạn và lưu mã đó trong biến môi trường ID_TOKEN:

export ID_TOKEN=$(gcloud auth print-identity-token)

Theo mặc định, mã thông báo danh tính do Google cấp sẽ có hiệu lực trong một giờ. Chạy lệnh curl sau đây để tạo yêu cầu đã bị từ chối trước đó do không được uỷ quyền. Lệnh này sẽ bao gồm tiêu đề cần thiết:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

Đầu ra lệnh phải bắt đầu bằng HTTP/2 200, cho biết rằng yêu cầu có thể chấp nhận được và đang được thực hiện. (Nếu bạn đợi một giờ rồi thử yêu cầu lại, thì yêu cầu sẽ không thành công vì mã thông báo sẽ hết hạn.) Phần nội dung của phản hồi nằm ở cuối kết quả, sau một dòng trống:

{"status":"success","data":[]}

Chưa có đối tác nào.

Đăng ký đối tác bằng cách sử dụng dữ liệu JSON mẫu trong thư mục bằng 2 lệnh 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

Lặp lại yêu cầu GET trước đó để xem tất cả các đối tác đã đăng ký ngay bây giờ:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

Bạn sẽ thấy dữ liệu JSON với nội dung phong phú hơn rất nhiều, cung cấp thông tin về hai đối tác đã đăng ký.

Gửi yêu cầu dưới dạng tài khoản trái phép

Yêu cầu được xác thực được đưa ra ở bước cuối cùng thành công không chỉ vì yêu cầu đã được xác thực mà còn vì người dùng được xác thực (tài khoản của bạn) đã được uỷ quyền. Tức là tài khoản đó đã có quyền gọi ứng dụng. Không phải tài khoản đã xác thực nào cũng được phép làm việc đó.

Tài khoản mặc định dùng trong yêu cầu trước đó đã được uỷ quyền vì đây là tài khoản tạo dự án chứa ứng dụng và theo mặc định, tài khoản này cấp quyền gọi bất kỳ ứng dụng Cloud Run nào trong tài khoản. Quyền đó có thể bị thu hồi nếu cần, đây là điều đáng mong muốn trong ứng dụng chính thức. Thay vì làm việc đó ngay bây giờ, bạn sẽ tạo một tài khoản dịch vụ mới mà không có đặc quyền hoặc vai trò nào được chỉ định cho tài khoản đó và sử dụng tài khoản đó để thử truy cập vào ứng dụng đã triển khai.

  1. Tạo một tài khoản dịch vụ có tên là tester.
gcloud iam service-accounts create tester
  1. Bạn sẽ nhận được mã thông báo nhận dạng cho tài khoản mới này giống như cách bạn nhận được mã thông báo cho tài khoản mặc định trước đó. Tuy nhiên, việc này yêu cầu tài khoản mặc định của bạn có quyền mạo danh tài khoản dịch vụ. Cấp quyền này cho tài khoản của bạn.
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. Bây giờ, hãy chạy lệnh sau để lưu mã thông báo danh tính cho tài khoản mới này trong biến môi trường TEST_IDENTITY. Nếu lệnh đó hiện thông báo lỗi, hãy đợi một hoặc hai phút rồi thử lại.
export TEST_TOKEN=$( \
  gcloud auth print-identity-token \
    --impersonate-service-account \
    "tester@$PROJECT_ID.iam.gserviceaccount.com" \
)
  1. Đưa ra yêu cầu web đã xác thực như trước, nhưng sử dụng mã thông báo nhận dạng sau:
curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

Kết quả xuất ra của lệnh sẽ bắt đầu lại bằng HTTP/2 403 vì yêu cầu mặc dù đã được xác thực nhưng không được uỷ quyền. Tài khoản dịch vụ mới không có quyền gọi ứng dụng này.

Uỷ quyền tài khoản

Tài khoản người dùng hoặc dịch vụ phải có vai trò Người gọi trong Cloud Run trên dịch vụ Cloud Run để gửi yêu cầu tới tài khoản đó. Chỉ định vai trò đó cho tài khoản dịch vụ của người kiểm thử bằng lệnh:

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}

Sau khi đợi một hoặc hai phút để vai trò mới được cập nhật, hãy lặp lại yêu cầu đã xác thực. Lưu TEST_TOKEN mới nếu đã được một giờ trở lên kể từ lần lưu đầu tiên.

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

Giờ đây, đầu ra của lệnh bắt đầu bằng HTTP/1.1 200 OK và dòng cuối cùng chứa phản hồi JSON. Yêu cầu này đã được Cloud Run chấp nhận và xử lý.

6. Xác thực chương trình và xác thực người dùng

Những yêu cầu đã xác thực mà bạn đưa ra cho đến nay đã sử dụng công cụ dòng lệnh curl. Một số công cụ và ngôn ngữ lập trình khác có thể được dùng để thay thế. Tuy nhiên, bạn không thể dùng một trình duyệt web có các trang web thuần tuý để thực hiện các yêu cầu đã xác thực trên Cloud Run. Nếu người dùng nhấp vào một đường liên kết hoặc nhấp vào một nút để gửi biểu mẫu trên một trang web, thì trình duyệt sẽ không thêm tiêu đề Authorization mà Cloud Run yêu cầu cho các yêu cầu đã được xác thực.

Cơ chế xác thực tích hợp sẵn của Cloud Run dành cho các chương trình chứ không phải người dùng cuối sử dụng.

Lưu ý:

Cloud Run có thể lưu trữ các ứng dụng web mà người dùng trực tiếp sử dụng, nhưng các loại ứng dụng đó phải đặt Cloud Run để cho phép các yêu cầu chưa được xác thực từ người dùng trình duyệt web. Nếu các ứng dụng yêu cầu xác thực người dùng thì ứng dụng phải xử lý thay vì yêu cầu Cloud Run thực hiện việc này. Ứng dụng có thể làm việc này theo cách tương tự như các ứng dụng web không phải Cloud Run. Cách thức thực hiện không thuộc phạm vi của lớp học lập trình này.

Có thể bạn đã nhận thấy rằng cho đến nay, phản hồi cho các yêu cầu mẫu là các đối tượng JSON chứ không phải trang web. Lý do là dịch vụ đăng ký đối tác này dành cho các chương trình sử dụng, và JSON là một hình thức thuận tiện để họ sử dụng. Tiếp theo, bạn sẽ viết và chạy một chương trình để sử dụng và sử dụng dữ liệu này.

Các yêu cầu được xác thực từ một chương trình Python

Một chương trình có thể đưa ra những yêu cầu đã được xác thực đối với một ứng dụng Cloud Run bảo mật thông qua các yêu cầu web HTTP tiêu chuẩn, nhưng bao gồm cả tiêu đề Authorization. Thách thức mới duy nhất dành cho những chương trình đó là nhận mã thông báo danh tính hợp lệ, chưa hết hạn để đặt vào tiêu đề đó. Cloud Run sẽ xác thực mã thông báo đó bằng giải pháp Quản lý danh tính và quyền truy cập (IAM) của Google Cloud. Vì vậy, mã thông báo phải do một cơ quan có thẩm quyền được IAM công nhận phát hành và ký. Có nhiều thư viện ứng dụng bằng nhiều ngôn ngữ mà các chương trình có thể dùng để yêu cầu phát hành mã thông báo như vậy. Thư viện ứng dụng mà ví dụ này sẽ sử dụng là một thư viện Python google.auth. Nói chung, có một số thư viện Python dùng để tạo yêu cầu web; ví dụ này sử dụng mô-đun requests phổ biến.

Bước đầu tiên là cài đặt hai thư viện ứng dụng:

pip install google-auth
pip install requests

Mã Python để yêu cầu mã thông báo danh tính cho người dùng mặc định là:

credentials, _ = google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
identity_token = credentials.id_token

Nếu bạn đang sử dụng một shell lệnh như Cloud Shell hoặc shell tiêu chuẩn trên máy tính của riêng mình, thì người dùng mặc định là bất kỳ ai đã xác thực bên trong shell đó. Trong Cloud Shell, thông thường, đó là người dùng đã đăng nhập vào Google. Trong các trường hợp khác, đó là bất kỳ thứ gì người dùng được xác thực bằng gcloud auth login hoặc lệnh gcloud khác. Nếu người dùng này chưa từng đăng nhập, thì sẽ không có người dùng mặc định và mã này sẽ bị lỗi.

Đối với một chương trình đưa ra yêu cầu của một chương trình khác, thường thì bạn không muốn sử dụng danh tính của một người mà thay vào đó là danh tính của chương trình yêu cầu. Đó là mục đích của tài khoản dịch vụ. Bạn đã triển khai dịch vụ Cloud Run bằng một tài khoản dịch vụ chuyên biệt. Tài khoản này cung cấp danh tính mà dịch vụ này dùng khi đưa ra các yêu cầu API, chẳng hạn như đến Cloud Firestore. Khi một chương trình chạy trên Google Cloud Platform, thư viện ứng dụng sẽ tự động dùng tài khoản dịch vụ được chỉ định cho chương trình đó làm thông tin nhận dạng mặc định. Do đó, cùng một mã chương trình sẽ hoạt động trong cả hai trường hợp.

Mã Python để tạo yêu cầu có thêm tiêu đề Uỷ quyền là:

auth_header = {"Authorization": "Bearer " + identity_token}
response = requests.get(url, headers=auth_header)

Chương trình Python hoàn chỉnh sau đây sẽ gửi một yêu cầu đã xác thực tới dịch vụ Cloud Run để truy xuất tất cả đối tác đã đăng ký rồi in tên và mã nhận dạng được chỉ định của họ. Sao chép và chạy lệnh bên dưới để lưu mã này vào tệp 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

Bạn sẽ chạy chương trình này bằng một lệnh shell. Trước tiên, bạn cần xác thực là người dùng mặc định để chương trình có thể sử dụng những thông tin đăng nhập đó. Chạy lệnh xác thực gcloud bên dưới:

gcloud auth application-default login

Làm theo hướng dẫn để hoàn tất quá trình đăng nhập. Sau đó, chạy chương trình qua dòng lệnh:

python print_partners.py

Kết quả đầu ra sẽ có dạng như sau:

10102: Zippy food delivery
67292: Foodful

Yêu cầu của chương trình này được gửi đến dịch vụ Cloud Run vì dịch vụ này đã được xác thực bằng danh tính của bạn. Đồng thời, bạn là chủ sở hữu của dự án này, do đó được uỷ quyền để chạy dự án theo mặc định. Chương trình này thường sẽ chạy trong danh tính của tài khoản dịch vụ. Khi chạy trên hầu hết sản phẩm của Google Cloud, chẳng hạn như Cloud Run hoặc App Engine, danh tính mặc định sẽ là một tài khoản dịch vụ và sẽ được dùng thay cho tài khoản cá nhân.

7. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!

Bước tiếp theo:

Khám phá các lớp học lập trình khác về Cymbal Eats:

Dọn dẹp

Để tránh làm phát sinh chi phí cho các tài nguyên được sử dụng trong hướng dẫn này trong tài khoản Google Cloud của bạn, hãy xoá dự án chứa các tài nguyên đó, hoặc giữ lại dự án và xoá từng tài nguyên riêng lẻ.

Xoá dự án

Cách dễ nhất để loại bỏ việc thanh toán là xoá dự án bạn đã tạo cho phần hướng dẫn.