作为最终用户进行身份验证

在大多数情况下,我们建议您使用服务帐户向 Google Cloud Platform (GCP) API 进行身份验证。在某些情况下,您可能需要让用户直接进行身份验证。例如:

  • 您需要代表应用的最终用户访问资源。例如,您的应用需要访问属于应用用户的 Google BigQuery 数据集。

  • 您需要以用户身份而不是作为您的应用进行身份验证。例如,由于 Cloud Resource Manager API 可以创建并管理特定用户拥有的项目,您需要以用户身份进行身份验证,以代表他们创建项目。

本指南讨论最终用户凭据,并非讨论向您的应用验证用户身份。对于后者那种用例,我们建议使用 Firebase 身份验证

身份验证流程

当应用需要代表用户访问资源时,应用会向用户呈现同意屏幕。用户接受后,应用请求来自授权服务器的凭据。有了凭据,应用就可以代表用户访问资源了。

此过程就是一个名为 OAuth 2.0 的协议。

OAuth 2.0 流程
您的应用
用户表示同意
用户数据

如需详细了解 OAuth 2.0,请参阅 OAuth 2.0

指定 API 范围

当您使用服务帐户向 GCP API 进行身份验证时,GCP 会自动向具有 API 完全访问权限的服务帐户进行身份验证。作为最终用户进行身份验证时,您必须手动指定 OAuth 范围。OAuth 范围限制应用可以代表最终用户执行的操作。举例来说,这些操作可能包括从 Cloud Storage 中读取文件或管理 GCP 项目。

如需详细了解可以使用哪些 OAuth 范围,请参阅具体的 API 页面。举例来说,如果您计划对 Compute Engine API 使用 disks.get() 方法,则需要设置其中一个 OAuth 范围。根据您的用例设置所需的最小范围。

授予和限制项目资源访问权限

如果您使用最终用户凭据访问项目中的资源,则必须授予用户对项目资源的访问权限。在 GCP 中执行此操作的方法是在 Google Cloud Identity and Access Management (Cloud IAM) 中设置角色。

您可能希望限制用户有权访问哪些资源。当您允许用户访问您拥有的项目中的资源时尤其如此。根据用户需要的最小权限设置角色。

每个服务都有一组 Cloud IAM 角色,同时,您也可以选择创建自定义角色。如需了解详情,请参阅了解角色以及创建和管理自定义角色

最终用户身份验证示例

完成以下部分以为最终用户获取凭据。以下步骤使用 BigQuery API,但您可以使用任何具有客户端库的 GCP API 重复此过程。

设置项目

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

  3. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

  4. 启用BigQuery API。

    启用 API

  5. 安装 BigQuery 客户端库
  6. 如果使用 Python 或 Node.js,则必须安装其他 auth 库。

    Python

    安装用于 Google 身份验证的 oauthlib 集成

    pip install --upgrade google-auth-oauthlib

创建客户端凭据

在 Google Cloud Platform Console 中创建您的客户端凭据。

  1. 转到 GCP Console 中的 OAuth 同意屏幕页面。

  2. 凭据页面上,选择创建凭据按钮,然后选择 OAuth 客户端 ID

  3. 选择其他,然后选择创建按钮。成功对话框出现后,选择确定按钮。

  4. 通过选择客户端 ID 的下载 JSON 按钮下载凭据。

    下载 JSON 按钮

  5. 将凭据文件保存到 client_secrets.json。此文件必须随应用一起分发。

API 的身份验证与调用

  1. 使用客户端凭据执行 OAuth 2.0 流程

    Python

    from google_auth_oauthlib import flow
    
    # TODO: Uncomment the line below to set the `launch_browser` variable.
    # launch_browser = True
    #
    # The `launch_browser` boolean variable indicates if a local server is used
    # as the callback URL in the auth flow. A value of `True` is recommended,
    # but a local server does not work if accessing the application remotely,
    # such as over SSH or from a remote Jupyter notebook.
    
    appflow = flow.InstalledAppFlow.from_client_secrets_file(
        'client_secrets.json',
        scopes=['https://www.googleapis.com/auth/bigquery'])
    
    if launch_browser:
        appflow.run_local_server()
    else:
        appflow.run_console()
    
    credentials = appflow.credentials

  2. 使用经过身份验证的凭据连接到 BigQuery API。

    Python

    from google.cloud import bigquery
    
    # TODO: Uncomment the line below to set the `project` variable.
    # project = 'user-project-id'
    #
    # The `project` variable defines the project to be billed for query
    # processing. The user must have the bigquery.jobs.create permission on
    # this project to run a query. See:
    # https://cloud.google.com/bigquery/docs/access-control#permissions
    
    client = bigquery.Client(project=project, credentials=credentials)
    
    query_string = """SELECT name, SUM(number) as total
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE name = 'William'
    GROUP BY name;
    """
    query_job = client.query(query_string)
    
    # Print the results.
    for row in query_job.result():  # Wait for the job to complete.
        print("{}: {}".format(row['name'], row['total']))

运行示例代码时,代码会启动一个浏览器,请求访问与客户端密钥关联的项目。随后,您可以使用所得到的凭据来访问用户的 BigQuery 资源,因为示例请求 BigQuery 范围

在不同的用例中,您可能希望添加 IAM 角色以确定用户可以访问的内容。

后续事项

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
身份验证