使用默认服务帐户时身份验证范围不足

Insufficient authentication scopes when using default Service Account

我从 google 工作区 API 检索数据。我使用来自 Dataproc 集群的服务帐户向那些 API 进行身份验证。

我有两种方法来使用我的服务帐户进行身份验证。我要么使用 JSON 密钥文件通过我的 SA SA-with-keyfile 进行身份验证,要么使用我的 Dataproc 集群的默认 SA:SA-default.

两个 SA 都有权访问数据,我为他们提供了相同的范围。这是生成 Google 凭据的代码示例:

import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ServiceAccountCredentials;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Generate GoogleCredentials from config (minimal code example)
 */
public class ServiceAccountUtil {

    // Generate GoogleCredentials from a Service Account JSON key file
    public static GoogleCredentials getCredentialsWithKey(String scopes, String privateKeyJson) throws IOException {
        ServiceAccountCredentials serviceAccountCredentials;

        try (InputStream stream = new ByteArrayInputStream(privateKeyJson.getBytes())) {
            serviceAccountCredentials = ServiceAccountCredentials.fromStream(stream);
        }

        return serviceAccountCredentials.createScoped(scopes.split(" "));
    }

    // Generate GoogleCredentials using the default Service Account
    public static GoogleCredentials getCredentialsDefault(String scopes) throws IOException {
        return ServiceAccountCredentials.getApplicationDefault().createScoped(scopes.split(" "));
    }
}

使用 SA SA-with-keyfile 时,everythink 工作正常,我检索了我的数据。

但是,当使用 SA-default 时,API 的回答是:

{
  "error": {
    "code": 403,
    "message": "Request had insufficient authentication scopes.",
    "errors": [
      {
        "message": "Insufficient Permission",
        "domain": "global",
        "reason": "insufficientPermissions"
      }
    ],
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT",
        "domain": "googleapis.com",
        "metadata": {
          "service": "admin.googleapis.com",
          "method": "ccc.hosted.frontend.directory.v1.DirectoryGroups.List"
        }
      }
    ]
  }
}

我不明白为什么我在一种情况下(没有 JSON 密钥文件的 SA)会收到此错误,因为我在这两种情况下使用相同的范围。

创建集群时,您使用计算引擎默认服务帐户。当您在 VM 上使用计算引擎默认服务帐户时,默认情况下您的范围有限。如果您使用自定义服务帐户或其他服务帐户,则该限制范围不适用。 (这解释了为什么它不适用于默认服务帐户,但适用于您的服务帐户密钥文件)

在 Dataproc 上,您可以在集群运行期间的安全部分允许集群上的所有 Google 云范围: