如何在不使用 Gcloud 命令行的情况下获取 Google OAUTH 令牌

How to get Google OAUTH Token without using Gcloud Command Line

我目前正在使用以下代码获取 OAUTH 令牌

command = 'gcloud auth print-access-token'
result = str(subprocess.Popen(command, universal_newlines=True, shell=True, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE).communicate())

结果变量具有 OAUTH 令牌。此技术使用我当前登录的 gcloud 配置。

但是,我正在寻找一种无需使用命令行即​​可获取 OAUTH 令牌的方法。 我正在使用此 OAUTH 令牌进行 CDAP 调用以获取 Google 数据流管道执行详细信息。

我查看了一些 google 博客。这是我认为应该尝试的方法,但它要求创建同意屏幕,并且需要一次 activity 来同意定义的范围,然后它应该可以工作。 Google Document

我是否应该按照上述文档中的步骤进行检查,或者是否有任何其他方法可以获得 OAUTH 令牌? 有没有办法通过服务帐户而不是 google 用户帐户完成身份验证并获取 OAUTH 令牌?

对于自动化过程,服务帐户是推荐的方式。您可以为此使用 google-oauth library。您可以像这样生成访问令牌

    # With default credential (your user account or the Google Cloud Component service account. 
    # Or with the service account key file defined in the GOOGLE_APPLICATION_CREDENTIALS env var -> for platform outside GCP)
    credentials, project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
    # With service account key file (not recommended)
    # credentials = service_account.Credentials.from_service_account_file('service-account.json',
    #    scopes=["https://www.googleapis.com/auth/cloud-platform"])
    from google.auth.transport import requests
    credentials.refresh(requests.Request())
    print(credentials.token)

但是,如果你想调用Google云API,我建议你使用授权请求对象

这里是一个 BigQuery 调用的例子。您可以像我之前的示例一样使用服务帐户密钥文件生成您的凭据。

    base_url = 'https://bigquery.googleapis.com'

    credentials, project_id = google.auth.default(scopes=['https://www.googleapis.com/auth/cloud-platform'])
    project_id = 'MyProjectId'
    authed_session = AuthorizedSession(credentials)
    response = authed_session.request('GET', f'{base_url}/bigquery/v2/projects/{project_id}/jobs')
    print(response.json())

编辑

当您想使用 Google API 时,您的计算机和 GCP 组件上不需要服务帐户密钥文件(我建议您不要使用它)。应用程序默认凭据总是足够的。

  • 当您在本地环境中时,您必须运行 命令gcloud auth application-default login。使用此命令,当您 运行 在本地您的应用程序时,您将注册您的个人帐户作为默认凭据。 (当然,您需要在您调用的组件上授权您的用户帐户电子邮件)
  • 当您在 GCP 环境中时,每个组件都有一个默认服务帐户(或者您可以在配置组件时指定一个)。由于组件“身份”,您可以使用默认凭证。 (当然,您需要在您调用的组件上授权服务帐户电子邮件)

当您 运行 一个应用程序在 GCP 之外自动运行时,您需要一个服务帐户密钥文件(例如,在您的 CI/CD 其他云构建,或部署在其他云提供商或本地的应用程序中)

为什么不推荐服务帐户密钥文件?至少我是推荐的,因为这个文件是.....一个文件!!那就是问题所在。你有办法在一个简单的文件中验证服务帐户:你必须安全地存储它(这是一个秘密和一种验证方法!!),你可以复制它,你可以通过电子邮件发送它,你甚至可以提交它public GIT 存储库...此外,Google 建议每 90 天轮换一次,因此轮换、跟踪和管理是一场噩梦