You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用短期访问令牌通过服务账号访问GCP镜像仓库失败排查

问题描述

尝试通过服务账号 impersonation 生成短期访问令牌,供已认证客户端登录Google Artifact Registry拉取Docker镜像,但执行过程中报错:

GaxiosError: unable to impersonate: Error: invalid_scope: Invalid OAuth scope or ID token audience provided.

后端JS/TS代码逻辑:

const auth = new GoogleAuth({
    credentials: {
      project_id: SERVICE_ACCOUNT.project_id,
      client_email: SERVICE_ACCOUNT.client_email,
      private_key: SERVICE_ACCOUNT.private_key,
    },
  });
const client = await auth.getClient();
const targetClient = new Impersonated({
    sourceClient: client,
    targetPrincipal: OTHER_SERVICE_ACCOUNT.client_email,
    targetScopes: ['https://www.googleapis.com/auth/cloud-platform'],
});
const token = await targetClient.getAccessToken();

Docker登录命令:

docker login europe-north1-docker.pkg.dev -u oauth2accesstoken --password-stdin

问题分析与解决

1. 源服务账号缺少核心权限

即使源账号拥有Editor角色,也默认不具备**服务账号令牌创建(roles/iam.serviceAccountTokenCreator)**权限,这是完成服务账号 impersonation 的必要条件。

  • 操作步骤:
    • 进入Google Cloud控制台IAM页面
    • 定位到源服务账号(SERVICE_ACCOUNT.client_email)
    • 为其添加roles/iam.serviceAccountTokenCreator角色,作用范围选择目标服务账号(OTHER_SERVICE_ACCOUNT.client_email)或所在项目

2. 优化OAuth Scope(可选)

虽然https://www.googleapis.com/auth/cloud-platform是有效范围,但针对Docker镜像只读场景,建议使用更精细化的Scope,遵循最小权限原则:

targetScopes: ['https://www.googleapis.com/auth/devstorage.read_only']

此Scope仅授予云存储只读权限,完全满足Artifact Registry镜像拉取需求。

3. 验证令牌与完成登录

生成令牌后,先通过curl验证有效性:

# 替换$TOKEN、$PROJECT_ID、$REPO_NAME为实际值
curl -H "Authorization: Bearer $TOKEN" https://europe-north1-docker.pkg.dev/v2/$PROJECT_ID/$REPO_NAME/tags/list

验证通过后,执行完整Docker登录命令(需将令牌传入标准输入):

echo "$TOKEN" | docker login europe-north1-docker.pkg.dev -u oauth2accesstoken --password-stdin

内容的提问来源于stack exchange,提问作者Herlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:33:19