使用GitHub Actions通过Google Workload Identity Federation认证获取Python脚本凭证
解决GitHub Actions通过Workload Identity Federation调用Google Sheets API的认证问题
问题背景
需定时运行Python脚本调用Google API向电子表格追加数据,采用Google推荐的Workload Identity Federation认证,但遇到以下问题:
- 403权限拒绝错误,提示
Permission 'iam.serviceAccounts.getAccessToken' denied - 凭证格式错误
官方文档混乱、现有教程过时,无法正常完成认证流程。
关键解决步骤
- 为Workload Identity Federation的提供商配置正确的属性映射,确保Google能识别关联的服务账号
- 认证时使用
google-auth库的identity_pool.Credentials类,而非service_account类,避免凭证格式不兼容问题
代码实现
Python脚本(向Google表格追加数据)
#!/usr/bin/env python import json import os from googleapiclient.discovery import build from googleapiclient.errors import HttpError from google.auth.identity_pool import Credentials # 注意:追加数据需使用可写权限Scope,原readonly无法完成写入操作 SCOPES = ["https://www.googleapis.com/auth/spreadsheets"] SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID' # 替换为你的目标表格ID RANGE = 'YOUR_RANGE' # 替换为数据追加范围,例如Sheet1!A:B # 从环境变量读取凭证信息 with open(os.environ["GOOGLE_APPLICATION_CREDENTIALS"]) as f: key = json.load(f) def append_to_spreadsheet(values, value_input_option="USER_ENTERED"): # 使用Identity Pool凭证初始化认证 credentials = Credentials.from_info(key) append_body = { "values": values, "majorDimension": "ROWS", } try: service = build("sheets", "v4", credentials=credentials) # 调用Sheets API完成数据追加 service.spreadsheets().values().append( spreadsheetId=SPREADSHEET_ID, range=RANGE, body=append_body, valueInputOption=value_input_option, insertDataOption="INSERT_ROWS" ).execute() print("数据追加成功") except HttpError as error: print(f"API调用错误: {error}") # 测试数据追加 append_to_spreadsheet([['测试值1', '测试值2']])
GitHub Actions 工作流配置
name: 定时追加数据到Google表格 # 配置触发规则:手动触发 + 每天UTC凌晨1点运行(对应北京时间9点) on: workflow_dispatch: schedule: - cron: '0 1 * * *' jobs: run-script: permissions: contents: 'read' id-token: 'write' # 必须开启此权限以获取ID Token完成认证 runs-on: ubuntu-latest steps: - name: 拉取仓库代码 uses: actions/checkout@v4 - name: 认证到Google Cloud id: auth uses: google-github-actions/auth@v2 with: workload_identity_provider: "projects/<PROJECT_ID>/locations/global/workloadIdentityPools/<POOL_NAME>/providers/<PROVIDER_NAME>" service_account: "<你的服务账号邮箱>" token_format: 'access_token' # 生成符合Identity Pool要求的凭证格式 - name: 配置Python环境 uses: actions/setup-python@v5 with: python-version: '3.11' - name: 安装依赖包 run: | python -m pip install --upgrade pip pip install google-api-python-client google-auth - name: 运行脚本追加数据 run: python google.py
注意事项:
- 替换配置中的
<PROJECT_ID>、<POOL_NAME>、<PROVIDER_NAME>和服务账号邮箱为实际值- 目标Google表格需授予服务账号编辑权限,否则会触发权限错误
- 确保Workload Identity Provider的属性映射配置正确,需将GitHub的
repository或sub属性映射到Google服务账号的关联条件
内容的提问来源于stack exchange,提问作者Dominic Dabrowiecki
相关产品推荐
相关产品推荐

