Java操作Google Sheet时遇AuthenticationException认证错误排查
认证异常的根本原因与解决方案
抛出com.google.gdata.util.AuthenticationException: Error authenticating (check service name)的核心原因是使用的技术栈本身已被Google彻底淘汰,并非代码逻辑书写错误:
- 这套代码基于已在2017年全量下线的GData Sheets API,配套的
setUserCredentials(账号, 密码)认证方法,Google自2015年起就关闭了对普通Gmail账号的支持:- 当前Google账号后台已移除“允许低安全权限应用通过明文密码直接登录”的配置项,就算输入的账号密码完全正确,服务端也会直接拒绝认证请求
- 开启两步验证的Gmail账号,会默认拦截所有基于普通账号密码的第三方登录尝试
- 参考教程发布于2014年,对应的认证规则、API接口现已全部失效,无论怎么调整
SpreadsheetService的配置参数,都无法通过现有认证流程。
更简便的Google Sheet数据写入替代方案
当前Google官方主推Sheets API v4版本,配套服务账号认证模式,无需硬编码用户密码,代码量更少、稳定性更高,实现路径如下:
- 前置准备:
- 在Google Cloud控制台开通Sheets API能力,创建服务账号,下载JSON格式的密钥文件
- 将需要写入数据的Google Sheet文档,添加服务账号邮箱为协作者,并授予编辑权限
- 依赖引入:直接使用官方提供的Sheets Java客户端依赖,无需手动处理老版本的Feed查询、工作表匹配、行对象构建等逻辑
- 核心写入逻辑:
原代码中数十行的查找表格、匹配工作表、构造行数据、插入记录的流程,现在仅需调用客户端自带的追加接口即可完成写入,核心逻辑参考:// 基于服务账号凭证构建Sheets服务实例 Sheets sheetsService = new Sheets.Builder( GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), getCredentialsFromJsonKeyFile() ).setApplicationName("自定义应用名").build(); // 向指定工作表的范围追加写入数据 ValueRange appendBody = new ValueRange() .setValues(Collections.singletonList(Collections.singletonList("Nikhil"))); sheetsService.spreadsheets().values() .append("目标表格ID", "Sheet1!A:A", appendBody) .setValueInputOption("USER_ENTERED") .execute(); - 注意事项:
- 不要再引入GData API的相关依赖,这套接口的后续维护已完全停止
- 必须给服务账号授予对应表格的编辑权限,否则会抛出无权限访问的异常
- 服务账号的密钥文件需做好本地安全存储,不要硬编码到公开代码仓库中
内容的提问来源于stack exchange,提问作者nkhl
相关产品推荐
相关产品推荐

