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 để triển khai một dịch vụ lên Cloud Run nhằm cải thiện tính 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 này là "dịch vụ đăng ký đối tác" của ứng dụng Cymbal Eats. Các công ty làm việc với Cymbal Eats sử dụng ứng dụng này để xử lý đơn đặt mó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 một ứng dụng lên Cloud Run, bạn có thể tăng đáng kể tính bảo mật của ứng dụng đó. Bạn sẽ lấy một ứng dụng và hướng dẫn triển khai hiện có, sau đó thay đổi các bước triển khai để cải thiện tính bảo mật của ứng dụng đã triển khai.

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

Đây không phải là một cái nhìn toàn diện về tính bảo mật khi triển khai ứng dụng, mà là một cái nhìn về những thay đổi mà bạn có thể thực hiện đối với tất cả các hoạt động triển khai ứng dụng trong tương lai để cải thiện tính bảo mật của ứng dụng mà không tốn 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 tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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ự mà các API của Google không 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à giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. 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 (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được 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ử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án.
  • Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 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.png.

55efc1aaa7a4d3ad.png

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

9c92662c6a846a5c.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

9f0e51b578fecce5.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này 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 rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạ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

Đầu ra của 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

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của 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 bài tập thực hành này. Bạn thường có thể sao chép các lệnh và dán nguyên trạng. Tuy nhiên, trong một số trường hợp, bạn sẽ cần thay đổi các giá trị của 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 để dùng trong các lệnh sau:
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 sẽ cung cấp bộ nhớ dữ liệu NoSQL, API Cloud Build sẽ được lệnh triển khai sử dụng và Artifact Registry sẽ được dùng để lưu trữ 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 động cơ sở dữ liệu Firestore ở chế độ Native. Lệnh đó sử dụng App Engine API, vì vậy, trước tiên bạn phải bật lệnh này.

Lệnh này phải chỉ định một khu vực cho App Engine (chúng ta sẽ không sử dụng nhưng phải tạo vì lý do lịch sử) và một khu vực cho cơ sở dữ liệu. Chúng ta sẽ sử dụng us-central cho App Engine và nam5 cho cơ sở dữ liệu. nam5 là vị trí theo nhiều vùng của Hoa Kỳ. Vị trí ở nhiều khu vực giúp tối đa hoá tính sẵn có và độ bền 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. Nhân bản 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 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, tệp này mô tả các bước cần thiết để triển khai ứng dụng này. Một số bước trong số này có thể liên quan đến các quyết định bảo mật ngầm hoặc rõ ràng cần cân nhắc. Bạn sẽ thay đổi một số lựa chọn này để cải thiện tính bảo mật cho ứng dụng đã triển khai, như mô tả tại đây:

Bước 3 – Chạy npm install

Điều quan trọng là bạn phải biết nguồn gốc và tính toàn vẹn của mọi phần mềm bên thứ ba được dùng trong một ứng dụng. Việc quản lý tính bảo mật của chuỗi cung ứng phần mềm có liên quan đến việc xây dựng bất kỳ phần mềm nào, chứ 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 nên không đề cập đến vấn đề này, nhưng bạn có thể muốn nghiên cứu chủ đề này riêng.

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

Các bước này triển khai ứng dụng đến Cloud Run, để hầu hết các lựa chọn ở trạng thái mặc định. Bạn sẽ sửa đổi bước này để triển khai một cách an toàn hơn theo 2 cách chính:

  1. Không cho phép truy cập mà không được xác thực. Bạn có thể cho phép điều đó để thử nghiệm mọi thứ trong quá trình khám phá, nhưng đây là một dịch vụ web dành cho các đối tác thương mại và luôn phải 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ỉ có 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 vào 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à một 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 mẫu trên web để xác minh hành vi chính xác

Vì quá trình triển khai ứng dụng hiện yêu cầu xác thực, nên các yêu cầu này hiện phải có bằng chứng về danh tính của người yêu cầu. Thay vì sửa đổi các tệp này, bạn sẽ đưa ra yêu cầu trực tiếp từ dòng lệnh.

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

Có 2 thay đổi cần thiết trong tập lệnh deploy.sh: không cho phép truy cập mà không cần 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 truy cập chưa được xác thực, 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 tôi có thể chạy tập lệnh deploy.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 xác thực(–no-allow-unauthenticated) và chỉ định tài khoản dịch vụ mới(–service-account) cho ứng dụng đã triển khai. Sửa GOOGLE_PROJECT_ID thành mã dự án của riêng bạn.

Bạn sẽ xoá 2 dòng đầu tiên và thay đổi 3 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 đầu ra 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 một đơ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 cho biết lệnh này sẽ bao gồm các tiêu đề phản hồi trong đầu ra. Dòng đầu tiên của đầu ra phải 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. Đưa ra yêu cầu đã xác thực

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

Authorization: Bearer identity-token

Mã thông báo nhận dạng là một chuỗi ngắn hạn, được mã hoá, ký bằng mật mã 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 phải có mã nhận dạng hợp lệ, còn hiệu lực do Google cấp.

Đưa ra yêu cầu bằng 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 để lấy mã thông báo nhận dạng cho tài khoản của riêng bạn và lưu mã thông báo đó 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 nhận dạng do Google phát hành có hiệu lực trong một giờ. Chạy lệnh curl sau để thực hiện yêu cầu đã bị từ chối trước đó vì chưa đượ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 của lệnh phải bắt đầu bằng HTTP/2 200, cho biết rằng yêu cầu được chấp nhận và đang được thực hiện. (Nếu bạn đợi một giờ rồi thử lại yêu cầu này, thì yêu cầu sẽ không thành công vì mã thông báo đã hết hạn.) Nội dung của phản hồi nằm ở cuối đầu ra, 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 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 có nhiều nội dung hơn, cung cấp thông tin về 2 đối tác đã đăng ký.

Đưa ra yêu cầu với tư cách là một tài khoản không được uỷ quyền

Yêu cầu đã xác thực được thực hiện ở bước cuối cùng không chỉ thành công vì đã được xác thực mà còn vì người dùng đã 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 nào được xác thực cũng có quyền làm như vậy.

Tài khoản mặc định được 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 đó có quyền gọi mọi ứng dụng Cloud Run trong tài khoản. Bạn có thể thu hồi quyền đó nếu cần, điều này sẽ rất hữu ích trong một ứng dụng phát hành công khai. Thay vì làm như vậy 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 và sử dụng tài khoản đó để cố gắng 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 theo cách tương tự 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, điều này đòi hỏi tài khoản mặc định của bạn phải có quyền mạo danh tài khoản dịch vụ. Cấp cho tài khoản của bạn quyền này.
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 nhận dạng cho tài khoản mới này trong biến môi trường TEST_IDENTITY. Nếu lệnh này cho thấy 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. Thực hiện 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 này:
curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

Đầu ra của lệnh sẽ bắt đầu bằng HTTP/2 403 một lần nữa vì yêu cầu này, mặc dù đã được xác thực, nhưng chưa đượ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 cho tài khoản

Người dùng hoặc tài khoản dịch vụ phải có vai trò Cloud Run Invoker trên một dịch vụ Cloud Run để có thể gửi yêu cầu đến dịch vụ đó. Cấp cho tài khoản dịch vụ của người kiểm thử vai trò đó 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 đã hơn một giờ kể từ lần lưu đầu tiên.

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

Đầu ra của lệnh hiện 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à ứng dụng xử lý.

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

Các yêu cầu đã xác thực mà bạn đã thực hiện cho đến nay đều sử dụng công cụ dòng lệnh curl. Bạn có thể sử dụng các công cụ và ngôn ngữ lập trình khác để thay thế. Tuy nhiên, bạn không thể thực hiện các yêu cầu được xác thực của Cloud Run bằng trình duyệt web có các trang web thuần tuý. 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 trong 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 đã xác thực.

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

Lưu ý:

Cloud Run có thể lưu trữ các ứng dụng web dành cho người dùng, nhưng những loại ứng dụng đó phải thiết lập Cloud Run để cho phép các yêu cầu chưa xác thực từ trình duyệt web của người dùng. Nếu yêu cầu xác thực người dùng, ứng dụng phải xử lý việc này thay vì yêu cầu Cloud Run thực hiện. Ứng dụng có thể thực hiện việc đó theo cách tương tự như các ứng dụng web bên ngoài Cloud Run. Cách thực hiện việc đó nằm ngoài 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 các phản hồi cho các yêu cầu ví dụ cho đến nay đều là các đối tượng JSON chứ không phải trang web. Lý do là vì 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 dạng thức thuận tiện để các chương trình sử dụng. Tiếp theo, bạn sẽ viết và chạy một chương trình để sử dụng dữ liệu này.

Yêu cầu đã xác thực từ chương trình Python

Một chương trình có thể đưa ra các yêu cầu đã xác thực của một ứng dụng Cloud Run được 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 đối với những chương trình đó là lấy được một mã nhận dạng hợp lệ, chưa hết hạn để đặt trong tiêu đề đó. Cloud Run sẽ xác thực mã thông báo đó bằng cách sử dụng dịch vụ Cloud Identity và Quản lý danh tính và quyền truy cập (IAM) của Google Cloud. Do đó, mã thông báo phải do một cơ quan được IAM công nhận phát hành và ký. Có các thư viện ứng dụng bằng nhiều ngôn ngữ mà chương trình có thể sử dụng để yêu cầu cấp mã thông báo như vậy. Thư viện ứng dụng mà ví dụ này sẽ dùng là thư viện google.auth của Python. Có một số thư viện Python để tạo yêu cầu web nói chung; 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ã nhận dạng 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 trình bao dòng lệnh như Cloud Shell hoặc trình bao đầu cuối tiêu chuẩn trên máy tính của mình, thì người dùng mặc định là người dùng đã xác thực trong trình bao đó. Trong Cloud Shell, đó 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ỳ người dùng nào được xác thực bằng lệnh gcloud auth login hoặc lệnh gcloud khác. Nếu người dùng chưa từng đăng nhập, sẽ không có người dùng mặc định và mã này sẽ không hoạt động.

Đối với một chương trình đưa ra yêu cầu cho một chương trình khác, bạn thường không muốn sử dụng danh tính của một người mà 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 dụng cung cấp danh tính mà dịch vụ này sử dụng khi đưa ra các yêu cầu API, chẳng hạn như đối với Cloud Firestore. Khi một chương trình chạy trên nền tảng Google Cloud, các thư viện ứng dụng sẽ tự động sử dụng tài khoản dịch vụ được chỉ định cho chương trình đó làm danh tính mặc định. Vì vậy, cùng một mã chương trình sẽ hoạt động trong cả hai trường hợp.

Mã Python để đưa ra yêu cầu có tiêu đề Uỷ quyền đã thêm 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ẽ đưa ra một yêu cầu đã xác thực đến dịch vụ Cloud Run để truy xuất tất cả các đối tác đã đăng ký, sau đó 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 với tư cách 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 gcloud auth bên dưới:

gcloud auth application-default login

Làm theo hướng dẫn để hoàn tất quy trình đăng nhập. Sau đó, chạy chương trình từ 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 đã được gửi đến dịch vụ Cloud Run vì yêu cầu đó được xác thực bằng danh tính của bạn, và bạn là chủ sở hữu của dự án này nên theo mặc định, bạn được phép chạy dự án. Chương trình này thường chạy dưới danh tính của một tài khoản dịch vụ. Khi chạy trên hầu hết các 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 tất lớp học lập trình này!

Bước tiếp theo:

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

Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên.

Xoá dự án

Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho hướng dẫn này.