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

ShinyApp公开部署后Google Sheets认证失败求助

解决ShinyApp部署到shinyapp.io后Google Sheets认证失败问题

问题重现

本地运行正常的ShinyApp,部署到shinyapp.io后调用gs4_auth()时出现报错:

Error in gs4_auth("client_secret_mysecret.apps.googleusercontent.com.json") :
Can't get Google credentials.

以下是针对性的排查和解决步骤:


1. 确认JSON文件的存在性与路径正确性

  • 检查代码中json_path的文件名是否和实际上传的JSON文件完全一致(比如你代码里写的my-json-fil.json可能是笔误,应为my-json-file.json)。
  • 部署shinyapp.io时,必须确保JSON文件和你的Shiny代码文件(app.R/ui.R/server.R)在同一目录,并且部署过程中勾选了该文件,没有被遗漏。

2. 验证Google服务账号的Sheet权限

  • 打开目标Google Sheet,点击右上角「共享」,输入服务账号的邮箱(可在JSON文件的client_email字段找到),并赋予编辑者权限(因为你的App需要写入数据)。
  • 确认服务账号邮箱已被添加到Sheet的共享列表中,权限设置正确。

3. 改用环境变量存储服务账号凭证(推荐方案)

直接上传JSON文件到shinyapp.io存在安全风险,且容易因文件权限问题读取失败,建议用环境变量替代:

  1. 打开你的服务账号JSON文件,复制全部内容。
  2. 登录shinyapp.io,进入你的App页面,点击「Settings」→「Environment」,添加一个新的环境变量(比如命名为GOOGLE_SERVICE_JSON),将复制的JSON内容粘贴到值的输入框中。
  3. 修改认证代码如下:
# 替换原有的gs4_auth调用
tmp_json <- tempfile(fileext = ".json")
writeLines(Sys.getenv("GOOGLE_SERVICE_JSON"), tmp_json)
gs4_auth(path = tmp_json, cache = FALSE, scopes = "https://www.googleapis.com/auth/spreadsheets")
file.remove(tmp_json) # 清理临时文件

4. 明确指定权限范围并禁用缓存

在gs4_auth中明确指定所需的权限范围,避免默认范围不足:

gs4_auth(
  path = json_path, 
  cache = FALSE,
  scopes = "https://www.googleapis.com/auth/spreadsheets" # 读写Sheet所需的完整权限
)

5. 同步本地与shinyapp.io的包版本

本地和服务器上的googlesheets4、gargle包版本差异可能导致认证逻辑不一致:

  • 在本地运行renv::snapshot()生成包依赖的lockfile,部署时将renv.lock文件一并上传。
  • 或者在DESCRIPTION文件中指定包的最低版本:
Imports:
  shiny,
  googlesheets4 (>= 1.1.1),
  gargle (>= 1.5.2),
  dplyr

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:03:18