如何在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并安装到组织中,生成权限更精准的临时令牌:
- 在GitHub组织中创建GitHub App,配置所需权限:
- 私有NPM注册表:勾选
Packages下的Read权限 - 私有仓库:勾选
Contents下的Read权限
- 私有NPM注册表:勾选
- 将GitHub App的私钥存储到AWS Secrets Manager中
- 在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

