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

使用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

注意事项:

  1. 替换配置中的<PROJECT_ID>、<POOL_NAME>、<PROVIDER_NAME>和服务账号邮箱为实际值
  2. 目标Google表格需授予服务账号编辑权限,否则会触发权限错误
  3. 确保Workload Identity Provider的属性映射配置正确,需将GitHub的repository或sub属性映射到Google服务账号的关联条件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:09:52