本教程介绍如何创建投票服务,其中包括:
基于浏览器的客户端,该客户端具有以下功能:
- 使用 Identity Platform 提取 ID 令牌。
- 允许用户为自己喜欢的家养动物投票。
- 将该 ID 令牌添加到向处理投票的 Cloud Run 服务器发出的请求中。
Cloud Run 服务器,该服务器具有以下功能:
- 通过提供有效的 ID 令牌进行检查以确保最终用户已正确进行身份验证。
- 处理最终用户的投票。
- 使用其自己的凭据,将投票发送到 Cloud SQL 进行存储。
存储投票的 PostgresSQL 数据库。
为简单起见,本教程使用 Google 作为提供商:用户必须使用 Google 账号进行身份验证才能获取其 ID 令牌。但是,您可以使用其他提供商或身份验证方法来登录用户。
为了将安全风险降至最低,此服务使用 Secret Manager 来保护用于关联到 Cloud SQL 实例的敏感数据。它还使用最小权限服务身份来保护对数据库的访问权限。
目标
编写、构建服务并将其部署到 Cloud Run,该服务展示如何:
使用 Identity Platform 向 Cloud Run 服务后端对最终用户进行身份验证。
为服务创建最小权限身份,以授予对 Google Cloud 资源的最低访问权限。
将 Cloud Run 服务连接到 PostgreSQL 数据库时,使用 Secret Manager 处理敏感数据。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Run, Secret Manager, Cloud SQL, Artifact Registry, and Cloud Build APIs.
所需的角色
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Artifact Registry Repository Administrator (
roles/artifactregistry.repoAdmin
) -
Cloud Build Editor (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Cloud SQL Admin (
roles/cloudsql.admin
) -
Create Service Accounts (
roles/iam.serviceAccountCreator
) -
Identity Platform Admin (
roles/identityplatform.admin
) -
OAuth Config Editor (
roles/oauthconfig.editor
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Secret Manager Admin (
roles/secretmanager.admin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
) -
Storage Admin (
roles/storage.admin
)
如需详细了解如何授予角色,请参阅管理访问权限。
设置 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
(大阪)europe-north1
(芬兰) 二氧化碳排放量低europe-southwest1
(马德里) 二氧化碳排放量低europe-west1
(比利时) 二氧化碳排放量低europe-west4
(荷兰) 二氧化碳排放量低europe-west8
(米兰)europe-west9
(巴黎) 二氧化碳排放量低me-west1
(特拉维夫)us-central1
(爱荷华) 二氧化碳排放量低us-east1
(南卡罗来纳)us-east4
(北弗吉尼亚)us-east5
(哥伦布)us-south1
(达拉斯) 二氧化碳排放量低us-west1
(俄勒冈) 二氧化碳排放量低
基于层级 2 价格
africa-south1
(约翰内斯堡)asia-east2
(香港)asia-northeast3
(韩国首尔)asia-southeast1
(新加坡)asia-southeast2
(雅加达)asia-south1
(印度孟买)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
服务器按照以下格式连接到 Cloud SQL 实例 Unix 网域套接字:/cloudsql/CLOUD_SQL_CONNECTION_NAME
。
Node.js
Python
Java
借助 Spring Cloud Google Cloud PostgreSQL 入门版集成,通过 Spring JDBC 库与 Cloud SQL 中的 PostgreSQL 数据库进行交互。将您的 Cloud SQL for MySQL 配置设置为自动配置DataSource
bean;该 bean 与 Spring JDBC 一起提供 JdbcTemplate
对象 bean 以允许查询和修改数据库等操作。
使用 Secret Manager 处理敏感配置
Secret Manager 为敏感数据提供集中安全存储,例如 Cloud SQL 配置。服务器在运行时通过环境变量从 Secret Manager 注入 Cloud SQL 凭据。详细了解如何将 Secret与 Cloud Run 搭配使用。
Node.js
Python
Java
设置 Identity Platform
您需要在 Google Cloud 控制台中手动设置 Identity Platform。
转到 Google Cloud 控制台中的 Identity Platform Marketplace 页面。
点击启用 Identity Platform。
创建 OAuth 权限请求页面:
在新窗口中,转到“API 和服务 > 凭据”页面
依次转到 API 和服务 > 凭据页面。
选择 OAuth 权限请求屏幕页面。
出于测试目的,请选择外部。
点击创建。
在应用信息对话框中,
- 提供应用名称。
- 选择显示的用户支持电子邮件地址之一。
- 输入您要用于联系开发者的电子邮件地址。
点击保存并继续。
在范围对话框中,点击保存并继续。
在测试用户对话框中,点击保存并继续。
在摘要对话框中,点击返回信息中心。
在发布状态下,点击发布应用。
点击确认
创建并获取 OAuth 客户端 ID 和 Secret:
依次转到 API 和服务 > 凭据页面。
点击页面顶部的创建凭据,然后选择
OAuth client ID
。从应用类型中,选择 Web 应用并提供名称。
点击创建
记下
client_id
和client_secret
,以便稍后在此过程中使用。
将 Google 配置为提供商:
转到 Cloud 控制台中的“身份提供商”页面。
点击添加提供商。
从列表中选择 Google。
在 Web SDK 配置设置中,输入上述步骤中的
client_id
和client_secret
值。在配置您的应用下,点击设置详细信息。
将
apiKey
和authDomain
值复制到示例的static/config.js
中,以初始化 Identity Platform 客户端 SDK。点击保存。
部署服务
请按照以下步骤完成基础架构预配和部署,或者通过点击“在 Google Cloud 上运行”,在 Cloud Shell 中自动执行此过程:
使用控制台或 CLI 创建使用 postgreSQL 数据库的 Cloud SQL 实例:
gcloud sql instances create CLOUD_SQL_INSTANCE_NAME \ --database-version=POSTGRES_12 \ --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 授予角色:
允许与服务器关联的服务账号访问创建的 Secret:
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 利用常见 Java 工具构建 Docker 映像。无需编写 Dockerfile 或安装 Docker,Jib 便可以优化容器构建。详细了解如何使用 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)'
依次转到 API 和服务 > 凭据页面。
点击 OAuth 客户端 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 演示、教程和示例