使用默认服务帐户时身份验证范围不足
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 云范围:
我从 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 云范围: