使用 python 从 Google Cloud 函数中的附加服务帐户获取 google.oauth2 凭据

问题描述 投票:0回答:1

我正在编写一个谷歌云功能,我想使用

google.oauth2.service_account.with_subject()
功能来模拟用户访问他们的 gmail 收件箱,但我无法找到一种方法来使用附加的服务帐户来获取 oauth2 凭据来运行它.

文档中推荐使用

google.auth.default()
函数获取凭证,但是这些凭证不能用于运行
google.oauth2.service_account.with_subject()
函数。我能想到的最佳解决方法是使用 oauth2 凭据获取服务帐户 json 密钥文件并使用机密/环境变量将其加载到函数中。这看起来很混乱,尤其是当
google.auth.default()
展示了如何在一个班轮中完成如此相似的事情时。

考虑到我在尝试做的事情上发现的很少,这让我觉得我在处理这个问题,所以我很感激任何以不同方式处理这个问题的建议。

在我写这篇文章时,我被推荐了一个单个帖子和讨论谈论这个。他们似乎采用了与我相同的解决方法,但也许有更好的解决方法(该帖子也没有回答我的问题,因为我正在专门寻找一种方法来从附加的服务帐户获取 oauth2 凭证到 Cloud Function ,不只是加载任何凭据)。

服务帐户已被授予域范围授权,并且用户帐户是同一域的一部分。此外,该函数已成功调用并运行,并附加了服务帐户。唯一正在使用的 api 是 gmail API,特别是已授予服务帐户并传递给代码中的凭证对象的“https://www.googleapis.com/auth/gmail.readonly”范围.

这是我拥有的代码模型/我想要它做什么。

@functions_framework.cloud_event
def process_message(cloud_event):
  """Entrypoint for Google Cloud Function."""

  SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

  # Loading the service account credentials using google.auth
  # Ideally would be google.oauth2.default(scopes=SCOPES), but that doesn't exist
  credentials, _ = google.auth.default(scopes=SCOPES)
  
  # DOES NOT WORK since this function doesn't exist for google.auth
  # and requires google.oauth2 credentials
  delegated_credentials = credentials.with_subject(user_email)

  # Fetch inbox of gmail user in our domain
  service = build('gmail', 'v1', credentials=delegated_credentials)
  results = service.users().messages().list(userId='me').execute()

  return results
python google-cloud-functions google-oauth gmail-api service-accounts
1个回答
0
投票

您正在创建错误类型(类)的凭据对象。相反,您必须使用

service_account
类。

from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE_PATH,
        scopes=SCOPES)

delegated_credentials = credentials.with_subject(user_email)
© www.soinside.com 2019 - 2024. All rights reserved.