本教學課程將說明如何建立投票服務,其中包含:
以瀏覽器為基礎的用戶端,具備下列功能:
- 使用 Identity Platform 擷取 ID 權杖。
- 允許使用者為自己最喜歡的寵物投票。
- 將該 ID 符記新增至處理投票要求的 Cloud Run 伺服器。
符合下列條件的 Cloud Run 伺服器:
- 檢查是否提供有效的 ID 權杖,確保使用者已完成驗證。
- 處理使用者的投票。
- 使用自己的憑證,將投票結果傳送至 Cloud SQL 進行儲存。
用來儲存投票結果的 PostgreSQL 資料庫。
為求簡單起見,本教學課程使用 Google 做為提供者:使用者必須使用 Google 帳戶進行驗證,才能取得 ID 權杖。不過,您可以使用其他提供者或驗證方法讓使用者登入。
這項服務會使用 Secret Manager 保護用於連線至 Cloud SQL 執行個體的機密資料,進而降低安全性風險。並使用最低權限服務身分來確保資料庫的存取安全。
目標
撰寫、建構及部署服務至 Cloud Run,瞭解如何:
使用 Identity Platform 驗證 Cloud Run 服務後端的使用者。
為服務建立最低權限身分,以便授予最少的 Google Cloud 資源存取權。
將 Cloud Run 服務連線至 PostgreSQL 資料庫時,請使用 Secret Manager 處理機密資料。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Secret Manager, Cloud SQL, Artifact Registry, and Cloud Build APIs.
-
Artifact Registry 存放區管理員 (
roles/artifactregistry.repoAdmin
) -
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Run 管理員 (
roles/run.admin
) -
Cloud SQL 管理員 (
roles/cloudsql.admin
) -
建立服務帳戶 (
roles/iam.serviceAccountCreator
) -
Identity Platform 管理員 (
roles/identityplatform.admin
) -
OAuth 設定編輯器 (
roles/oauthconfig.editor
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
Secret Manager 管理員 (
roles/secretmanager.admin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務用量消費者 (
roles/serviceusage.serviceUsageConsumer
) -
儲存空間管理員 (
roles/storage.admin
)
必要的角色
如要取得完成本教學課程所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
設定 gcloud
預設值
如要針對 Cloud Run 服務設定 gcloud 的預設值:
設定您的預設專案:
gcloud config set project PROJECT_ID
將 PROJECT_ID 改為您為本教學課程建立的專案名稱。
為所選地區設定 gcloud:
gcloud config set run/region REGION
將 REGION 改為您所選擇的支援 Cloud Run 地區。
Cloud Run 位置
Cloud Run 具有「地區性」,這表示執行 Cloud Run 服務的基礎架構位於特定地區,並由 Google 代管,可為該地區內所有區域提供備援功能。
選擇 Cloud Run 服務的執行地區時,請將延遲時間、可用性或耐用性需求做為主要考量。一般而言,您可以選擇最靠近使用者的地區,但您應考量 Cloud Run 服務所使用的其他 Google Cloud產品位置。使用分散在不同位置的 Google Cloud 產品,可能會影響服務的延遲時間和費用。
Cloud Run 可在下列地區使用:
採用級別 1 定價
asia-east1
(臺灣)asia-northeast1
(東京)asia-northeast2
(大阪)asia-south1
(印度孟買)europe-north1
(芬蘭)低二氧化碳
europe-north2
(斯德哥爾摩)二氧化碳排放量低
europe-southwest1
(馬德里)二氧化碳排放量低2
europe-west1
(比利時)二氧化碳排放量低
europe-west4
(荷蘭)二氧化碳排放量低
europe-west8
(米蘭)europe-west9
(巴黎)二氧化碳排放量低
me-west1
(特拉維夫)northamerica-south1
(墨西哥)us-central1
(愛荷華州)二氧化碳排放量低
us-east1
(南卡羅來納州)us-east4
(北維吉尼亞州)us-east5
(哥倫布)us-south1
(達拉斯)二氧化碳排放量低
us-west1
(奧勒岡州)二氧化碳排放量低
採用級別 2 定價
africa-south1
(約翰尼斯堡)asia-east2
(香港)asia-northeast3
(韓國首爾)asia-southeast1
(新加坡)asia-southeast2
(雅加達)asia-south2
(印度德里)australia-southeast1
(雪梨)australia-southeast2
(墨爾本)europe-central2
(波蘭華沙)europe-west10
(柏林)二氧化碳排放量低
europe-west12
(都靈)europe-west2
(英國倫敦)二氧化碳排放量低
europe-west3
(德國法蘭克福)二氧化碳排放量低
europe-west6
(瑞士蘇黎世)二氧化碳排放量低
me-central1
(杜哈)me-central2
(達曼)northamerica-northeast1
(蒙特婁)二氧化碳排放量低
northamerica-northeast2
(多倫多)二氧化碳排放量低
southamerica-east1
(巴西聖保羅)二氧化碳排放量低
southamerica-west1
(智利聖地牙哥)二氧化碳排放量低
us-west2
(洛杉磯)us-west3
(鹽湖城)us-west4
(拉斯維加斯)
如果您已建立 Cloud Run 服務,即可在 Google Cloud 控制台的 Cloud Run 資訊主頁中查看地區。
擷取程式碼範例
如要擷取要使用的程式碼範例:
將應用程式存放區範例複製到本機電腦中:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
您也可以 下載 zip 格式的範例,然後解壓縮該檔案。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
您也可以 下載 zip 格式的範例,然後解壓縮該檔案。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
您也可以 下載 zip 格式的範例,然後解壓縮該檔案。
變更為包含 Cloud Run 範例程式碼的目錄:
Node.js
cd nodejs-docs-samples/run/idp-sql/
Python
cd python-docs-samples/run/idp-sql/
Java
cd java-docs-samples/run/idp-sql/
將架構視覺化

終端使用者向 Cloud Run 伺服器發出第一個要求。
用戶端會在瀏覽器中載入。
使用者透過 Identity Platform 的 Google 登入對話方塊提供登入憑證。系統會顯示快訊,歡迎已登入的使用者。
控制權會重新導向至伺服器。使用者會透過用戶端進行投票,該用戶端會從 Identity Platform 擷取 ID 權杖,並將其新增至投票要求標頭。
伺服器收到要求後,會驗證 Identity Platform ID 權杖,確認已適當驗證使用者。接著,伺服器會使用自己的憑證,將投票結果傳送至 Cloud SQL。
瞭解核心程式碼
此範例會實作為用戶端和伺服器,如後文所述。
與 Identity Platform 整合:用戶端程式碼
這個範例會使用 Firebase SDK 與 Identity Platform 整合,以便登入及管理使用者。為了連線至 Identity Platform,用戶端 JavaScript 會將專案憑證的參照項目做為設定物件保留,並匯入必要的 Firebase JavaScript SDK:
Firebase JavaScript SDK 會透過彈出式視窗,提示使用者登入 Google 帳戶,以便處理登入流程。然後將他們重新導向至服務。
使用者成功登入後,用戶端會使用 Firebase 方法鑄造 ID 權杖。用戶端會將 ID 符記新增至向伺服器提出要求的 Authorization
標頭。
與 Identity Platform 整合:伺服器端程式碼
伺服器會使用 Firebase Admin SDK 驗證從用戶端傳送的使用者 ID 符記。如果提供的 ID 權杖格式正確、未過期且已正確簽署,方法會傳回已解碼的 ID 權杖。伺服器會為該使用者擷取 Identity Platform uid
。
Node.js
Python
Java
將伺服器連線至 Cloud SQL
伺服器會使用 /cloudsql/CLOUD_SQL_CONNECTION_NAME
格式連線至 Cloud SQL 執行個體的 Unix 網域通訊端。
Node.js
Python
Java
使用 Spring Cloud Google Cloud PostgreSQL 啟動器整合功能,透過 Spring JDBC 程式庫與 Cloud SQL 中的 PostgreSQL 資料庫互動。設定 MySQL 適用的 Cloud SQL 設定,以便自動設定DataSource
bean。搭配使用 Spring JDBC 時,這個 bean 會提供 JdbcTemplate
物件 bean,可執行查詢和修改資料庫等作業。
使用 Secret Manager 處理機密設定
Secret Manager 可集中安全地儲存機密資料,例如 Cloud SQL 設定。伺服器會在執行階段透過環境變數,從 Secret Manager 插入 Cloud SQL 憑證。進一步瞭解如何在 Cloud Run 中使用密鑰。
Node.js
Python
Java
設定 Identity Platform
您必須在 Google Cloud 控制台手動設定 Identity Platform。
在 Google Cloud 控制台啟用 Identity Platform API:
設定專案:
在新的視窗中,依序前往「Google Auth Platform」>「Overview」(總覽) 頁面。
按一下「開始使用」,然後按照專案設定操作說明。
在「應用程式資訊」對話方塊中:
- 提供應用程式名稱。
- 選取畫面上顯示的其中一個使用者支援電子郵件地址。
在「目標對象」對話方塊中,選取「外部」。
在「聯絡資訊」對話方塊中,輸入聯絡電子郵件地址。
同意使用者資料政策,然後點選「建立」。
建立並取得 OAuth 用戶端 ID 和密鑰:
在 Google Cloud 控制台中,依序前往「API 和服務」>「憑證」頁面。
按一下頁面頂端的「建立憑證」,然後選取
OAuth client ID
。在「應用程式類型」中選取「網頁應用程式」,然後提供名稱。
按一下 [建立]。
client_id
和client_secret
值會在下一個步驟中使用。
將 Google 設為供應商:
前往 Google Cloud 控制台的「Identity Providers」(識別資訊提供者) 頁面。
按一下「Add A Provider」。
從清單中選取「Google」Google。
在 Web SDK 設定中,輸入上一個步驟的
client_id
和client_secret
值。按一下「設定應用程式」下方的「設定詳細資料」。
將設定複製到應用程式:
- 將
apiKey
和authDomain
值複製到範例的static/config.js
,即可初始化 Identity Platform 用戶端 SDK。
- 將
部署服務
按照步驟完成基礎架構佈建及部署作業:
使用控制台或 CLI 建立含有 PostgreSQL 資料庫的 Cloud SQL 執行個體:
gcloud sql instances create CLOUD_SQL_INSTANCE_NAME \ --database-version=POSTGRES_16 \ --region=CLOUD_SQL_REGION \ --cpu=2 \ --memory=7680MB \ --root-password=DB_PASSWORD
將 Cloud SQL 憑證值新增至
postgres-secrets.json
:Node.js
Python
Java
使用控制台或 CLI 建立有版本的機密金鑰:
gcloud secrets create idp-sql-secrets \ --replication-policy="automatic" \ --data-file=postgres-secrets.json
使用控制台或 CLI 為伺服器建立服務帳戶:
gcloud iam service-accounts create idp-sql-identity
使用控制台或 CLI 授予 Secret Manager 和 Cloud SQL 存取權角色:
允許與伺服器相關聯的服務帳戶存取已建立的密鑰:
gcloud secrets add-iam-policy-binding idp-sql-secrets \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
允許與伺服器相關聯的服務帳戶存取 Cloud SQL:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudsql.client
建立 Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
REPOSITORY
是存放區的名稱。專案中的每個存放區位置的存放區名稱都必須不重複。
使用 Cloud Build 建構容器映像檔:
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Java
這個範例使用 Jib 建構 Docker 映像檔,並使用常見的 Java 工具。Jib 可在不需要 Dockerfile 或安裝 Docker 的情況下,最佳化容器建構作業。進一步瞭解如何使用 Jib 建構 Java 容器。
使用 gcloud 憑證輔助程式授權 Docker 推送至 Artifact Registry。
gcloud auth configure-docker
使用 Jib Maven 外掛程式建構容器,並將容器推送至 Artifact Registry。
mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
使用控制台或 CLI 將容器映像檔部署至 Cloud Run。請注意,伺服器會部署為允許未經驗證的存取權。這樣使用者就能載入用戶端並開始程序。伺服器會手動驗證投票要求中新增的 ID 權杖,以便驗證使用者。
gcloud run deploy idp-sql \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql \ --allow-unauthenticated \ --service-account idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --add-cloudsql-instances PROJECT_ID:REGION:CLOUD_SQL_INSTANCE_NAME \ --update-secrets CLOUD_SQL_CREDENTIALS_SECRET=idp-sql-secrets:latest
請注意,旗標
--service-account
、--add-cloudsql-instances
和--update-secrets
分別指定服務身分、Cloud SQL 執行個體連線,以及機密金鑰名稱和版本 (做為環境變數)。
最後修飾
Identity Platform 要求您在使用者登入後,將 Cloud Run 服務網址授權為允許的重新導向網址:
按一下「識別資訊提供者」頁面中的筆圖示,即可編輯 Google 供應商。
按一下右側面板「已授權的網域」下方的「新增網域」,然後輸入 Cloud Run 服務網址。
您可以在建構或部署作業後,在記錄中找到服務網址,也可以隨時使用以下方式找出服務網址:
gcloud run services describe idp-sql --format 'value(status.url)'
-
按一下 OAuth 用戶端 ID 旁的鉛筆圖示,即可編輯該 ID 和
Authorized redirect URIs click the
下方的「新增 URI」按鈕。在欄位中複製並貼上以下網址,然後點選頁面底部的「儲存」按鈕。
https://PROJECT_ID.firebaseapp.com/__/auth/handler
立即體驗
如要試用完整的服務,請按照下列步驟操作:
在瀏覽器中前往上方部署步驟提供的網址。
按一下「使用 Google 帳戶登入」按鈕,然後完成驗證流程。
快來投票吧!
內容應如下所示:
如果您選擇繼續開發這些服務,請注意,這些服務的 Identity and Access Management (IAM) 存取權僅限於 Google Cloud ,因此需要額外的 IAM 角色才能存取許多其他服務。
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,且希望保留該專案而不採用本教學課程中的變更,請刪除為教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除教學課程資源
刪除您在本教學課程中部署的 Cloud Run 服務:
gcloud run services delete SERVICE-NAME
其中 SERVICE-NAME 是您選擇的服務名稱。
您也可以從 Google Cloud 控制台刪除 Cloud Run 服務。
移除您在教學課程設定期間新增的 gcloud 預設區域設定:
gcloud config unset run/region
移除專案設定:
gcloud config unset project
刪除本教學課程中建立的其他 Google Cloud 資源:
後續步驟
- 深入瞭解如何從 Cloud Run 連線至 Cloud SQL
- 進一步瞭解使用 Identity Platform 的登入方式和管理使用者
- 查看部署至 Cloud Run 的服務驗證開發人員、服務和使用者的其他方法
- 探索其他 Cloud Run 示範、教學課程和範例