对最终用户进行身份验证

如果您的应用处理来自最终用户的请求,则最佳做法是只让允许的最终用户进行访问。为此,您可以选择以下方式之一:

在以上任一方式中,您都需要一个公共 Web 应用或移动应用来处理登录流程,然后对 Cloud Run 服务发出经过身份验证的 API 调用。此公共 Web 应用本身可以托管在公共 Cloud Run 服务上。如果您使用的是 Google 登录,此公共 Web 应用必须与需要身份验证的 Cloud Run 服务位于同一网域。

使用 Identity Platform 或 Firebase 身份验证

如果要使用电子邮件/密码、电话号码、社交提供方(如 Facebook 或 GitHub)或自定义身份验证机制对用户进行身份验证,您可以使用 Firebase 身份验证Identity Platform。 如需了解使用 Identity Platform 进行最终用户身份验证的完整教程,请参阅 Cloud Run 最终用户身份验证教程。

使用 Firebase 身份验证类似于使用 Identity Platform。

  1. 在您的项目和服务中设置 Firebase 身份验证:

    1. 在 Firebase 控制台中设置 Firebase 身份验证。

      转到 Firebase 控制台

    2. 导入相应的 Firebase Admin SDK 并对其进行正确配置。

    3. 在代码中添加中间件,以验证 Firebase ID 令牌

    4. 以公开方式部署您的服务

  2. 在 Web 应用或移动应用中执行以下操作:

    1. 使用适当的 Firebase Auth 客户端库来获取 ID 令牌:
    2. 将该 ID 令牌添加到服务请求的 Authorization: Bearer ID_TOKEN 标头中。

对于使用此身份验证技术的应用的端到端演示,请遵循教程:Cloud Run 最终用户身份验证

获取用户个人资料信息

如果您想要访问用户个人资料信息,可以使用 Firebase Admin SDK 检索用户数据

使用 Google 登录

在项目中启用 Google 登录:

  1. 在要保护的服务所属的项目中,为您的应用创建一个 OAuth 2.0 客户端 ID:
    1. 转到凭据页面。

      转到“凭据”页面

    2. 选择要保护的服务所属的项目。
    3. 点击创建凭据,然后选择 OAuth 客户端 ID
      1. 在创建客户端 ID 之前,您可能需要配置 OAuth 同意屏幕。在必要的情况下,必须完成此操作方可继续进行。
    4. 选择要为其创建凭据的应用类型
    5. 添加名称限制(如果适用),然后点击创建
  2. 重新部署要保护的服务。这样做可确保在服务上设置正确的客户端 ID。

    如果您有多个 OAuth 客户端 ID(例如 Android、iOS 和 Web 应用各一个),则必须在添加每个 ID 后重新部署您的服务,以确保该服务获取相应更改。同样,如果您删除了客户端 ID,也必须重新部署您的服务,以移除该客户端 ID 并拒绝请求。系统将接受项目中的所有客户端 ID。

在 Web 应用或移动应用中执行以下操作:

  1. 为该 OAuth 客户端 ID 获取一个 ID 令牌:
  2. 将该 ID 令牌添加到服务请求的 Authorization: Bearer ID_TOKEN 标头中。

Cloud Run 会在服务启动前对此身份验证令牌进行验证,然后允许或拒绝请求。如果请求被拒绝,则您无需为该请求支付费用。

Web 应用、身份验证和 CORS

构建 Web 应用时,您必须解决跨域资源共享 (CORS) 问题。例如,CORS 预检请求是在没有 Authorization 标头的情况下发送的,因此非公开服务会拒绝这些请求。由于预检请求失败,因此主请求也将失败。

为解决此问题,您可以在同一网域上托管您的 Web 应用和服务,以避免 CORS 预检请求。您可以使用 Firebase 托管实现该目的。

获取用户个人资料信息

如果您想访问用户个人资料信息,则可以从 Authorization 标头中拉取令牌,并向 Validate Token 端点发出请求。

系统会返回 ID 令牌的正文,其中包含以下信息:

{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile"
 // and "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

问题排查

如果用户请求被拒绝,而您认为应该允许这些请求,请确保用户已被授予 roles/run.invoker 角色或拥有 run.routes.invoke 权限。如需详细了解这些内容,请参阅 Cloud Run IAM 参考文档

后续步骤

如需了解使用 Identity Platform 进行最终用户身份验证的完整教程,请参阅 Cloud Run 最终用户身份验证教程。