arrow_back

用户身份验证:Identity-Aware Proxy

登录 加入
Quick tip: Review the prerequisites before you run the lab
Use an Incognito or private browser window to run this lab. This prevents any conflicts between your personal account and the student account, which may cause extra charges incurred to your personal account.
欢迎加入我们的社区,一起测试和分享您的知识!
done
学习 700 多个动手实验和课程并获得相关技能徽章

用户身份验证:Identity-Aware Proxy

实验 1 小时 universal_currency_alt 1 个积分 show_chart 入门级
info 此实验可能会提供 AI 工具来支持您学习。
欢迎加入我们的社区,一起测试和分享您的知识!
done
学习 700 多个动手实验和课程并获得相关技能徽章

GSP499

概览

在本实验中,您将使用 Google App Engine 构建一个很小的 Web 应用,然后探索使用 Identity-Aware Proxy (IAP) 来限制对该应用的访问权限,以及向该应用提供用户身份信息的各种方法。您的应用将:

  • 显示欢迎页面
  • 访问 IAP 提供的用户身份信息
  • 使用加密验证来防范冒用用户身份信息的行为

学习内容

  • 如何使用 Python 编写和部署简单的 App Engine 应用
  • 如何启用和停用 IAP 以限制对应用的访问权限
  • 如何将 IAP 中的用户身份信息传递给应用
  • 如何以加密方式验证 IAP 中的信息以防仿冒

前提条件

了解 Python 编程语言的基本知识将有助于增强您的学习体验。

本实验主要会用到 Google App Engine 和 IAP。对于不相关的概念,我们仅会略作介绍,但是会提供相应代码块供您复制和粘贴。

Identity-Aware Proxy 简介

对 Web 应用的用户进行身份验证往往很有必要,而这通常需要在应用中进行特殊编程。对于 Google Cloud 应用,您可以将这些任务交给 Identity-Aware Proxy 服务来处理。如果您只需要限制选定用户具有访问权限,则无需对应用进行任何更改。如果应用需要知道用户的身份(例如,为了在服务器端保留用户的偏好),只需编写极少的应用代码,Identity-Aware Proxy 即可提供该功能。

什么是 Identity-Aware Proxy?

Identity-Aware Proxy (IAP) 是一项 Google Cloud 服务,可拦截发送给应用的 Web 请求,使用 Google Identity 服务对发出请求的用户进行身份验证,并仅允许来自已获授权的用户的请求通过。此外,它还可以修改请求标头,在其中包含有关经过身份验证的用户的信息。

设置和要求

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:

    • “打开 Google Cloud 控制台”按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭据
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示“登录”页面。

    提示:将这些标签页安排在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在“实验详细信息”窗格中找到“用户名”。

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在“实验详细信息”窗格中找到“密码”。

  6. 点击下一步

    重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 继续在后续页面中点击以完成相应操作:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell

