Python:如何使用特定用户而不是 get_application_default() 创建 GoogleCredentials

bro*_*key 1 python gcloud gcloud-python google-cloud-python

我正在更新脚本以调用受 OAuth2 保护的 Google Cloud 端点。以前的版本假设一个用户以前通过身份验证gcloud auth login,因此能够使用默认值:

credentials = GoogleCredentials.get_application_default()
http = credentials.authorize(http)
Run Code Online (Sandbox Code Playgroud)

但是现在我必须以用户 A 和用户 B 的身份执行一些调用。我可以在 shell 中执行这些步骤来生成访问令牌,但我更愿意直接在程序中执行此操作:

gcloud auth login user_A@email.com
gcloud auth print-access-token user_A@email.com
Run Code Online (Sandbox Code Playgroud)

有没有办法Credentials为两封不同的电子邮件生成两个值而无需运行任何 shell 命令?

小智 5

我的案例有点不同,但希望您能找到适合您的用例的等效案例。我正在使用服务帐户进行身份验证。

成功认证需要 3 件事

  1. 服务帐户文件。这是创建服务帐户后获得的 JSON 文件

  2. 范围。这指定您需要访问哪个 Google API。就我而言,我需要访问 Google Groups API。因此我需要的范围是:“ https://www.googleapis.com/auth/admin.directory.group

您可以在这里找到所有范围的列表:https://developers.google.com/identity/protocols/googlescopes

  1. 所需用户的电子邮件地址。这是您的服务帐户想要模拟的用户的电子邮件地址 (user_A@email.com)。就我而言,我需要 G Suite 管理员的电子邮件,因为他们只能访问 Google 网上论坛。

以下是等效的 Python 代码:

from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ["https://www.googleapis.com/auth/admin.directory.group"]
SERVICE_ACCOUNT_FILE = "my-service-account.json"

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE,
        scopes=SCOPES,
        subject="admin@example.com")

admin_service = build("admin", "directory_v1", credentials=credentials)
group = admin_service.groups().list(domain="example.com").execute()
print("groups list: ", group)

Run Code Online (Sandbox Code Playgroud)

现在根据您的问题,如果您想冒充其他用户。然后你可以使用

new_user_email = "user2@example.com"
user2_credentials = credentials.with_subject(new_user_email)
new_service = build("admin", "directory_v1", credentials=user2_credentials)
# use this new_service to call required APIs
Run Code Online (Sandbox Code Playgroud)

以下是使用 python 库的服务帐户进行身份验证的文档的链接:https://google-auth.readthedocs.io/en/latest/reference/google.oauth2.service_account.html

以下是服务帐户的 Oauth 流程通常如何发生的链接:https://github.com/googleapis/google-api-python-client/blob/master/docs/oauth-server.md

我希望这对你有一些帮助。

PS - 这是我在 Stack Overflow 上的第一个答案,所以请告诉我如何改进我的答案。