以最终用户身份进行身份验证

本主题介绍了如何代表最终用户访问 Google Cloud API。 如需了解有关向 Google Cloud API 进行身份验证的一般信息,请参阅身份验证概览

身份验证流程

如果某一应用需要代表最终用户访问 Google Cloud API,则该应用会启动 OAuth 同意流程。用户完成此流程后,您的应用将会收到用户的凭据。有了这些凭据,您的应用就可以代表用户调用 Google Cloud API 了。

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

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

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

指定 OAuth 范围

以最终用户身份进行身份验证时,您必须明确指定 OAuth 范围。 OAuth 范围限制了应用可以代表最终用户执行的操作。例如,这些操作可能包括从 Cloud Storage 读取文件或管理 Google Cloud 项目。

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

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

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

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

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

最终用户身份验证示例

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

设置项目

  1. 登录您的 Google 帐号。

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

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 启用 BigQuery API。

    启用 API

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

    Python

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

    pip install --upgrade google-auth-oauthlib

创建客户端凭据

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

  1. 转到 Cloud 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 角色以确定用户可以访问的内容。

后续步骤