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

无需服务账号和密钥能否使用gspread?遇JWT签名错误求助

无需服务账号/密钥使用gspread编辑公开表格的可行性及报错解决

核心结论

可以无需单独创建服务账号或密钥来编辑公开电子表格,但你用的google.auth.default()默认认证方式并非完全无凭据——它依赖Google应用默认凭据(ADC),比如本地用户登录凭据或GCP环境内置凭据。

为什么之前的代码能运行?

google.auth.default()会自动查找环境中的有效凭据:

  • 如果你本地运行过gcloud auth application-default login,它会存储你的用户账号凭据;
  • 如果在GCP云函数/VM等托管环境,会自动使用服务账号凭据(无需你手动配置密钥)。
    这些凭据当时拥有访问目标公开表格的权限,所以代码能正常执行。

报错invalid_grant: Invalid JWT Signature的原因

这个错误通常是因为:

  • 本地存储的应用默认凭据过期失效;
  • 凭据对应的Google账号权限被调整(比如撤销了表格访问权);
  • 凭据文件损坏导致签名验证失败。

解决方案

  1. 刷新应用默认凭据
    在本地终端执行以下命令,重新登录你的Google账号获取有效凭据:

    gcloud auth application-default login
    

    登录完成后,你的代码会自动使用新的有效凭据,无需修改代码逻辑。

  2. 确认表格权限设置
    确保目标公开表格的权限是**「任何有链接的人都可以编辑」**,而不是仅查看。如果是只读权限,即使有凭据也无法执行编辑操作。

  3. 关于「完全无凭据」的补充
    纯API密钥只能用于只读访问公开资源,无法支持编辑操作。所以编辑公开表格必须依赖用户级凭据(通过上述gcloud命令获取)或服务账号凭据,无法完全脱离任何凭据。

验证代码(调整后更规范)

import gspread
from google.auth import default

def get_gspread() -> gspread.client.Client:
    credentials, _ = default(scopes=['https://www.googleapis.com/auth/spreadsheets'])
    return gspread.authorize(credentials)

def get_worksheet(gs, url) -> gspread.Worksheet:
    return gs.open_by_url(url).sheet1  # sheet1等价于获取第一个工作表

public_URL = "你的公开表格URL"
gs = get_gspread()
ws = get_worksheet(gs, public_URL)

# 测试编辑:写入A1单元格
ws.update('A1', '测试编辑内容')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:56:05