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

如何在AWS CodeBuild中获取临时GitHub OAuth令牌访问私有资源?

问题

我拥有私有GitHub仓库和用于依赖项的私有GitHub NPM注册表,仓库会从私有注册表导入依赖项。在GitHub Actions CI流水线中,GitHub会生成临时令牌,可用于访问该注册表;我在GitHub Actions中通过以下方式为Docker构建配置私有注册表:

RUN npm config set @orgname:registry https://npm.pkg.github.com && \
  echo "//npm.pkg.github.com/:_authToken=${NPM_REGISTRY_TOKEN}" >> $HOME/.npmrc && \
  npm ci

GitHub Actions工作流步骤:

- name: Docker build
        run: docker build --build-arg NPM_REGISTRY_TOKEN=${{ secrets.GITHUB_TOKEN }} .

我希望在AWS CodeBuild中构建相同的Docker镜像,已通过OAuth应用创建GitHub连接并配置构建规范,但无法从该连接获取GitHub OAuth令牌。我不想使用个人访问令牌(PAT),因为它会授予对无关资源的过宽访问权限(仓库和注册表位于GitHub组织中,PAT会访问我的个人GitHub账户)。请问是否可以从CodeBuild环境中获取临时GitHub令牌?

回答

可以通过以下两种方式在CodeBuild中获取临时GitHub令牌,无需使用个人PAT:

1. 利用CodeBuild GitHub连接的内置临时令牌

当你在CodeBuild中配置了GitHub OAuth应用连接后,CodeBuild会自动注入CODEBUILD_GITHUB_TOKEN环境变量——这个令牌是基于连接生成的临时凭证,权限范围仅覆盖连接对应的组织/仓库资源,不会关联你的个人GitHub账户。

直接在构建规范(buildspec.yml)中传递该令牌给Docker构建命令即可:

version: 0.2
phases:
  build:
    commands:
      - docker build --build-arg NPM_REGISTRY_TOKEN=$CODEBUILD_GITHUB_TOKEN .

注意:需确保你的GitHub OAuth应用已配置足够权限,至少包含read:packages(访问私有NPM注册表)和repo(拉取私有仓库代码)权限。

2. 使用GitHub App生成精准权限的临时令牌(更推荐)

如果OAuth连接的权限无法满足需求,可创建GitHub App并安装到组织中,生成权限更精准的临时令牌:

  1. 在GitHub组织中创建GitHub App,配置所需权限:
    • 私有NPM注册表:勾选Packages下的Read权限
    • 私有仓库:勾选Contents下的Read权限
  2. 将GitHub App的私钥存储到AWS Secrets Manager中
  3. 在CodeBuild构建规范中添加步骤,用私钥生成临时令牌:
# 配置GitHub App参数
APP_ID="你的GitHub App ID"
INSTALLATION_ID="你的App安装ID"
# 从Secrets Manager读取私钥
PRIVATE_KEY=$(aws secretsmanager get-secret-value --secret-id "github-app-private-key" --query SecretString --output text)

# 生成JWT令牌
JWT=$(node -e "
const jwt = require('jsonwebtoken');
const privateKey = \`$PRIVATE_KEY\`;
const payload = {
  iat: Math.floor(Date.now() / 1000) - 60,
  exp: Math.floor(Date.now() / 1000) + (10 * 60),
  iss: $APP_ID
};
console.log(jwt.sign(payload, privateKey, { algorithm: 'RS256' }));
")

# 获取临时访问令牌
TOKEN=$(curl -X POST \
  -H "Authorization: Bearer $JWT" \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/app/installations/$INSTALLATION_ID/access_tokens | jq -r '.token')

# 传递令牌给Docker构建
docker build --build-arg NPM_REGISTRY_TOKEN=$TOKEN .

这种方式的优势是权限可精确控制,仅授予访问必要资源的权限,且令牌为临时有效,过期后自动失效,安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:45:19