对向 Compute Engine 发出的请求进行授权

如果您使用 Compute Engine API 管理自己的 Compute Engine 资源,则可以通过从 Compute Engine 服务帐号中获取凭据以向 API 验证您的应用。通过服务帐号,您的应用可以向 API 进行身份验证,而无需在应用代码中嵌入任何密钥。

对于您的应用必须向对 API 发出的请求授权的大多数情况,我们建议您使用服务帐号。但是,如果您正在构建开发或管理工具(在这种情况下,用户会向您授予其 Google Cloud 资源的访问权限),请改用用户授权流程

如需从服务帐号获取凭据,请使用 Compute Engine 客户端库应用默认凭据。您的应用可以借助这些软件包从多项可用资源中的一项资源获取凭据,具体使用的资源取决于应用运行的位置。

在 Compute Engine 实例上运行的应用

如果您在 Compute Engine 实例上运行应用,应用默认凭据会通过内置的服务帐号获取凭据。如需了解如何使用这些内置服务帐号配置实例,并在 Compute Engine 实例上运行应用,请参阅直接使用访问令牌对应用进行身份验证

在 Google Cloud 以外运行的应用

如果您在 Google Cloud 之外的系统上运行应用,那么您的应用可以使用应用默认凭据从这些系统的环境变量中获取凭据。如需了解如何使用必要凭据配置环境变量,请参阅以服务帐号身份进行身份验证

正在开发的应用

在本地开发应用时,您可以使用 gcloud auth application-default login 命令临时获取应用的用户凭据。如果您在开发通常使用服务帐号的代码,但您需要在本地开发环境中运行代码,则此命令有助于提供用户凭据。此类凭据将应用于所有利用应用默认凭据客户端库的 API 调用。

  1. 在您的开发系统上安装 gcloud CLI

  2. 使用 gcloud auth application-default login 命令向该工具提供您的凭据

应用会从该工具获取凭据。稍后,您可以将自己的应用部署至 Compute Engine 实例(在这些实例中,应用会自动从内置服务帐号获取凭据),或者在环境变量中指定凭据的其他系统。

示例:使用应用默认凭据进行身份验证

此示例使用 Python 客户端库进行身份验证,并向 Cloud Storage API 发出请求以列出项目中的存储桶。该示例采用以下过程:

  1. 获取 Cloud Storage API 所需的必要身份验证凭据,并使用 build() 方法和凭据初始化 Cloud Storage 服务。
  2. 列出 Cloud Storage 中的存储分区。

您可以在有权管理 Cloud Storage 中的存储桶的实例上运行此示例,也可以在运行 gcloud beta auth application-default login 命令后或者设置使用应用默认凭据的环境变量后在本地机器上运行此示例。


import argparse

import googleapiclient.discovery

def create_service():
    # Construct the service object for interacting with the Cloud Storage API -
    # the 'storage' service, at version 'v1'.
    # Authentication is provided by application default credentials.
    # When running locally, these are available after running
    # `gcloud auth application-default login`. When running on Compute
    # Engine, these are available from the environment.
    return googleapiclient.discovery.build('storage', 'v1')

def list_buckets(service, project_id):
    buckets = service.buckets().list(project=project_id).execute()
    return buckets

def main(project_id):
    service = create_service()
    buckets = list_buckets(service, project_id)
    print(buckets)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('project_id', help='Your Google Cloud Project ID.')

    args = parser.parse_args()

    main(args.project_id)

获取由应用的用户所拥有的 Google Cloud 资源的访问权限

如果您正在构建的开发或管理工具(在这种情况下,用户会向您授予其 Google Cloud 资源的访问权限),请通过基本的 OAuth 2.0 流程获取授权。在此过程中,需要您的用户通过用户授权流程向您授予其信息的访问权限。 您的应用获得访问权限后,可以查看或修改各用户的项目中的 Compute Engine 资源。

在您的请求中,请指定一个访问范围加以限制,使您只能访问您的应用需要的方法和用户信息。例如,当您的应用查看现有的 Compute Engine 资源,但不为用户创建或修改任何资源时,请指定 compute.readonly 范围。

Compute Engine 提供以下范围:

范围 含义
https://www.googleapis.com/auth/compute 对 Compute Engine 方法的读写权限。
https://www.googleapis.com/auth/compute.readonly 对 Compute Engine 方法的只读权限。
https://www.googleapis.com/auth/cloud-platform 查看和管理指定 Google Cloud 项目中大多数 Google Cloud 服务的数据。

如需查看 Google Cloud 中服务及所需范围的完整列表,请参阅 Google API 的 OAuth 2.0 范围