我正在编写一个谷歌云功能,我想使用
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
您正在创建错误类型(类)的凭据对象。相反,您必须使用
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)