【问题标题】:Application Default Credentials Not Working in Cloud Function to access Google Workspace API应用程序默认凭据在 Cloud Function 中无法访问 Google Workspace API
【发布时间】:2022-01-19 18:33:28
【问题描述】:

我正在尝试使用使用 Google Cloud Functions 的服务帐号来访问 Workspace Directory API。我正在尝试使用Application Default Credentials 方法。由于文档没有提到要在 Google Cloud Console 端完成的任何其他步骤,我假设该函数的应用程序默认凭据 (ADC) 会自动从 Google Cloud 的元数据服务器传递给云函数。以下代码在我已将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为指向 JSON 凭据文件的本地模拟环境中完美运行。但是,当我将该功能部署到 Google Cloud 时,我收到错误“未授权访问此资源/api”。我一直在寻找和尝试几天没有任何成功。顺便说一句,before I stumbled upon this thread,我正在使用 GoogleAuth 的 getCredentials() 方法来获取 private_key 来创建 JWT 身份验证(用于“主题”属性)并将该身份验证传递给管理 API 调用。这在我的本地环境中再次完美运行,但在云环境中失败,因为 getCredentials() private_key 为空,这可能是预期的行为。任何帮助都深表感谢。我对在 Stackoverflow 中发帖缺乏经验,如果我需要遵循任何其他协议,请告知。

export const listUsers = functions.https.onCall((data, context) => {
  return new Promise(async (resolve, reject) => {
    const envAuth = new GoogleAuth({
      scopes: ["https://www.googleapis.com/auth/admin.directory.user.readonly"],
      clientOptions: {
        subject: "admin@mydomain.com",
      },
    });

    const client = await envAuth.getClient();
    const service = google.admin({version: "directory_v1", auth: client});
    try {
      const response = await service.users.list({
        customer: "MYCUSTOMER_ID",
      });
      resolve(response);
    } catch (err) {
      reject(err);
    }
  });
});

【问题讨论】:

    标签: google-cloud-functions


    【解决方案1】:

    当您在未通过密钥文件(具有允许您模拟/验证为不同用户的密钥的 json 凭证文件)进行身份验证的情况下运行云函数时,该函数将作为项目的默认应用程序凭证运行(@appspot.gserviceaccount.com)。您无需执行任何特殊操作,无需身份验证调用 - 默认情况下,它使用此服务帐户的权限运行。

    当您在本地运行代码时,它会对您在本地拥有的任何密钥文件进行用户身份验证(并在您机器上的“GOOGLE_APPLICATION_CREDENTIALS”环境变量中引用)。

    如果没有关于您的环境的完整安全信息,就很难确定...但是,我猜您正在尝试访问您的个人 Google 帐户具有适当访问权限的资源;但是,您的 Cloud Functions 项目的默认服务帐户没有。

    因此,有几种方法可以解决和/或解决问题:

    • 为您尝试访问的 Workspace 资源授予默认服务帐户访问权限。
    • 使用您已在本地设置的 JSON 密钥文件,让 Cloud Function 以与您在本地运行时相同的用户身份运行。
    • 基本上做一个混合,您创建一个新的服务帐户,该帐户仅具有您想要的权限(而不是使用默认服务帐户或您的个人用户,这两者可能比安全/安保所需的权限要多得多),使用密钥文件在该身份下运行 Cloud Function,并且只向该服务帐户授予所需的权限。

    【讨论】:

    • 您确定在您的工作区资源上授予服务帐户电子邮件吗?
    • 是的,我已将 domain wide delegation as described here 提供给与具有正确范围的服务帐户关联的客户 ID。我相信这就是它目前在当地运作的方式。 @Mike您是否建议我下载密钥文件并存储在存储等中并从那里读取?但是大多数文档都建议不要这样做。感谢您的帮助。
    • 建议进行故障排除。从您的工作本地设置中获得最少的更改。如果使用密钥文件有效,那么您就知道将注意力集中在哪里(服务帐户权限方面的问题)。最好的最终答案可能是选项 3,因此您可以分配所需的最少权限(它的权限可能低于默认项目服务帐户)。但是,在您解决此阻塞问题之前,我会避免这样做。
    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 2019-01-23
    • 2017-07-13
    • 2021-09-11
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多