如果您连接成功,即表示您已通过身份验证,且当前项目会被设为您的 PROJECT_ID 环境变量所指的项目。输出内容中有一行说明了此会话的 PROJECT_ID

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。

  1. (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
  1. 点击授权

  2. 现在,输出的内容应如下所示:

输出:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (可选)您可以通过此命令列出项目 ID:
gcloud config list project

输出

[core] project = <project_ID>

输出示例

[core] project = qwiklabs-gcp-44776a13dea667a6 Note: For full documentation of gcloud, in Google Cloud, refer to the gcloud CLI overview guide.

下载代码

点击 Cloud Shell 中的命令行区域,以便可以输入命令。

从公共存储桶中下载代码,然后切换到包含相应代码的文件夹:

gsutil cp gs://spls/gsp499/user-authentication-with-iap.zip . unzip user-authentication-with-iap.zip cd user-authentication-with-iap

对于本实验中的每个步骤,此文件夹都包含一个相应的子文件夹。您需要切换到正确的文件夹来执行相应的步骤。

任务 1. 部署应用并使用 IAP 对它加以保护

这是一个用 Python 编写的 App Engine 标准应用,只会显示“Hello, World”欢迎页面。我们将对它进行部署和测试,然后使用 IAP 来限制对它的访问权限。

检查应用代码

  • 从项目主文件夹切换到包含此步骤对应代码的 1-HelloWorld 子文件夹。
cd 1-HelloWorld

应用代码在 main.py 文件中。应用使用 Flask Web 框架通过模板的内容来对 Web 请求做出响应。该模板文件位于 templates/index.html。对于此步骤而言,它仅包含纯 HTML。第二个模板文件为 templates/privacy.html,包含示例隐私权政策架构。

另外还有两个文件:requirements.txtapp.yaml,前者列出应用使用的所有非默认 Python 库,后者告诉 Google Cloud 这是一个 Python App Engine 应用。

您可以使用 cat 命令在 shell 中列出每个文件,如下所示:

cat main.py

或者,您也可以通过点击 Cloud Shell 窗口右上角的铅笔图标启动 Cloud Shell 代码编辑器,然后按照上面的方法检查代码。

在这一步您无需更改任何文件。

部署到 App Engine

  1. 将 python 运行时更新为 python39
sed -i 's/python37/python39/g' app.yaml
  1. 将应用部署到适用于 Python 的 App Engine 标准环境。
gcloud app deploy
  1. 选择区域

  2. 当系统询问您是否要继续时,请输入 Y 表示“是”。

注意: 如果您收到与 GAIA 传播有关的错误消息,请重新运行 gcloud app deploy 命令。

几分钟后,部署即会完成。您会看到一条消息,提示您可以使用 gcloud app browse 查看应用。

  1. 输入该命令:
gcloud app browse
  1. 点击显示的链接将其在新标签页中打开,或者将其复制到手动打开的新标签页(如果必要)。由于这是此应用首次运行,因此要在云实例启动后才会显示,此过程需要几秒钟时间。您应该会看到下面的窗口。

从任何连接到互联网的计算机打开该网址都可以看到该网页。访问权限尚未受到限制。

点击检查我的进度以验证是否完成了以下目标: 部署 App Engine 应用

使用 IAP 限制访问权限

  1. 在 Cloud 控制台窗口中,点击导航菜单 > 安全 > Identity-Aware Proxy

  2. 点击启用 API

  3. 点击转到 Identity-Aware Proxy

  4. 点击配置权限请求页面

  5. 在“用户类型”下选择内部,然后点击创建

  6. 在必填空白字段中填写适当的值:

字段

应用名称

IAP 示例

用户支持电子邮件

从下拉菜单中选择您在本实验中使用的学员电子邮件地址。

应用首页

用于查看应用的网址。您可以在 Cloud Shell 中再次运行 gcloud app browse 命令来获得该网址。

应用隐私权政策链接

应用中的隐私权页面链接,由首页链接后跟 /privacy 构成

已获授权的网域

点击 + 添加网域,然后输入应用网址的主机名部分,例如 iap-example-999999.appspot.com。您可以在之前打开的 Hello World 网页的地址栏中看到此信息。请不要输入网址开头的 https:// 和结尾的 /

开发者联系信息

请至少输入一个电子邮件地址

  1. 点击保存并继续

  2. 范围页,点击保存并继续

  3. 摘要页,点击返回信息中心

系统可能会提示您创建凭据。您无需在本实验中创建凭据,因此只需关闭此浏览器标签页即可。

  1. 在 Cloud Shell 中,运行以下命令停用 Flex API:
gcloud services disable appengineflex.googleapis.com 注意: App Engine 具有标准环境和柔性境,并针对不同的应用架构进行了优化。目前,如果启用了 Flex API,Google Cloud 在为 App Engine 启用 IAP 时,将会查找 Flex 服务账号。为方便起见,您的实验项目已事先启用了许多 API,但这造成了一种特殊情况,即在没有创建服务账号的情况下启用了 Flex API。
  1. 返回 Identity-Aware Proxy 页面并刷新。您现在应该会看到可以保护的资源列表。

点击 App Engine 应用行 IAP 列中的切换按钮开启 IAP

  1. 该网域将会受到 IAP 的保护。点击开启

测试 IAP 是否已开启

  1. 打开浏览器标签页并访问您应用的网址。“使用 Google 账号登录”屏幕将会打开,要求您登录以访问该应用。

  2. 使用您用于登录控制台的账号登录。您会看到拒绝您访问的屏幕。

您已成功使用 IAP 保护您的应用,但尚未指示 IAP 允许哪些账号通过。

  1. 返回控制台的 Identity-Aware Proxy 页面,选中 App Engine 应用旁边的复选框,App Engine 边栏随即出现在右侧。

您需要将每个允许访问的电子邮件地址(或者 Google 群组地址或 Workspace 域名)添加为成员。

  1. 点击添加主账号

  2. 输入您的学员电子邮件地址。

  3. 然后选择为该地址分配 Cloud IAP > IAP-Secured Web App User 角色。

您可以通过同样的方式输入更多地址或 Workspace 域名。

  1. 点击保存

窗口底部会显示“政策已更新”消息。

点击检查我的进度以验证是否完成了以下目标: 启用政策并将其添加到 IAP

测试访问权限

返回您的应用并重新加载页面。您现在应该可以看到自己的 Web 应用,因为您已经以授权用户的身份登录。

如果您仍然看到“您没有访问权限”页面,则说明 IAP 未重新检查您的授权。在这种情况下,请执行以下步骤:

  1. 打开网络浏览器,输入首页地址,并在网址末尾添加 /_gcp_iap/clear_login_cookie,例如输入 https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
  2. 您将看到一个新的“使用 Google 账号登录”屏幕,并且您的账号已显示在其中。请勿点击该账号,而应点击“使用其他账号”,然后重新输入您的凭据。
注意: 角色变更需要一段时间才会生效。如果按照上述步骤操作后,页面仍显示“您没有访问权限”消息,请等待一段时间,然后尝试刷新页面。

这会让 IAP 重新检查您的访问权限,您现在应该能看到应用的首页。

如果您可以使用其他浏览器,或可以在浏览器中使用无痕模式,并且有另一个有效的 Gmail 或 Workspace 账号,则可以使用该浏览器访问您的应用页面,然后使用其他账号登录。由于该账号尚未获得授权,因此浏览器会显示“您没有访问权限”页面,而不是您的应用。

任务 2. 访问用户身份信息

一旦应用受到 IAP 保护,它就可以使用 IAP 在所传递的 Web 请求标头中提供的身份信息。在此步骤中,该应用将获取已登录用户的电子邮件地址,以及 Google Identity 服务分配给该用户的永久性唯一身份用户 ID。该数据将在欢迎页面中显示给用户。

  • 在 Cloud Shell 中,切换到此步骤所对应的文件夹:
cd ~/user-authentication-with-iap/2-HelloUser

部署到 App Engine

  1. 将 python 运行时更新为 python39
sed -i 's/python37/python39/g' app.yaml
  1. 由于部署需要几分钟的时间,因此首先将应用部署到适用于 Python 的 App Engine 标准环境:
gcloud app deploy
  1. 当系统询问您是否要继续时,请输入 Y 表示“是”。

部署应该会在几分钟后完成。等待期间,您可以按照如下所述检查应用文件。

点击检查我的进度以验证是否完成了以下目标: 访问用户身份信息

检查应用文件

此文件夹包含的文件集与您部署的上一个应用 1-HelloWorld 相同,但有两个文件发生了改变:main.pytemplates/index.html。程序已改为检索 IAP 在请求标头中提供的用户信息,并且模板现在会显示这些数据。

main.py 中有两行代码用于获取 IAP 提供的身份数据:

user_email = request.headers.get('X-Goog-Authenticated-User-Email') user_id = request.headers.get('X-Goog-Authenticated-User-ID')

X-Goog-Authenticated-User- 标头由 IAP 提供,并且名称不区分大小写,因此,如果您愿意,可以将它们全部小写或全部大写。render_template 语句现在包含这些值,因此应用可以显示这些信息:

page = render_template('index.html', email=user_email, id=user_id)

index.html 模板可以通过将名称括在双花括号中来显示这些值:

Hello, {{ email }}! Your persistent ID is {{ id }}.

如您所见,提供的数据带有 accounts.google.com 前缀,用于指出信息来源。如果需要,您的应用可以移除冒号前的所有内容(包括冒号)以获取原始值。

测试更新后的 IAP

说回部署,一切就绪后,您会看到一条消息,提示您可以使用 gcloud app browse 查看应用。

  1. 输入该命令:
gcloud app browse
  1. 如果浏览器中没有打开新标签页,请复制所显示的链接,按常规的方法在新标签页中将其打开。您应该会看到如下所示的页面:

新版应用替换之前的版本可能需要几分钟的时间,请耐心等候。如果需要,请刷新页面,直到看到与上图类似的页面。

关闭 IAP

如果 IAP 被停用或以某种方式被绕过(例如,被同一个云项目中运行的其他应用绕过),此应用会发生什么情况?我们关闭 IAP 来看看。

  1. 在 Cloud 控制台窗口中,点击导航菜单 > 安全 > Identity-Aware Proxy
  2. 点击 App Engine 应用旁边的 IAP 切换开关关闭 IAP。点击关闭

系统会显示警告,指出这样会允许所有用户访问该应用。

  1. 刷新应用网页。您应该会看到相同的页面,但没有任何用户信息:

由于应用现在不受保护,用户可以发送似乎已通过 IAP 检查的 Web 请求。例如,您可以在 Cloud Shell 中运行以下 curl 命令来执行此操作(将 <your-url-here> 替换为应用的确切网址):

curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"

网页将显示在命令行上,如下所示:

<!doctype html> <html> <head> <title>IAP Hello User</title> </head> <body> <h1>Hello World</h1> <p> Hello, totally fake email! Your persistent ID is None. </p> <p> This is step 2 of the User Authentication with IAP</em> codelab. </p> </body> </html>

应用无法知道 IAP 已被停用或绕过。对于存在潜在风险的情况,加密验证给出了解决方案。

任务 3. 使用加密验证

如果存在 IAP 被关闭或绕过的风险,应用可以检查并确保收到的身份信息有效。这需要用到 IAP 添加的第三个 Web 请求标头,即 X-Goog-IAP-JWT-Assertion。标头的值是一个以加密方式签名的对象,其中还包含用户身份数据。您的应用可以验证数字签名,并使用此对象中提供的数据来确定签名由 IAP 提供且未经篡改。

数字签名验证流程需要执行几个额外的步骤,例如检索最新的一组 Google 公钥。您可以根据有人可能能够关闭或绕过 IAP 的风险以及应用的敏感性,来决定您的应用是否需要这些额外的步骤。

  • 在 Cloud Shell 中,切换到此步骤所对应的文件夹:
cd ~/user-authentication-with-iap/3-HelloVerifiedUser

部署到 App Engine

  1. 将 python 运行时更新为 python39
sed -i 's/python37/python39/g' app.yaml
  1. 将应用部署到适用于 Python 的 App Engine 标准环境:
gcloud app deploy
  1. 当系统询问您是否要继续时,请输入 Y 表示“是”。

部署应该会在几分钟后完成。等待期间,您可以按照如下所述检查应用文件。

点击检查我的进度以验证是否完成了以下目标: 使用加密验证

检查应用文件

此文件夹包含的文件集与 2-HelloUser 相同,但有两个文件发生了改变,并增加了一个新文件。新文件是 auth.py,其中提供了 user() 方法来检索并验证以加密方式签名的身份信息。发生改变的文件是 main.pytemplates/index.html,它们现在会使用该方法的结果。另外,还显示了上次部署中发现的未经验证的标头以供比较。

  • 新功能主要在 user() 函数中:
def user(): assertion = request.headers.get('X-Goog-IAP-JWT-Assertion') if assertion is None: return None, None info = jwt.decode( assertion, keys(), algorithms=['ES256'], audience=audience() ) return info['email'], info['sub']

assertion 是指定的请求标头中提供的以加密方式签名的数据。代码使用一个库来验证和解码这些数据。验证功能使用 Google 提供的公钥来检查所签名的数据,并了解数据是为哪个受众群体准备的(本质上是受保护的 Google Cloud 项目)。辅助函数 keys()audience() 会收集并返回这些值。

已签名对象包含我们需要的两部分数据:经过验证的电子邮件地址和唯一 ID 值(在 sub [表示订阅方] 标准字段中提供)。

第 3 步到这里就完成了。

测试加密验证

部署就绪后,您会看到一条消息,提示您可以使用 gcloud app browse 查看应用。

  • 输入该命令:
gcloud app browse

如果浏览器中没有打开新标签页,请复制所显示的链接,按常规的方法在新标签页中将其打开。

提醒一下,您之前停用了 IAP,因此应用不会提供 IAP 数据。您应该会看到如下所示的页面:

与之前一样,您可能需要等待几分钟,直到最新版本生效后才能看到页面的新版本。

由于 IAP 已停用,因此未提供用户信息。现在重新开启 IAP。

  1. 在 Cloud 控制台窗口中,点击导航菜单 > 安全 > Identity-Aware Proxy

  2. 点击 App Engine 应用旁边的 IAP 切换开关再次开启 IAP。点击开启

  3. 刷新页面。页面应如下所示:

请注意,验证方法所提供的电子邮件地址没有 accounts.google.com: 前缀。

如果 IAP 被关闭或绕过,则已验证数据将会缺失或无效,因为该数据不可能具有有效的签名,除非它是由 Google 私钥持有者创建的。

恭喜!

您部署了一个 App Engine Web 应用。首先,您限制只有所选用户具有应用的访问权限。然后,您检索并显示了 IAP 允许访问应用的用户身份,并了解了如果 IAP 被停用或绕过,这些信息可能会如何被仿冒。最后,您验证了以加密方式签名的用户身份断言,这些断言是无法仿冒的。

后续步骤/了解详情

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

上次更新手册的时间:2024 年 4 月 15 日

上次测试实验的时间:2024 年 2 月 28 日

版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

Before you begin

  1. Labs create a Google Cloud project and resources for a fixed time
  2. Labs have a time limit and no pause feature. If you end the lab, you'll have to restart from the beginning.
  3. On the top left of your screen, click Start lab to begin

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

One lab at a time

Confirm to end all existing labs and start this one

Use private browsing to run the lab

Use an Incognito or private browser window to run this lab. This prevents any conflicts between your personal account and the Student account, which may cause extra charges incurred to your personal account.